1摘要:在交通发展迅速的今天,出租车是我们交通中不可缺少的工具。同时出租车中的计价器是必不可少的一种设备。出租车计价器系统设计的主要内容是通过C51单片机上的数码显示器来模拟出租车计价器的路程显示表,通过单片机上的键盘上的某些键来表示开始、暂停、复位等功能。步骤如下:首先,程序开始做一些必要的初始化工作,等待键盘输入。然后,启动键按下(0)后LED数码管开始记录路程并显示。最后,当需要停止是可按相应的键(F)对路程计数器进行暂停。而且还可以复位(E)。关键词:C51单片机;8255;计价器;LED数码管21设计内容及要求1.1设计内容及要求(1)出租车里程测量:采用信号源产生脉冲模拟出租车计价传感器产生脉冲,设每产生100个脉冲出租车行驶1公里信号源脉冲频率〈=1KHZ;(2)里程显示为:***.***公里;(3)采用8255芯片管理键盘显示。1.2框图根据设计内容及要求,设计框图如图1所示。图1设计框图2系统组成及工作原理2.1控制单元设计按键名称,O键表示开始计算路程;F键表示暂停;E键表示复位。当程序开始运行后,按下0键则表示开始计算路程,并由数码管显示出来;按下F键则路程记数器暂停,并显示当前路程,当按下E键则复位。2.2输出单元设计通过六个8段LED数码管来显示路程。前四个分别表示千位、百位、十位、个位,而后两个表示十分位和百分位。2.3定时器的功能和使用方法首先选择方式1——为16位的定时器,其初始化具体如下:)(*21612aTfoscs其中fosc为晶振频率,定时时间a22)0((TH0)TL。3电路方案设计3.1电路设计方案使用单片机来完成设计要求。电路包括显示电路,设置电路,存储电路,复位电路,其工作原理图如图2所示,单片机功能强大,用较少的硬件信号源变换电路显示器单片机3和适当的软件相互配合可以很容易的实现设计要求,且灵活性强,可以通过软件编程来完成更多的附加功能。针对计费模式的切换,通过软件编程就可以轻容易的实现。避免了机械开关带来的不稳定因素,单片机单元框图如图3所示。单片机图2工作原理框图图3单片机单元框图3.2单元电路设计3.2.1复位电路设计在单片机的应用系统中,除单片机本身需复位以外,外部扩展的I/O接口电路等也需要复位,因此需要一个系统的同步复位信号:即单片机复位后,CPU开始工作时,外部的电路一定要复位好,以保证CPU有效的对CPU数码管显示功能按键时钟电路8255并行编程显示电路路程显示设置电路系统复位存储电路系统开始系统暂停4外部电路进行初始化编程。51系列单片机的复位端RST是一个施密特触发输入,高电平有效。复位电路产生的复位信号经施密特电路整形后作为系统复位信号,加到51系列单片机和外部I/O接口电路的复位端.其电路图如图4所示,其中R1=47KΩ,R2=100Ω,C=10uF。123456ABCD654321DCBATitleNumberRevisionSizeBDate:1-Oct-2007SheetofFile:F:\不错的音乐\PREVIO~1.DDBDrawnBy:EA/VP31X119X218RESET9RD17WR16INT012INT113T014T115P101P112P123P134P145P156P167P178P0039P0138P0237P0336P0435P0534P0633P0732P2021P2122P2223P2324P2425P2526P2627P2728PSEN29ALE/P30TXD11RXD1089C51C310ufR210KS1SW-PB12A74LS14R110K+5图4复位电路3.2.2时钟电路设计89C51系列单片机内部有一个可控制的反相放大器,引脚XTAL1、XTAL2为反相放大器的输入端和输出端,在XTAL1、XTAL2上外接晶振(或陶瓷谐振器)和电容便组成振荡器。具体的时钟电路如图5所示。电容1、2的典型值为30pF+10pF(晶振)或40pF+10pF(陶瓷谐振器)。振荡器频率主要取决与晶振(或陶瓷谐振器)的频率,但必须小于器件所允许的最高频率。振荡器的工作受控制,复位后=0(=1)振荡器工作,可由软件置‘1’,使振荡器停止振荡,从而使整个单片机停止工作,以达到节电的目的。5图3.2时钟电路图5时钟电路3.2.3单片机最小系统主控机系统采用了Atmel公司生产的89C51单片机,它含有128字节数据存储器,内置4K的电可擦除FLASHROM,可重复编程,大小满足主控机软件系统设计,所以不必再扩展程序存储器。复位电路和晶振电路是89C51工作所需的最简外围电路。89C51的复位端是一个史密特触发输入,高电平有效,而系统中的时钟接口和CAN总线接口的复位信号都是低电平有效。在复位电路中,按一下复位开关就使在RS端出现一段时间的高电平,经过74LS14的一次反相整形,提供给单片机复位端。再经过一次反相整形,通过I/ORST端提供给外部接口电路。外接12M晶振和两个20P电容组成系统的内部时钟电路。3.38255A键盘显示电路设计8255的数据线片选信号线、地址线、读写控制线等分别与系统总线相连,其A、B、C三个端口以排针形式引出,供8255实验使用,如图6所示。123456ABCD654321DCBATitleNumberRevisionSizeBDate:6-Oct-2007SheetofFile:F:\不错的音乐\ronghao.ddbDrawnBy:EA/VP31X119X218RESET9RD17WR16INT012INT113T014T115P101P112P123P134P145P156P167P178P0039P0138P0237P0336P0435P0534P0633P0732P2021P2122P2223P2324P2425P2526P2627P2728PSEN29ALE/P30TXD11RXD10U1AT89C5124MCRYSTAL30PFCAP30PFCAPGND6XD0XD1XD2XD3D0D1343332XD4XD5XD63130292827XD7D2D3D4D5D6D7XIORXIOWXA0XA1RESETIOY359368356RDWRA0A1RESETCSPA0PA1PA2PA3PA4PA5PA6PA7432140393837PB0PB1PB2PB3PB4PB5PB6PB7PC0PC1PC2PC3PC4PC5PC6PC7825518192022232425211415161713121110系统总线图6系统中的8255线路4程序设计4.1主程序模块在主程序模块中,需要完成对各接口芯片的初始化、中断向量的设计以及开中断、循环等待等工作。另外,在主程序模块中还需要设置启动/清除标志寄存器、里程寄存器,并对它们进行初始化。然后,主程序将根据各标志寄存器的内容,分别完成启动、清除、计程等不同的操作。4.2定时中断服务程序在定时中断服务程序中,每1ms产生一次中断,当产生1000次中断的时候,也就到了一秒,送数据到相应的显示缓冲单元,并调用显示子程序实时显示。里程计数程序流程图如图7所示。7图7里程计数程序流程图5总结5.1结论通过用单片机来模拟出租车计价器,并且使用了单片机上的键盘和数码显示管来模拟。硬件各方面相对吻合安全性高、耦合度高,能够对键盘上的0键进行启动、F键进行停止、E键进行复位的操作。程序首先进行初始化设置(包括数码管、字型表、定时中断设置);然后对键盘进行扫描,判断是否有功能键被按下;最后根据哪个功能键被按下,执行相应的程序以实现功能。5.2课程设计体会经过两周有关于通过模拟出租车计价器的课程设计,使同学们对单片开始显示千位进入中断接受键盘按“O”按“F”按“E”P1为0P10为0P100为0P1000为0P10000为0P100000为0循环显示复位显示十分位Run程序显示个位显示十位显示百分位显示百位等待YYYYYYYYYYYYYYYYYNYNYNYNYNYNYNYNYNY8机的应用有了更深的了解。在课程设计的过程中,还是碰到了许多的问题。比如,对于单片机的一些基本代码及程序还有一些不清楚的地方;对于代码的前后顺序及调用掌握的还不够好。通过请教老师和同学,最终把问题解决了。此外,去图书馆和网上查相关资料也是一种学习的途径。附录ORG0000HSJMPSTART;定义程序起始位置ORG000BHSJMPDS0;定时器T0入口地址9START:CLRTR0;关闭T0中断MOVA,#81H;将立即数81H放入A中MOVDPTR,#0FF23H;定义DPTR外部数据指针为0FF23H,指向8255的控制字口MOVX@DPTR,A;把81H放入8255控制字口,让8255以PA、PB口0状态输出工作,PC口0状态输入MOVTMOD,#01H;定义T0为16位计数器MOVTH0,#0FCH;定义中断延时MOVTL0,#24H;定义中断延时;1MS=1000US,假设晶振频率为12MHZ,延时常数=(2的16次方-1000)将其转换到16进制MOVIE,#82H;定义中断允许控制字,开CPU中断,开T0中断MOV71H,#00H;MOV72H,#00HMOV73H,#00HMOV74H,#00HMOV75H,#00HMOV76H,#00HMOV40H,#50;延时用MOV00H,#00H;标志MOV01H,#00HMOV02H,#00HMOV03H,#00HMOV04H,#00HMOVR1,#00H;用来检测键盘开始键MOVR3,#00H;用来检测停止键MOVR4,#00H;用来监听复位键MOV50H,#10;循环次数MOV51H,#10;循环次数MOV52H,#10MOV53H,#10MOV54H,#10MOV55H,#10SETBTR0;允许T0计数CLRC;清空CY10SJMP$;等待中断来临DS0:;中断处理子程序MOVTH0,#0FCH;把中断延时还给T0MOVTL0,#24HLCALLKEY_STATE;调用键盘扫描子程序,获取当前的键盘状态,1MS扫描一次CJNER1,#0,RUN;如果“0”被按下,就跳转到运行子程序,计算里程数CJNER3,#0,STOP;如果“F”被按下,就跳转到停止子程序CJNER4,#0,RESET;如果“E”被按下,就跳转到复位子程序RETI;如果3个键都没有被按下,不做处理,直接返回中断,等待下一次中断来临RESET:;复位的子程序MOV71H,#00H;初始化查表单元数据MOV72H,#00HMOV73H,#00HMOV74H,#00HMOV75H,#00HMOV76H,#00HMOV51H,#10;初始化循环次数MOV52H,#10MOV53H,#10MOV54H,#10MOV55H,#10LJMPXIANSHI;跳转到显示子程序RETI;返回中断STOP:;停止子程序LJMPXIANSHI;跳转到显示子程序KEY_STATE:;键盘行扫描处理子程序KEY_0:;检查0MOVR2,#0FDH;定义8255对第2个LED数码管进行键盘扫描MOVDPTR,#0FF20HMOVA,R2MOVX@DPTR,AMOVDPTR,#0FF22H;将DPTR指向8255的PC口11MOVXA,@DPTR;从PC口获取键盘状态JBACC.1,KEY_F;判断第1列是否为0,如果为0,证明0被按下SJMPKEY_DOWN0;按下了就跳转到0被按下的子程序RETI;返回中断KEY_F:;检查FMOVR2,#0F7HMOVDPTR,#0FF20HMOVA,R2MOVX@DPTR,AMOVDPTR,#0FF22HMOVXA,@DPTRJBACC.1,KEY_ESJMPKEY_DOWNFRETIKEY_E:;检查EMOVR2,#0DFHMOVDPTR,#0FF20HMOVA,R2MOVX@DPTR,AMOVDPTR,#0FF22HMOVXA,@DPTRJBACC.1,RETURN2SJMPKEY_DOWNERETURN2:;返回中断RETIKEY_DOW