1、1摘要: 在交通发展迅速的今天,出租车是我们交通中不可缺少的工具。同时出租车中的计价器是必不可少的一种设备。出租车计价器系统设计的主要内容是通过 C51 单片机上的数码显示器来模拟出租车计价器的路程显示表,通过单片机上的键盘上的某些键来表示开始、暂停、复位等功能。步骤如下:首先,程序开始做一些必要的初始化工作,等待键盘输入。然后,启动键按下(0)后 LED 数码管开始记录路程并显示。最后,当需要停止是可按相应的键(F)对路程计数器进行暂停。而且还可以复位(E) 。关键词: C51 单片机;8255;计价器; LED 数码管21 设计内容及要求1.1 设计内容及要求(1)出租车里程测量:采用信号
2、源产生脉冲模拟出租车计价传感器产生脉冲,设每产生 100 个脉冲出租车行驶 1 公里信号源脉冲频率=1KHZ;(2)里程显示为:*.*公里;(3)采用 8255 芯片管理键盘显示。1.2 框图根据设计内容及要求,设计框图如图 1 所示。图 1 设计框图2 系统组成及工作原理2.1 控制单元设计按键名称,O 键表示开始计算路程;F 键表示暂停;E 键表示复位。当程序开始运行后,按下 0 键则表示开始计算路程,并由数码管显示出来;按下 F 键则路程记数器暂停,并显示当前路程,当按下 E 键则复位。2.2 输出单元设计通过六个 8 段 LED 数码管来显示路程。前四个分别表示千位、百位、十位、个位,
3、而后两个表示十分位和百分位。2.3 定时器的功能和使用方法首先选择方式 1为 16 位的定时器,其初始化具体如下:s)(*162aTfosc其中 fosc 为晶振频率,定时时间 。2)0(THL3 电路方案设计信号源 变换电路 显示器单片机33.1 电路设计方案使用单片机来完成设计要求。电路包括显示电路,设置电路,存储电路,复位电路,其工作原理图如图2所示,单片机功能强大,用较少的硬件和适当的软件相互配合可以很容易的实现设计要求,且灵活性强,可以通过软件编程来完成更多的附加功能。针对计费模式的切换,通过软件编程就可以轻容易的实现。避免了机械开关带来的不稳定因素,单片机单元框图如图3所示。单片机
4、图 2 工作原理框图图 3 单片机单元框图3.2单元电路设计CPU 数码管显示功能按键时钟电路8255 并行编程显示电路路程显示设置电路系统复位存储电路系统开始系统暂停43.2.1 复位电路设计在单片机的应用系统中,除单片机本身需复位以外,外部扩展的 I/O接口电路等也需要复位,因此需要一个系统的同步复位信号:即单片机复位后,CPU 开始工作时,外部的电路一定要复位好,以保证 CPU 有效的对外部电路进行初始化编程。51 系列单片机的复位端 RST 是一个施密特触发输入,高电平有效。复位电路产生的复位信号经施密特电路整形后作为系统复位信号,加到 51 系列单片机和外部 I/O 接口电路的复位端
5、.其电路图如图 4 所示,其中 R1=47K,R2=100,C=10uF。1 2 3 4 5 6ABCD654321DCBATitleNumber RevisionSizeBDate: 1-Oct-2007 Sheet of File: F:不不不不不PREVIO1.DDB Drawn By:EA/VP31X119X218RESET9RD17WR16INT012INT113T014T115P101P112P123P134P145P156P167P178P00 39P01 38P02 37P03 36P04 35P05 34P06 33P07 32P20 21P21 22P22 23P23 24
6、P24 25P25 26P26 27P27 28PSEN 29ALE/P 30TXD 11RXD 1089C51C310ufR210KS1SW-PB1 2A74LS14R110K+5图 4 复位电路3.2.2 时钟电路设计89C51 系列单片机内部有一个可控制的反相放大器,引脚XTAL1、XTAL2 为反相放大器的输入端和输出端,在 XTAL1、XTAL2 上外接晶振(或陶瓷谐振器)和电容便组成振荡器。具体的时钟电路如图 5 所示。电容 1、2 的典型值为 30pF+10pF(晶振)或 40pF+10pF(陶瓷谐振器)。振荡器频率主要取决与晶振(或陶瓷谐振器)的频率,但必须小于器件5所允许的最
7、高频率。振荡器的工作受控制,复位后0(1)振荡器工作,可由软件置1 ,使振荡器停止振荡,从而使整个单片机停止工作,以达到节电的目的。图 3.2 时钟电路图 5 时钟电路3.2.3 单片机最小系统主控机系统采用了 Atmel 公司生产的 89C51 单片机,它含有 128 字节数据存储器,内置 4K 的电可擦除 FLASH ROM,可重复编程,大小满足主控机软件系统设计,所以不必再扩展程序存储器。复位电路和晶振电路是 89C51 工作所需的最简外围电路。89C51 的复位端是一个史密特触发输入,高电平有效,而系统中的时钟接口和 CAN 总线接口的复位信号都是低电平有效。在复位电路中,按一下复位开
8、关就使在 RS 端出现一段时间的高电平,经过 74LS14 的一次反相整形,提供给单片机复位端。再经过一次反相整形,通过 I/ORST 端提供给外部接口电路。外接 12M 晶振和两个 20P 电容组成系统的内部时钟电路。3.3 8255A 键盘显示电路设计8255 的数据线片选信号线、地址线、读写控制线等分别与系统总线1 2 3 4 5 6ABCD654321DCBATitleNumber RevisionSizeBDate: 6-Oct-2007 Sheet of File: F:不不不不不ronghao.ddb Drawn By:EA/VP31X119X218RESET9RD17WR16I
9、NT012INT113T014T115P101P112P123P134P145P156P167P178P00 39P01 38P02 37P03 36P04 35P05 34P06 33P07 32P20 21P21 22P22 23P23 24P24 25P25 26P26 27P27 28PSEN 29ALE/P 30TXD 11RXD 10U1AT89C5124MCRYSTAL30PFCAP30PFCAPGND6相连,其 A、B、C 三个端口以排针形式引出,供 8255 实验使用,如图 6所示。XD012XD3D01343245XD6130298277 2D345D67XIORIWA0X
10、1RESTIOY359368356RDWA01RESTCPA01P2A3P45PA67431039837PB01P2B3P45PB67PC01PC23PC45PC6782518902324514561731210系统总线图 6 系统中的 8255 线路4 程序设计4.1主程序模块在主程序模块中,需要完成对各接口芯片的初始化、中断向量的设计以及开中断、循环等待等工作。另外,在主程序模块中还需要设置启动/清除标志寄存器、里程寄存器,并对它们进行初始化。然后,主程序将根据各标志寄存器的内容,分别完成启动、清除、计程等不同的操作。4.2定时中断服务程序在定时中断服务程序中,每 1ms 产生一次中断,当
11、产生 1000 次中断的时候,也就到了一秒,送数据到相应的显示缓冲单元,并调用显示子程序实时显示。里程计数程序流程图如图 7 所示。7图 7 里程计数程序流程图5 总结 5.1 结论通过用单片机来模拟出租车计价器, 并且使用了单片机上的键盘和数码显示管来模拟。硬件各方面相对吻合安全性高、耦合度高,能够对键盘上的 0 键进行启动、F 键进行停止、E 键进行复位的操作。程序首先进行初始化设置(包括数码管、字型表、定时中断设置) ;然后对键盘进行扫描,判断是否有功能键被按下;最后根据哪个功能键被按下,执行相应的程序以实现功能。开始显示千位进入中断接受键盘按“O”按“F”按“E”P1 为 0P10 为
12、 0P100 为0P1000 为0P10000 为0P100000 为 0循环显示复位显示十分位Run 程序显示个位显示十位显示百分位显示百位等待Y YY Y Y Y Y Y Y N YN YN YN YN YN YN YN YN Y85.2 课程设计体会经过两周有关于通过模拟出租车计价器的课程设计,使同学们对单片机的应用有了更深的了解。在课程设计的过程中,还是碰到了许多的问题。比如,对于单片机的一些基本代码及程序还有一些不清楚的地方;对于代码的前后顺序及调用掌握的还不够好。通过请教老师和同学,最终把问题解决了。此外,去图书馆和网上查相关资料也是一种学习的途径。通过这次课程设计,我们充分体会到
13、了自己设计东西的乐趣和学习交流的重要性,在动手的过程中,不但增强了实践能力,而且在理论上有了更深的认识;懂得了实践与知识结合的重要性,并在以后的学习中不段的提高自己,通过不断的摸索和实践来弥补自己在硬件方面的差距。我相信,这次实习将使我受益匪浅,我更相信,我会以更热忱的态度去学习并研究这门重要的实践性课程。 9附录ORG 0000HSJMP START ;定义程序起始位置ORG 000BHSJMP DS0 ;定时器 T0 入口地址START:CLR TR0 ;关闭 T0 中断MOV A,#81H ;将立即数 81H 放入 A 中MOV DPTR,#0FF23H ;定义 DPTR 外部数据指针为
14、 0FF23H,指向 8255的控制字口MOVX DPTR,A ;把 81H 放入 8255 控制字口,让 8255 以PA、PB 口 0 状态输出工作,PC 口 0 状态输入MOV TMOD,#01H ;定义 T0 为 16 位计数器MOV TH0,#0FCH ;定义中断延时MOV TL0,#24H ;定义中断延时;1MS = 1000US ,假设晶振频率为 12MHZ,延时常数=(2 的 16 次方 - 1000)将其转换到 16 进制MOV IE,#82H ;定义中断允许控制字,开 CPU 中断,开 T0 中断MOV 71H,#00H ;MOV 72H,#00HMOV 73H,#00HM
15、OV 74H,#00HMOV 75H,#00HMOV 76H,#00HMOV 40H,#50 ;延时用MOV 00H,#00H ;标志MOV 01H,#00HMOV 02H,#00HMOV 03H,#00HMOV 04H,#00HMOV R1,#00H ;用来检测键盘开始键MOV R3,#00H ;用来检测停止键MOV R4,#00H ;用来监听复位键10MOV 50H,#10 ;循环次数MOV 51H,#10 ;循环次数MOV 52H,#10MOV 53H,#10MOV 54H,#10MOV 55H,#10SETB TR0 ;允许 T0 计数CLR C ;清空 CYSJMP $ ;等待中断来
16、临DS0: ;中断处理子程序MOV TH0,#0FCH ;把中断延时还给 T0MOV TL0,#24HLCALL KEY_STATE ;调用键盘扫描子程序,获取当前的键盘状态,1MS 扫描一次CJNE R1,#0,RUN ;如果“0”被按下,就跳转到运行子程序,计算里程数CJNE R3,#0,STOP ;如果“F”被按下,就跳转到停止子程序CJNE R4,#0,RESET ;如果“E”被按下,就跳转到复位子程序RETI ;如果 3 个键都没有被按下,不做处理,直接返回中断,等待下一次中断来临RESET: ;复位的子程序MOV 71H,#00H ;初始化查表单元数据MOV 72H,#00HMOV
17、 73H,#00HMOV 74H,#00HMOV 75H,#00HMOV 76H,#00HMOV 51H,#10 ;初始化循环次数MOV 52H,#10MOV 53H,#10MOV 54H,#10MOV 55H,#10LJMP XIANSHI ;跳转到显示子程序RETI ;返回中断STOP: ;停止子程序LJMP XIANSHI ;跳转到显示子程序11KEY_STATE: ;键盘行扫描处理子程序KEY_0: ;检查 0MOV R2,#0FDH ;定义 8255 对第 2 个 LED 数码管进行键盘扫描MOV DPTR,#0FF20HMOV A,R2MOVX DPTR,AMOV DPTR,#0F
18、F22H ;将 DPTR 指向 8255 的 PC 口MOVX A,DPTR ;从 PC 口获取键盘状态JB ACC.1,KEY_F ;判断第 1 列是否为 0,如果为 0,证明 0 被按下SJMP KEY_DOWN0 ;按下了就跳转到 0 被按下的子程序RETI ;返回中断KEY_F: ;检查 FMOV R2,#0F7HMOV DPTR,#0FF20HMOV A,R2MOVX DPTR,AMOV DPTR,#0FF22HMOVX A,DPTRJB ACC.1,KEY_ESJMP KEY_DOWNFRETIKEY_E: ;检查 EMOV R2,#0DFHMOV DPTR,#0FF20HMOV
19、A,R2MOVX DPTR,AMOV DPTR,#0FF22HMOVX A,DPTRJB ACC.1,RETURN2SJMP KEY_DOWNERETURN2: ;返回中断RETIKEY_DOWN0: ;0 被按下MOV R1,#1 ;把标志 R1 设置为 1MOV R3,#0 ;其他标志设置为 0MOV R4,#012RETI ;返回中断KEY_DOWNF: ;F 被按下MOV R3,#1 ;把 R3 设置为 1MOV R1,#0 ;其他标志设置为 0MOV R4,#0RETI ;返回中断KEY_DOWNE: ;E 被按下MOV R4,#1 ;把 R4 设置为 1MOV R3,#0 ;其他标
20、志设置为 0MOV R1,#0RETI ;返回中断RUN: ;运行子程序DJNZ 40H,XIANSHI ;延时显示MOV 40H,#50INC 71H ;百分位查表单元+1DJNZ 50H,XIANSHI ;循环 10 次MOV 50H,#10 ;如果百分位循环了 10 次,那么十分位上应该得到进位INC 72H ;十分位查表单元+1MOV 71H,#00HDJNZ 51H,XIANSHIMOV 51H,#10INC 73HMOV 71H,#00HMOV 72H,#00HDJNZ 52H,XIANSHIMOV 52H,#10INC 74HMOV 71H,#00HMOV 72H,#00HMOV
21、 73H,#00HDJNZ 53H,XIANSHIMOV 53H,#10INC 75HMOV 71H,#00HMOV 72H,#00H13MOV 73H,#00HMOV 74H,#00HDJNZ 54H,XIANSHIMOV 54H,#10INC 76HMOV 71H,#00HMOV 72H,#00HMOV 73H,#00HMOV 74H,#00HMOV 75H,#00HDJNZ 55H,XIANSHIAJMP STARTXIANSHI: ;显示百分位JB 00H,P10 ;作为标志判断当前应该去显示哪个数码管JB 01H,P100JB 02H,P1000JB 03H,P10000JB 04H
22、,P100000MOV DPTR,#0FF20H ;定义显示最右边的数码管MOV A,#0FEHMOVX DPTR,AMOV A,71H ;把百分位查表单元的数据送到 A 中MOV DPTR,#TAB1 ;查表MOVC A,A+DPTR ;把字型码送到 8255 的 PB 口MOV DPTR,#0FF21HMOVX DPTR,ACPL 00H ;取反标志,能够让数码管循环点亮CPL 01HCPL 02HCPL 03HCPL 04HLJMP RETURN ;返回中断P10: ;显示十分位MOV DPTR,#0FF20HMOV A,#0FDHMOVX DPTR,A14MOV A,72HMOV DP
23、TR,#TAB1MOVC A,A+DPTRMOV DPTR,#0FF21HMOVX DPTR,ACPL 00HLJMP RETURNP100: ;显示个位MOV DPTR,#0FF20HMOV A,#0FBHMOVX DPTR,AMOV A,73HMOV DPTR,#TAB1MOVC A,A+DPTRMOV DPTR,#0FF21HMOVX DPTR,ACPL 01HLJMP RETURNP1000: ;显示十位MOV DPTR,#0FF20HMOV A,#0F7HMOVX DPTR,AMOV A,74HMOV DPTR,#TAB1MOVC A,A+DPTRMOV DPTR,#0FF21HMO
24、VX DPTR,ACPL 02HLJMP RETURNP10000: ;显示百位MOV DPTR,#0FF20HMOV A,#0EFHMOVX DPTR,AMOV A,75HMOV DPTR,#TAB1MOVC A,A+DPTRMOV DPTR,#0FF21H15MOVX DPTR,ACPL 03HLJMP RETURNP100000: ;显示千位MOV DPTR,#0FF20HMOV A,#0DFHMOVX DPTR,AMOV A,76HMOV DPTR,#TAB1MOVC A,A+DPTRMOV DPTR,#0FF21HMOVX DPTR,ACPL 04HLJMP RETURNRETURN:RETI ;返回中断TAB1:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H; 0,1,2,3,4,5,6,7,8,9END16参考文献1 吴开志 等.单片机技术指导.南昌航空出版社,2007.82 张友德 赵志英 涂时亮 .单片微型机原理、应用与实验 .复旦大学出版社,2006.63 孙涵芳.MCS-51 系列单片机原理及应用.北京航空航天大学出版社,1996.4