出租车计费器.doc_第1页
出租车计费器.doc_第2页
出租车计费器.doc_第3页
出租车计费器.doc_第4页
出租车计费器.doc_第5页
免费预览已结束,剩余25页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

能力拓展训练任务书学生姓名: 专业班级: 指导教师: 工作单位: 题 目: 出租车计费器设计 初始条件:计算机、Max+plus、EDA实验箱(或单片机、PLC)要求完成的主要任务: (包括基础强化训练工作量及其技术要求,以及说明书撰写等具体要求)设计一个出租车计费器,包括计价、计程、计时三部分。要求起步价为5.0元,3km以内按起步价计费,超过3km每千米增加1元。用3位数码管显示最大显示99.9元。等待计时为每分钟0.1元,用2位数码管显示,最大显示99分钟。再用2位数码管显示里程,最大显示99km。任务安排:(1) 设计任务及要求分析;方案比较及认证说明。(2) 系统原理阐述,写出设计方案结构图。(3) 软件设计课题需要说明:软件思想,流程图,源程序及程序注释。(4) 调试记录及结果分析、总结。(5) 参考资料5篇以上,附录:程序清单。时间安排:D1:安排设计任务;收集资料;方案选择;D2:程序设计;D3-D4:实验室内调试程序并演示;D5-D7:撰写报告;D8-D9:交设计报告。主要参考资料:1 谭会生,张昌凡EDA 技术及应用西安:西安电子科技大学出版社20042 孙晓明EDA实验指导书武汉:武汉理工大学教材中心,20071指导教师签名: 孙晓明 2013 年 6 月 24 日系主任(或责任教师)签名: 年 月 日目录摘要11设计任务及要方案论证21.1设计任务21.2设计方案22各模块电路以及主要芯片说明42.1振荡电路42.2 复位电路42.3 AT89C51电路52.3.1 AT89C51电路说明52.3.2 AT89C51单片机介绍62.4数码管显示电路112.5 LED驱动电路122.5.1 LED驱动电路说明122.5.2 74LS245芯片介绍132.6 整体电路图153软件设计163.1程序流程图163.2定时器功能163.3各模块子程序183.3.1初始化程序183.3.2数码管选择程序193.3.3定时器初始化程序193.3.4 TIME0中断程序203.3.5 主程序203.3.6 数码管显示程序213.3.7 计程、计费、计时程序214仿真运行结果24心得体会27参考文献28摘要近年来,我国城市的发展越来越快,人们的生活品质不断提高,汽车拥堵是城市发展的一块心病,因此城市出租车逐渐得到了人民的重视,减缓交通拥堵状况。作为出租车的计费仪器,出租车计费器应运而生。出租车计费器是一种专用的计量仪器,一般的,计费器上电后显示最初的起步价,里程计费单价,等待时间计费单价,通过按键可以调节起步价,里程计费单价,等待时间计费单价。同时具有运行,暂停,停止等状态,可以显示运行的时间,同时可以显示暂停的时间,具有累加功能,暂停和运行时间在暂停和运行前一次的状态上计时。出租车停止后能够显示行驶的总费用。出租车计费器要求精度高,可靠性好。科技的飞速发展,出租车日益普遍,而出租车上的计价器也不断发展,并且更加精确和智能化。而我们在校大学生可以结合所学专业知识而使用单片机实现出租车计费器功能,是深化单片机应用的良好途径。本次基础强化训练利用利用proteus仿真汽车计费器的运行情况,同时使用51单片机技术来实现一台多功能出租车计价器,具有性能可靠、电路简单、成本低等特点。同时在电路中我们使用7段数码管来构成显示电路用来准确显示出租车的计价、计程、计时三部分。利用proteus仿真汽车的运行时显示计费器的状态,完成本次基础强化训练所要求的内容。 关键字:计费器proteus单片机仿真出租车计费器设计1设计任务及要方案论证1.1设计任务设计一个出租车计费器,包括计价、计程、计时三部分。要求起步价为5.0元,3km以内按起步价计费,超过3km每千米增加1元。用3位数码管显示最大显示99.9元。等待计时为每分钟0.1元,用2位数码管显示,最大显示99分钟。再用2位数码管显示里程,最大显示99km。1.2设计方案方案一:采用数字电子技术,利用555定时芯片构成多谐振荡器作为时钟脉冲信号,采用计数芯片对脉冲尽心脉冲的计数和分频,最后通过译码电路对数据进行译码,将译码所得的数据送给数码管显示,一下是该方案的流程框图,方案一如图1.1所示:图1.1方案一结构图方案二:采用EDA技术,根据层次化设计理论,该设计问题自顶向下可分为分频模块,控制模块、计量模块、译码和动态扫描显示模块,其系统框图如图1.2所示:图1.2方案二结构图方案三:我们可以用51单片机,数码管来构成一个简易的信号控制与显示电路。利用proteus仿真汽车的运行时显示计费器的状态。方案总结:对于出租车计费器的设计,我们列出了三个可以实行的方案。从结构图中我们可以看出,前两个方案相当较为复杂,昂贵而且本设计的要求相对简单。所以我们可以采用单片机足以满足设计要求,不但控制简单,而且成本低廉,设计电路简单。2各模块电路以及主要芯片说明2.1振荡电路 单片机内部有一个高增益、反相放大器,其输入端为芯片引脚XTAL1,其输出端为引脚XTAL2。通过这两个引脚在芯片外并接石英晶体振荡器和两只电容(电容和一般取33pF)。这样就构成一个稳定的自激振荡器。 振荡电路脉冲经过二分频后作为系统的时钟信号,再在二分频的基础上三分频产生ALE信号,此时得到的信号时机器周期信号。振荡电路如图2.1所示:图2.1 振荡电路2.2 复位电路单片机在启动时都需要复位,以使CPU及系统各部件处于确定的初始状态,并从初态开始工作。89系列单片机的复位信号是从RST引脚输入到芯片内的施密特触发器中的。当系统处于正常工作状态时,且振荡器稳定后,如果RST引脚上有一个高电平并维持2个机器周期(24个振荡周期)以上,则CPU就可以响应并将系统复位。单片机系统的复位方式有:手动按钮复位和上电复位。1、手动按钮复位手动按钮复位需要人为在复位输入端RST上加入高电平(图1)。一般采用的办法是在RST端和正电源Vcc之间接一个按钮。当人为按下按钮时,则Vcc的+5V电平就会直接加到RST端。手动按钮复位的电路如所示。由于人的动作再快也会使按钮保持接通达数十毫秒,所以,完全能够满足复位的时间要求。2、上电复位AT89C51的上电复位电路,只要在RST复位输入引脚上接一电容至Vcc端,下接一个电阻到地即可。对于CMOS型单片机,由于在RST端内部有一个下拉电阻,故可将外部电阻去掉,而将外接电容减至1?F。上电复位的工作过程是在加电时,复位电路通过电 容加给RST端一个短暂的高电平信号,此高电平信号随着Vcc对电容的充电过程而逐渐回落,即RST端的高电平持续时间取决于电容的充电时间。为了保证系统能够可靠地复位,RST端的高电平信号必须维持足够长的时间。上电时,Vcc的上升时间约为10ms,而振荡器的起振时间取决于振荡频率,如晶振频率为10MHz,起振时间为1ms;晶振频率为1MHz,起振时间则为10ms。在图2的复位电路中,当Vcc掉电时,必然会使RST端电压迅速下降到0V以下,但是,由于内部电路的限制作用,这个负电压将不会对器件产生损害。另外,在复位期间,端口引脚处于随机状态,复位后,系统将端口置为全“l”态。如果系统在上电时得不到有效的复位,则程序计数器PC将得不到一个合适的初值,因此,CPU可能会从一个未被定义的位置开始执行程序。3、积分型上电复位上电后,由于电容C3的充电和反相门的作用,使RST持续一段时间的高电平。当单片机已在运行当中时,按下复位键K后松开,也能使RST为一段时间的高电平,从而实现上电或开关复位的操作。本次强化训练中我们使用的复位电路图如图2.2所示。图2.2复位电路2.3 AT89C51电路2.3.1 AT89C51电路说明在基础强化训练中,我们使用89C51单片机可以实现以下功能。(1)实现开关电路动作位置的确定。我们利用89C51单片机的P1口通过程序确定开始按键的位置,从而确定单片机需要的动作。(2)实现对计时、计程显示电路的控制。在这里我们主要使用了80C51单片机的P0口(P0.0P0.7)以及P2口(P2.4P2.7)。但我们需要注意的是,我们通过将P0口(P0.0P0.7)与7段数码管相连只能实现一位7段数码管的驱动。如果要实现四位7位数码管的显示,还需要产生位选信号,选择相应的位,然后再显示相应的数,位选信号这里用P2口(P2.4P2.7)来产生,因为这里只需要4位就可以显示数字,这样可以控制4位7段数码管的循环滚动显示。由于我们使用的时钟频率很高,因此由于视觉的暂留现象,我们看到的数码管显示的是4位同时显示,而实际上是4位分别循环点亮。(3)对计价数码管的控制。在这里我们主要使用了89C51单片机的P3口(P3.0P3.7),通过P1口(P1.1P1.4)产生位选信号。这样可以控制4位7段计价数码管的循环滚动显示。图2.389C51电路图2.3.2 AT89C51单片机介绍AT89C51是一种带4K字节FLASH存储器(FPEROMFlash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪存可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除1000次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。外形及引脚排列如图所示 AT89C51外形及引脚排列。主要特性:与MCS-51 兼容4K字节可编程FLASH存储器寿命:1000写/擦循环数据保留时间:10年全静态工作:0Hz-24MHz三级程序存储器锁定1288位内部RAM32可编程I/O线两个16位定时器/计数器5个中断源可编程串行通道低功耗的闲置和掉电模式片内振荡器和时钟电路AT89C51 提供以下标准功能:4k 字节Flash 闪速存储器,128字节内部RAM,32 个I/O 口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。管脚说明:VCC:供电电压。GND:接地。P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P0口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的低八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须接上拉电阻。P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为低八位地址接收。P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。P3口也可作为AT89C51的一些特殊功能口,如下所示:P3.0 RXD(串行输入口)P3.1 TXD(串行输出口)P3.2 /INT0(外部中断0)P3.3 /INT1(外部中断1)P3.4 T0(记时器0外部输入)P3.5 T1(记时器1外部输入)P3.6 /WR(外部数据存储器写选通)P3.7 /RD(外部数据存储器读选通)P3口同时为闪烁编程和编程校验接收一些控制信号。RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的低位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。/PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。/EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。XTAL2:来自反向振荡器的输出。振荡器特性:XTAL1和XTAL2分别为反向放大器的输入和输出。该反向放大器可以配置为片内振荡器。石晶振荡和陶瓷振荡均可采用。如采用外部时钟源驱动器件,XTAL2应不接。有余输入至内部时钟信号要通过一个二分频触发器,因此对外部时钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。整个PEROM阵列和三个锁定位的电擦除可通过正确的控制信号组合,并保持ALE管脚处于低电平10ms 来完成。在芯片擦操作中,代码阵列全被写“1”且在任何非空存储字节被重复编程以前,该操作必须被执行。此外,AT89C51设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。在闲置模式下,CPU停止工作。但RAM,定时器,计数器,串口和中断系统仍在工作。在掉电模式下,保存RAM的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。串口通讯单片机的结构和特殊寄存器,这是你编写软件的关键。至于串口通信需要用到那些特殊功能寄存器呢,它们是SCON,TCON,TMOD,SCON等,各代表什么含义呢?SBUF 数据缓冲寄存器这是一个可以直接寻址的串行口专用寄存器。有朋友这样问起过“为何在串行口收发中,都只是使用到同一个寄存器SBUF?而不是收发各用一个寄存器。”实际上SBUF 包含了两个独立的寄存器,一个是发送寄存,另一个是接收寄存器,但它们都共同使用同一个寻址地址99H。CPU 在读SBUF 时会指到接收寄存器,在写时会指到发送寄存器,而且接收寄存器是双缓冲寄存器,这样可以避免接收中断没有及时的被响应,数据没有被取走,下一帧数据已到来,而造成的数据重叠问题。发送器则不需要用到双缓冲,一般情况下我们在写发送程序时也不必用到发送中断去外理发送数据。操作SBUF寄存器的方法则很简单,只要把这个99H 地址用关键字sfr定义为一个变量就可以对其进行读写操作了,如sfr SBUF = 0x99;当然你也可以用其它的名称。通常在标准的reg51.h 或at89x51.h 等头文件中已对其做了定义,只要用#include 引用就可以了。SCON 串行口控制寄存器通常在芯片或设备中为了监视或控制接口状态,都会引用到接口控制寄存器。SCON 就是51 芯片的串行口控制寄存器。它的寻址地址是98H,是一个可以位寻址的寄存器,作用就是监视和控制51 芯片串行口的工作状态。51 芯片的串口可以工作在几个不同的工作模式下,其工作模式的设置就是使用SCON 寄存器。它的各个位的具体定义如下:SM0 SM1 SM2 REN TB8 RB8 TI RISM0、SM1 为串行口工作模式设置位,这样两位可以对应进行四种模式的设置。串行口工作模式设置。SM0 SM1 模式 功能 波特率0 0 0 同步移位寄存器 fosc/120 1 1 8位UART 可变1 0 2 9位UART fosc/32 或fosc/641 1 3 9位UART 可变在这里只说明最常用的模式1,其它的模式也就一一略过,有兴趣的朋友可以找相关的硬件资料查看。表中的fosc 代表振荡器的频率,也就是晶振的频率。UART 为(Universal Asynchronous Receiver)的英文缩写。SM2 在模式2、模式3 中为多处理机通信使能位。在模式0 中要求该位为0。REM 为允许接收位,REM 置1 时串口允许接收,置0 时禁止接收。REM 是由软件置位或清零。如果在一个电路中接收和发送引脚P3.0,P3.1 都和上位机相连,在软件上有串口中断处理程序,当要求在处理某个子程序时不允许串口被上位机来的控制字符产生中断,那么可以在这个子程序的开始处加入REM=0 来禁止接收,在子程序结束处加入REM=1 再次打开串口接收。大家也可以用上面的实际源码加入REM=0 来进行实验。TB8 发送数据位8,在模式2 和3 是要发送的第9 位。该位可以用软件根据需要置位或清除,通常这位在通信协议中做奇偶位,在多处理机通信中这一位则用于表示是地址帧还是数据帧。RB8 接收数据位8,在模式2 和3 是已接收数据的第9 位。该位可能是奇偶位,地址/数据标识位。在模式0 中,RB8 为保留位没有被使用。在模式1 中,当SM2=0,RB8 是已接收数据的停止位。TI 发送中断标识位。在模式0,发送完第8 位数据时,由硬件置位。其它模式中则是在发送停止位之初,由硬件置位。TI 置位后,申请中断,CPU 响应中断后,发送下一帧数据。在任何模式下,TI 都必须由软件来清除,也就是说在数据写入到SBUF 后,硬件发送数据,中断响应(如中断打开),这时TI=1,表明发送已完成,TI 不会由硬件清除,所以这时必须用软件对其清零。RI 接收中断标识位。在模式0,接收第8 位结束时,由硬件置位。其它模式中则是在接收停止位的半中间,由硬件置位。RI=1,申请中断,要求CPU 取走数据。但在模式1 中,SM2=1时,当未收到有效的停止位,则不会对RI 置位。同样RI 也必须要靠软件清除。常用的串口模式1 是传输10 个位的,1 位起始位为0,8 位数据位,低位在先,1 位停止位为1。它的波特率是可变的,其速率是取决于定时器1 或定时器2 的定时值(溢出速率)。AT89C51 和AT89C2051 等51 系列芯片只有两个定时器,定时器0 和定时器1,而定时器2是89C52 系列芯片才有的。波特率在使用串口做通讯时,一个很重要的参数就是波特率,只有上下位机的波特率一样时才可以进行正常通讯。波特率是指串行端口每秒内可以传输的波特位数。有一些初学的朋友认为波特率是指每秒传输的字节数,如标准9600 会被误认为每秒种可以传送9600个字节,而实际上它是指每秒可以传送9600 个二进位,而一个字节要8 个二进位,如用串口模式1 来传输那么加上起始位和停止位,每个数据字节就要占用10 个二进位,9600 波特率用模式1 传输时,每秒传输的字节数是960010=960 字节。51 芯片的串口工作模式0的波特率是固定的,为fosc/12,以一个12M 的晶振来计算,那么它的波特率可以达到1M。模式2 的波特率是固定在fosc/64 或fosc/32,具体用那一种就取决于PCON 寄存器中的SMOD位,如SMOD 为0,波特率为focs/64,SMOD 为1,波特率为focs/32。模式1 和模式3 的波特率是可变的,取决于定时器1 或2(52 芯片)的溢出速率。那么我们怎么去计算这两个模式的波特率设置时相关的寄存器的值呢?可以用以下的公式去计算。波特率=(2SMOD32)定时器1 溢出速率上式中如设置了PCON 寄存器中的SMOD 位为1 时就可以把波特率提升2 倍。通常会使用定时器1 工作在定时器工作模式2 下,这时定时值中的TL1 做为计数,TH1 做为自动重装值 ,这个定时模式下,定时器溢出后,TH1 的值会自动装载到TL1,再次开始计数,这样可以不用软件去干预,使得定时更准确。在这个定时模式2 下定时器1 溢出速率的计算公式如下:溢出速率=(计数速率)/(256TH1)上式中的“计数速率”与所使用的晶体振荡器频率有关,在51 芯片中定时器启动后会在每一个机器周期使定时寄存器TH 的值增加一,一个机器周期等于十二个振荡周期,所以可以得知51 芯片的计数速率为晶体振荡器频率的1/12,一个12M 的晶振用在51 芯片上,那么51 的计数速率就为1M。通常用11.0592M 晶体是为了得到标准的无误差的波特率,那么为何呢?计算一下就知道了。如我们要得到9600 的波特率,晶振为11.0592M 和12M,定时器1 为模式2,SMOD 设为1,分别看看那所要求的TH1 为何值。图2.489C51单片机引脚图2.4数码管显示电路在数码管转速显示电路中,我们要用到数码管显示计价、计程、计时三部分。从而可以更直观的显示题目的要求:起步价为5.0元,3km以内按起步价计费,超过3km每千米增加1元。用3位数码管显示最大显示99.9元。等待计时为每分钟0.1元,用2位数码管显示,最大显示99分钟。再用2位数码管显示里程,最大显示99km。如图3-4是我们要设计的数码管显示电路图。图2.5数码管显示电路图数码管用驱动电路来驱动数码管的各个段码从而显示出我们要的数字,因此根据数码管的驱动方式的不同,可以分为静态式和动态式两类。 静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。 数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划a,b,c,d,e,f,g,dp的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为12ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。 在本次基础强化训练中需要用到4个数码管在静态显示的工作状态下工作,用80C51来驱动数码管正常工作。2.5 LED驱动电路2.5.1 LED驱动电路说明led驱动电路,我们可以使用74LS245芯片。图2.6LED驱动电路图2.5.2 74LS245芯片介绍74LS245是我们常用的芯片,用来驱动led或者其他的设备,它是8路同相三态双向总线收发器,可双向传输数据。74LS245还具有双向三态功能,既可以输出,也可以输入数据。当8051单片机的P0口总线负载达到或超过P0最大负载能力时,必须接入74LS245等总线驱动器。当片选端/CE低电平有效时,DIR=“0”,信号由 B 向 A 传输;(接收)DIR=“1”,信号由 A 向 B 传输;(发送)当CE为高电平时,A、B均为高阻态。由于P2口始终输出地址的高8位,接口时74LS245的三态控制端1G和2G接地,P2口与驱动器输入线对应相连。P0口与74LS245输入端相连,E端接地,保证数据线畅通。8051的/RD和/PSEN相与后接DIR,使得RD且PSEN有效时,74LS245输入(P0.1D1),其它时间处于输出(P0.1D1)。图2.774LS245管脚图2.6 整体电路图图2.8整体电路图3软件设计3.1程序流程图图3.1 程序流程图3.2定时器功能由于在程序设计中需要用到定时器,所以我通过自学以及上网查询,学到了定时器的功能:TMOD:定时器/计数器模式控制寄存器(TIMER/COUNTER MODE CONTROL REGISTER)定时器/计数器模式控制寄存器TMOD是一个逐位定义的8位寄存器,但只能使用字节寻址,其字节地址为89H。 其格式为: 图3.2 TMOD寄存器工作方式控制寄存器其中低四位定义定时器/计数器C/T0,高四位定义定时器/计数器C/T1,各位的说明:GATE门控制。GATE=1时,由外部中断引脚INT0、INT1来启动定时器T0、T1。当INT0引脚为高电平时TR0置位,启动定时器T0;当INT1引脚为高电平时TR1置位,启动定时器T1。GATE=0时,仅由TR0,TR1置位分别启动定时器T0、T1。C/T功能选择位C/T=0时为定时功能,C/T=1时为计数功能。置位时选择计数功能,清零时选择定时功能。M0、M1方式选择功能由于有2位,因此有4种工作方式:M1M0 工作方式 计数器模式 TMOD(设置定时器模式)0 0 方式0 13位计数器 TMOD=0x000 1 方式1 16位计数器 TMOD=0x011 0 方式2 自动重装8位计数器 TMOD=0x021 1 方式3 T0分为2个8位独立计数器,T1为无中断重装8位计数器 TMOD=0x03单片机定时器0设置为工作方式1为TMOD=0x01TCON设置TF0(TF1)计数溢出标志位,当计数器计数溢出时,该位置1。TR0(TR1)定时器运行控制位当TR0(TR1)0 停止定时器/计数器工作当TR0(TR1)1 启动定时器/计数器工作IE0(IE1)外中断请求标志位当CPU采样到P3.2(P3.3)出现有效中断请求时,此位由硬件置1。在中断响应完成后转向中断服务时,再由硬件自动清0。IT0(IT1)外中断请求信号方式控制位当IT0(IT1)=1 脉冲方式(后沿负跳有效)当IT0(IT1)0 电平方式(低电平有效)此位由软件置1或清0。TF0(TF1)计数溢出标志位 当计数器产生计数溢出时,此位由硬件置1。当转向中断服务时,再有硬件自动清0。计数溢出的标志位的使用有两种情况:采用中断方式时,作中断请求标志位来使用;采用查询方式时,作查询状态位来使用。3.3各模块子程序3.3.1初始化程序初始化程序中,我们设计包括变量定义、函数声明、延时子程序等等。#include#define uint unsigned int#define uchar unsigned char#define T0 300sbit K0=P10;sbit c0=P11;sbit c1=P12;sbit c2=P13;sbit c3=P14;sbit LedForward=P15;sbit LedBack=P17;sbit LedStop=P16;char table10=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67; /数码管编码unsigned char code DSY_CODE=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;unsigned char Disp_Buffer=0,0,0,0,0,0,0,0;unsigned char Disp_Buffer_M=0,0,0,0,0,0,0,0;unsigned char code DSY_BIT=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f;unsigned char i,j,buzy;unsigned char t1,minute=0;unsigned int count=0,KmCount=0,Money2=0,Money1=5,Money0=0; void chaxun(void);void TimerInit();void delay(unsigned char x);void dspzheng(void);void dspfan(void);void sspzheng(void);void sspfan(void); void bpzheng(void);void bpfan(void);void display();void display2();void delay(unsigned char x) /延时子程序延时约0.5Xms int i; while(x-) for(i=1;i60;i+); 3.3.2数码管选择程序void choose(uchar i)switch(i)case 4:c0=0;c1=1;c2=1;c3=1;break; case 5:c0=1;c1=0;c2=1;c3=1;break;case 6:c0=1;c1=1;c2=0;c3=1;break;case 7:c0=1;c1=1;c2=1;c3=0;break;3.3.3定时器初始化程序首先设计一子程序用于显示7位数字,主程序先完成初始化,接着进入无限循环,检测等待计时变量和路程变量,计算费用后调用子程序在数码管中显示,计时中断时变量增加,来模拟汽车的行进和等待。void TimerInit()IE=0X8A;TMOD=0x11; /设置定时器工作方式TH0=(65536-T0)/256; /送初值TL0=(65536-T0)%256;ET0=1; /开定时/计数器0中断TR0=1; /定时/计数器开始工作TH1=(65536-50000)/256; /送初值TL1=(65536-50000)%256;ET1=1; /开定时/计数器0中断TR1=1; /定时/计数器开始工作EA=1; /开总中断3.3.4 TIME0中断程序void timer0() interrupt 1 /定时/计数器中断程序unsigned int temp;TH0=(65536-T0)/256;TL0=(65536-T0)%256;temp=count;/minute=56;3.3.5 主程序main() /主程序/TimerInit();while(1) chaxun();display();/display2();3.3.6 数码管显示程序void display() /数码管动态显示子程序Disp_Buffer7=minute/10;Disp_Buffer6=minute%10;Disp_Buffer5=KmCount/10;Disp_Buffer4=KmCount%10;Disp_Buffer_M7=0;Disp_Buffer_M6=Money2;Disp_Buffer_M5=Money1; Disp_Buffer_M4=Money0;for(i=4;i3)Money1+;if(Money1=10)Money1=0;Money2+;if(Money2=10)Money2=0;/Money1=0;if(KmCount=100)KmCount=0;else if(K0=1)/ET1=1; /开定时/计数器0中断/TR1=1; /定时/计数器开始工作minute+;/delay(10);Money0+;if(Money0=10)Money0=0;Money1+;i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论