1、目 录 摘 要 1 第1章 绪论 2 第2章 系统设计 3 2.1 系统组成 3 2.1.1 计费及显示 3 2.1.2 时钟及显示 3 2.1.3 计费开始提示 1 2.2 功能模块设计 1 第3章 硬件及软件实现 3 3.1 传感器 3 3.1.1 光电传感器电路设计 3 3.1.2车轮光电开关检测电路 4 3.2 单片机 4 3.2.1 8051 单片机功能方块图 5 3.2.2 AT89S51单片机简介 7 3.2.3 AT89S5l与51系列单片机相比具有如下特点 8 3.2.4 89S51的内部框图 9 3.2.5
2、中断控制 11 3.2.6 单片机控制程序设计 12 3.2.7 单片机汇编语言源程序 16 3.3 显示及按键控制系统 31 3.3.1 LED数码管 31 3.3.2 数据显示电路的设计 32 第4章 系统检测及分析 34 4.1 系统仿真/硬件验证 34 4.1.1 系统的调试方法 34 4.1.2 系统的硬件验证 34 4.2 设计技巧分析 35 结 论 36 附录A: FPGA芯片引脚 37 39 摘 要 本系统电源电压为+16V,速度传感器具有汽车每运行1㎞提供1000个脉冲信号的特性。显示器可以采用LED数码管。系统采
3、用单片机和FPGA的结合进行系统的主体设计,测控FPGA芯片通过采集传感器脉冲信号WCLK进行里程计算,里程计费,利用外部脉冲信号SCLK产生标准时钟信号,以计算等待时间,等待费用,并产生里程标志(LCBZ),等待标志(DDBZ),熄灯标志(XDBZ)等有关控制标志信号,同时根据单片机发出的开始信号(START),时段标志(SDBZ),传输数据选择(SEL)等控制信号将有关计算结果传送给FPGA芯片。单片机MCU除了完成键盘扫描,显示控制外,还通过P0口与FPGA进行数据交换,并向测控FPGA芯片发出有关控制信号。本设计方案利用单片机和FPGA的结合,发挥它们各自的长处,分工清晰,实际使用和操
4、作符合大众逻辑,容易被人接受。而且,单片机丰富的I/O口和FPGA模块化的设计为系统功能的扩展提供了空间和便利。 关键词 计费系统,单片机,FPGA芯片 第1章 绪论 出租车是现代人类的重要交通工具,而出租车的计费系统的安全性和先进性是人们普遍关心的问题,要求计费器性能稳定,计费准确,以及预防司机作弊行为等等都关系到乘客的切身利益。因此,设计出符合人们普遍要求及放心的产品具有重要的意义。同时,设计该系统所应用的知识涉及范围广,通过设计可以牢固掌握所学理论知识,对电子信息工程专业的就业方向有初步认识,将理论与实际有机联系起来。应该是对以前所学知识的一次审核吧! 本设计主要介绍了出租车
5、计费系统的设计思路和过程,并给出了所涉及的相关知识的详细介绍。EDA技术应用,单片机的功能及应用,传感器检测技术,VHDL编程语言及汇编语言程序,显示系统设计及按键控制,等等。第一部分为绪论,第二部分为方案论证,第三部分为系统设计,第四部分是硬件及软件实现,第五部分系统检测及分析,第六部分是结论,第七部分是附录,第八部分是参考文献,第九部分是致谢. 目前,普遍的出租车计费器仅仅具有时钟,起步价,里程计费,等待计费及显示几个功能。其发展前景是可观的,将来的产品除具有这些功能外,另外还可增加如下功能:防作弊功能,IC卡付费:顾客能在制定点购买一定额度的“顾客IC卡”,乘车后可用IC卡付帐,付帐是
6、否成功有相应的提示。车主可定期将总营业额写入“车主IC卡”中,并据此IC卡向所属公司领取报酬。车票资料打印:顾客付费后可打印发票,打印内容包括车主信息和车费信息等。可打印车主总营业额信息。语音播报:当乘客上车时,可自动问候乘客,当到达目的地,自动播报乘车费用并礼貌再见,表达希望下次乘坐的意思。增加的这些功能将会更好地为乘客服务。 本系统设计也可应用于其他计费系统中,如电脑计费系统等等,其应用技术也有相当范围的应用面,如显示和播报部分也可应用于智能饭卡﹑智能电动车﹑机器人等电子相关产品中。可见掌握了该系统的设计和分析可实现对电子专业知识的具体应用,增强理论联系实际的能力。除此以外,所涉及的知识
7、面也联系到现实生活中很多相关电子产品,也将对其他电子产品有一定理论基础。 信息工程学院毕业设计(论文) 第2章 系统设计 2.1 系统组成 其中系统电源电压为+16V。速度传感器不需要进行设计,假设它具有汽车每运行1㎞提供1000个脉冲信号的特性。显示器采用LED数码管。具体功能要求如下: 图2.1系统方框图 2.1.1 计费及显示 ①里程,即汽车行程里程,用四位数字显示,显示方式为“XXX.X”,单位为㎞,精确到0.1㎞。 ②单价,即
8、里程单价,用三位数字显示,显示方式为“X.XX”,单价为元/㎞,根据每天不同的时间段有两种情况:当时间段为06:00~23:00时单价为1.4元/㎞,其他时间段内单价为1.80元/㎞。 ③等候时间,用四位数字显示分钟和秒,显示方式为“XX:XX”,等候的定义是:当汽车行驶速度小于或等于12㎞/h时为“等候”。在等候时间大于1小时的情况下,可以不显示等候时间,但必须对等候时间进行统计计算。 ④等候单价,等候单价有两种情况:在等候时间小于1小时的情况下,等候单价为1元每5分钟;在等候时间大于1小时的情况下,等候单价为20元每小时。
9、 ⑤费用的计算,出租车的起价为5.00元,当里程小于2㎞时,按起价计算费用;当里程大于2㎞时按下式计算费用:费用=里程*里程单价+等候时间*等候单价。 ⑥费用的显示,用五位数字显示,显示方式为“XXX.XX”,单价为元。 2.1.2 时钟及显示 当出租车在通常运行状态下,应能显示当前的时间,在汽车熄火的情况下,时钟必须正常运行,但是可以不显示时钟. 2.1.3 计费开始
10、提示 当出租车载上乘客并起步后,将空车指示牌扳倒时,空车指示牌里的指示灯熄灭,并有语音或灯光提示信号。 图2.2 总体原理框图 2.2 功能模块设计 根据系统的设计要求,将整个测控FPGA系统CZJFXT分为七个模块,它们分别是:分频器模块FPQ,等待判别模块DDPB,里程计算模块LCJS,里程计费模块LCJF,等待计时模块DDJS,等待计费模块DDJF,输出数据选择模块SCXZ。 分频器模块FPQ:将外部时钟信号SCLK(设计时假设为1024HZ)经过适当分频后,产生1HZ的系统工作用基准时钟信号CLK1HZ,供给系统中的有关模块计时用。 等待判别模块DDPB:
11、根据速度传感器脉冲信号WCLK和分频器产生的基准时钟信号CLK1HZ,计算单位时间里WCLK的脉冲个数(每㎞产生1000个脉冲信号,即每米产生1个脉冲信号),亦即出租车行驶速度,从而判别出租车是否处于等待状态,发出等待标志信号DDBZ。当速度大于12㎞/H,即速度大于200M/MIN时,出租车处于运行状态,这时等待标志DDBZ=0;当速度小于等于12㏎/H,即速度小于等于200M/MIN时,出租车处于等待状态,这时等待标志DDBZ=1。该模块的VHDL程序设计可分为三个进程:60S周期性跳变信号产生进程,每分钟行驶距离计算进程,等待标志判别进程。等待标志判别进程就是比较每分钟WCLK脉冲个数与
12、等待状态WCLK脉冲临界个数200的大小,从而确定DDBZ的赋值。 里程计算模块LCJS:根据速度传感器脉冲信号WCLK和等待标志DDBZ,对出租车行驶的里程数XSLC进行计算,同时发出里程标志信号LCBZ和里程计费标志信号JFBZ。如果LCBZ=1,说明行驶距离超过2㎞,里程计费启动;如果LCBZ=0,说明没超过2㎞,按起价计费,每行驶1㏎应计费1次,并且计费的启动信号应是某一时刻,因此每行驶1㎞,计费标志信号JFBZ应跳变1次。该模块的VHDL程序设计可分为两个进程:里程计算及标志产生进程,产生计费信号进程。产生计费信号进程就是每行驶10百米(即1㎞)JFBZ由低电平0变为1,经过一个系
13、统时钟周期后JFBZ又回复到低电平0,里程计费模块LCJF就是在JFBZ脉冲信号的上升沿到来时进行计费的加法操作。 里程计费模块LCJF:在计费标志信号JFBZ,等待标志信号DDBZ,里程标志信号LCBZ和时段标志信号SDBZ等信号的控制下,计算行驶里程超过2㎞以上里程的费用LCFY。该模块的VHDL程序是通过由多个条件控制的加法进程来完成里程计费的,里程计费的条件是在DDBZ=0,并且在JFBZ的上升沿根据SDBZ分别进行加法计费操作。当SDBZ=1时,表示在06:00~23:00时段,其单价SD1为1.4元/㎞;当SDBZ=0时,表示其他时段,其单价SD2为1.8元/㎞。如果LCBZ=1
14、说明行驶距离超过2㎞,里程计费启动;如果LCBZ=0,说明没超过2㎞,按起价计费。 等待计时模块DDJS:在等待标志信号DDBZ和基准时钟信号CLK1HZ的控制下,进行等待时间DDSJ的计算,其中DDSJ的低8位表示等待时间的秒数,DDSJ的高8位表示等待时间的分钟数,同时根据等待时间的长短发出一个熄灯标志信号XDBZ。当等待时间小于等于1小时,XDBZ=0,等待时间显示灯亮;当等待时间大于1小时,XDBZ=1,等待时间显示不亮。该模块的VHDL程序是通过一个多层嵌套的加法进程来完成等待计时的。 等待计费模块DDJF:在等待标志信号DDBZ和熄灯标志信号XDBZ控制下,进行等待费用DDF
15、Y的计费操作。该模块的VHDL程序包括两个进程:60S周期性跳变信号产生进程,等待费用计算进程。等待费用计算的条件是在DDBZ=1并且在60S周期性跳变信号T60S的上升沿,根据XDBZ分别进行加法计费操作。当DDBZ=1且XDBZ=0时,按1元/5分钟,即20分/分钟计费;当DDBZ=0且XDBZ=1时,按20元/小时,即33分/分钟计费。 输出数据选择模块SCXZ:根据单片机发出的数据传输选择控制信号SEL,选择有关计算处理结果传输给单片机。 第3章 硬件及软件实现 3.1 传感器 传感器通常是指能感受并能按一定规律将所感受的被测非电量(包括物理量、化学量、生物量等)转换
16、成便于处理与传输的电量(一般为电量,也有少数为其他物理量,如光信号)的器件或装置。 光电传感器是把光信号转换为电信号的传感器,光电传感器的种类极多。它们共同的特点是响应速度快,易于实现非接触测量,非常适于与计算机接口。 3.1.1 光电传感器电路设计 光电传感器工作时,大致应用了三种效应:通过光子与物质的相互作用能直接得到电信号的量子效应;光被物质吸收变成热量后,利用热电转换得到电信号的热效应;光作为一种电磁波,直接与物质相互作用,从而感应出电信号的波动相互作用效应。 反射式光电传感器是用来检测黑白线条的,如图3.1.1(a)所示 由于黑白物体的反射系数不同,利用反射光可以
17、使光敏三极管实现导通和断开,调节传感器与被测对象之间的距离,使光敏三极管只能接受到白色物体反射回来的光束。而黑色物体的反射系数小,所反射回来的光束很弱,光敏三极管无法接受到反射光。 从而实现对黑白线条的检测。 还要在输出信号处加个控制电路,如图3.1.1(b)起隔离强信号和方波整形的作用. (a) (b) 图3.1.1 反射式光电传感器 3.1.2车轮光电开关检测电路 由于要测出出租车的运行速度,每1千米产生1000个脉冲信号并计算出单位时间里的脉冲个数,转换成车轮所转的圈数,即产生脉冲数的多少。在该设计中采用在车轮的转盘上安装一个3条黑白线均匀的圆盘,再用光电开关来
18、检测,如下图4.1.2所示,当出租车运动时,车轮转动,光电传感器利用接收黑白电平时输出的高低电平,当光电传感器检测到黑色条纹时,输出高电平给单片机,相反当检测到白色条纹时输出低电平,从而把连续输出高低电平转化为脉冲数,也就把电机转动时带动有黑白线的圆盘黑白条数转换成脉冲数,从而测试出出租车运行速度。 图3.1.2 光电检测电路 用一张贴有黑色胶带的白纸,让光电传感器离纸不到5cm的平面上与胶带垂直经过,看计数是否与所经过的的胶带数目相等,若多次测试都是吻合的,则此光电传感器良好. 3.2 单片机 单片机既是一个微型的计算机,它具有组成计算机系统的三个要素:CPU、内存与I/O。
19、 CPU:运算或逻辑上的判断; 内存:存放程序与数据; I/O:与外界沟通的桥梁。 CPU中央处理器 Memory 内存 I/O 输入/出设备 图3.2.1 单片机简图 3.2.1 8051 单片机功能方块图 SERIAL PORT 4 I/O PROT BUS CONTROL OSC 振荡与时序 CPU 8051 CORE ETC (TIMER2) TIMER1 TIMER0 ON-CHIP RAM 128/(256) Bytes ON-CHIP PROGRAM
20、 MEMORY 4K/(8K) INTERRUPT CONTROL INT1 INT0 EXTRNAL INTERRUPTS 指令分析 中断系统统 控制总线 串行接口 并行接口 TXD RXD P0 P2 P1 P3 ROM RAM ALE COUNTER INPUTS 定时/计数器 EXTRNAL INTERRUPTS TIMER0 TIMER1 (TIMER2) SERIAL 图3.2.2 8051 单片机功能方块图 振荡及时序单元(OSC):
21、 8051内部有晶体振荡电路,只要在外部加上石英振荡晶体,即可产生频率非常稳定的振荡信号,这个振荡信号正是8051的心脏,所有8051的时钟序列都以此振荡信号为基准。 内部数据存储器(Data Memory): 当程序在运行时,有些数据是经常在变动的,例如LED的显示状态或显示值等,它会因I/O测量的结果而变动,这些值就暂时放置在此区域中,供其他程序进一步读取,这也代表此区域是可以随时读写的。8051系列的CPU提供128个字节可读写的数据存储单元,52系列的CPU则提供256个字节的数据存储单元,这个数据区域中有一段区域16个字节共128位是可以进行位寻址的,MCS—51系列
22、的CPU有相当强的位处理指令,可以妥善且有效地运用该数据存储器,使用方法将在8051的指令说明中再详述。 内部程序存储器(Program memory): 这段区域用于存放我们的应用程序,而且这部分一经确认后是永远不做修改的。8051系列的CPU提供内部4096个字节(4KB)的程序存储器,8052系列的CPU则提供2倍即8192个字节(8KB)的程序存储器,而8031和8032则不含此单元。此单元可以使CPU选择由内部的程序区启动或由外部的程序区启动,内部的程序区启动具有保护功能,后者成本较为低廉。在8051系统中特地将程序区和数据区分隔开,两者最大的差异是后者可以读取和写入,
23、简而言之,PROGRA MMEMORY就是 ROM,DATA MEMORY则是 RAM。 定时/计数器(Timer/Counter): 51系列的CPU有2个定时/计数器,而52系列CPU则有3个定时/计数器,每个定时/计数器又有多种模式可供选择。 串行接口(Serial Port): 8051可通过此接口与外部的计算机等设备连线交换信息,也可以通过此接口进行I/O的扩充。 并行输入/出端口(Parelled I/O): 不论是8051或8052单片机都有4个输入/出端口,总共有32个输入/出,而且每个点都可以单独定义成输入或输出。 控制总线(Bus Control):
24、 当程序的空间超出MSC—51系列内存程序空间的限制时,会通过本单元的控制线路向外部送出地址线信号和控制信号,同时当程序执行MOVX @DPTR,A指令时,代表对外部数据内存做写入的运行,此时也要靠本单元送出必要的控制信号,才能达成外部READ与WRITE的运行请求。 8051运算处理单元(Core): 这是整个单片机的控制处理核心,它读取程序码,经过计算及处理后,将结果送到各个寄存器或输入/输出端口上,并且接受内部和外部的中断信号,然后执行特定的中断服务程序。只要加入电源并且石英晶体开始运行后,本单元就一直不停地工作着,通常我们所谓的死机是指本单元跳入一个未知没有出口的循环中执
25、行,而不是指CPU停止一切的运行,不再执行任何程序。 累加器(Accumulator): 累加器是众多寄存器中最重要的一个寄存器,通常以简写Acc代表累加器,8051的指令中有许多指令和Acc寄存器有关,也有多个指令非通过Acc不可,基本上,8051的指令中赋予Acc 累加器的权限最大。Intel公司建议程序的执行尽量以Acc为主。 B寄存器(B Register): B寄存器是一个一般用途的工作寄存器,当8051使用乘除指令时,则一定要通过B寄存器来做运算。 中断优先顺序控制寄存器(IPC,Interrupt Priority Control): 这个寄存器中存放中
26、断时的优先顺序表,若对应的位设成1时,代表中断有较高的中断优先权。 允许中断控制寄存器(IEC,Interrupt Enable Control): 此寄存器内含系统允许中断的中断源设置值,8051共有5个中断可供选择,8052则有6个中断源,IEC寄存器内另有一个位简称位,若=0时就禁止系统所有的中断要求。 串行输出入缓冲寄存器(SBUF,Serial Buffer): 所有待送出或刚进入的串行数据值都存放在此寄存器中,8051的串行通信是非常简单的,只要一设置完通信协议后,再执行一个MOVSBUF,A指令,就可立即将并行数据值转化成串行数据送到外部。 串行通信
27、控制寄存器 (SCON,Serial ControL或称UART): 此寄存器主要在设置串行通信的模式,当串行数据已经送完或数据已收妥时,会有对应的位被设置成1,这些位也可以当成中断要求信号,请求CPU执行特定的串行中断服务程序。 定时/计数控制寄存器(TCON,Timer/Counter Control): 这个寄存器可以控制定时/计数器的打开或关闭,若一经打开且计数到溢位时,TCON上亦有对应的位被设成1,CPU必须针对此位的状态,决定是否重新设置定时/计数值。 堆栈指标寄存器(SP,Stack Pointer): 8051利用SP指引最近一次存入堆栈内的地址,每
28、当我们在程序中调用其他子程序时,原程序的返回地址就会自动存入内部DATA MEMORY组成的堆栈(Stack)中,而当子程序执行到RET指令时,CPU会自动由堆栈中取回原先存入的返回地址,继续执行原程序。每当CPU将8位值存入堆栈时,我们称之为PUSH(推入),这时SP值会增加1,反之堆栈中取回8位值时,则称之为POP(提回),此时SP值会减少1。 在写8051单片机的控制程序时,在程序起始状态阶段一定要设置SP值,以便程序有足够的堆栈空间,也可以利用软件程序随时机动调整的堆栈指标SP的值。 特殊功能寄存器区(SFR,Special Function Register)
29、 8051单片机内部将多个寄存器统称成SFR,代表其特定的功能,甚至Port0、Port1、Port3也都是属SFR 的成员之一,在这些SFR 中有部分的寄存器可以进行位寻址,表 4.1是这些SFR 寄存器的整理,其中加(*)记号的寄存器可进行位寻址。 表3.1 可进行位寻址的SFR 寄存器 SFR 寄存器 部分可进行位寻址的寄存器 算术运算寄存器 Acc(*)、B(*)、PSW(*) 指标类寄存器 SP、DPL、DPH 并行输入/出端口 P0(*)、P1(*)、P2(*)、P3(*) 中断控制寄存器 IP(*)、IE(*) 定时/计数寄存器 TMOD、TCON
30、TL0、TH0、TL1、TH1 串行通信寄存器 SCON(*)、SBUF 3.2.2 AT89S51单片机简介 AT89S5l是新型高档单片机。 它的主要特性是: 片内含有 32 KB的 Flash程序存储器,擦写周期为 1000次; 片内数据存储器内含512字节的RAM; 具有可编程32线I/O口(P0,P1,P2和P3口); 具有3个可编程定时器T0,T1和T2; 中断系统是具有8个中断源、6个中断矢量、2级中断优先权的中断结构; 具有一个全双工 UART串行口; 低功耗工作方式为空闲模式和掉电模式; 具有双数据指针DPTR0和DPTR1; 具有3级程
31、序锁定位; 具有硬件看门狗定时器WDT; AT89S51工作电源为4.0~5.5V(AT89LV51RC为2.7~5.5V); AT89S51最高工作频率为33MHZ(AT89LV51RC为12MHZ); 具有断电标志POF. 3.2.3 AT89S5l与51系列单片机相比具有如下特点 ① 程序存储器由 8 KB增加到32 KB; ② 片内数据存储器由256宇节增加到512字节; ③ 数据指针由1个增加到2个; ④ 增加了看门狗定时器,CPU在执行程序过程中,由于瞬时的干扰使程序陷入死循环状态,WDT(Watchdog Timer)是使CPU摆脱这种困境而自动恢复的一种方法
32、 ⑤ 退出掉电方式由单纯硬件复位方式增加到硬件复位和中断两种方式; ⑥ 新增加了断电标志POF. 3.2.4 89S51的内部框图 图3.2.3 89S51的内部框图 引脚排列及功能: AT89S51有3种封装形式:PDIP.PLCC和TQFP.PDIP封装的引脚排列如图所示。 图3.2.4 单片机电路板 ①I/O口线 P0口——8位、漏极开路的双向 1/O口。 当使用片外存储器及外扩 I/O口时,P0口作为低字节地址/数据复用线。在编程时,P0口可用于接收指令代码宇节
33、在程序校验时,P0口可输出指令字节(这时需要加外部上拉电阻)。 P0口也可作通用I/O口使用.但需加上拉电阻.变为准双向口。当作为普通输入时,应将 输出锁存器置1. PO口可驱动8个 TTL负载. P1口——8位、准双向I/O口,具有内部上拉电阻。 P1口是为用户准备的 1/O双向口。在编程和校验时,可用做输入低8位地址。用做输入时,应先将输出锁存器置1. P1口可驱动4个TTL负载。 表4.2 P1.0 P1.1替代功能 引 脚 替代功能 说 明 P1.0 T2 定时器2的外部事件输入端; 可编脉冲输出端 P1.1 T2EX 定时器 2的捕捉
34、/重装触发器输入端; 定时器2的计数方向控制端 P2口——8位、准双向 1/O口.具有内部上位电阻. 当使用片外存储器或外扩1/O口时.P2口输出高8位地址。在编程/校验时.P2口可接收高字节地址和某些控制信号。 P2口也可作普通I/O口使用。用做输入时,应先将输出锁存器置1. P2口可驱动4个TTL负载。 P3口——8位、准双向 1/O口,具有内部上拉电阻。 P3口可作为普通1/O口。用做输入时,应先将输出锁存器置 1.在编程/校验时.P3口接收某些控制信号。它可驱动4个TTL负载。 P3口还提供各种替代功能。 表3.3
35、P3口替代功能 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(——)(外部数据存储器读选通) ② 控制信号线 RST——复位输入信号,高电平有效。在振荡器稳定工作时,在RST脚施加两个机器周期(即24个晶振周期)以上的高电平,将器件复位。 EA(——)/VPP——外部程序存储器访问允许信号EA(Extern
36、al Access Enable)。 当EA(——)信号接地时,对ROM的读操作限定在外部程序存储器,地址为0000H~FFFFH;当EA(——)接地时,对ROM的读操作从内部程序存储器开始,并可延续至外部程序存储器。 在编程时,该引脚可接编程电压(AT89C51的VPP为5V或12V;AT89LV51的VPP为12 V)。在编程校验时,该引脚可接VCC。 PSEN(————)——片外程序存储器读选通信号用PSEN(Program Store Enable),低电平有效. 在片外程序存储器取指令期间,当PSEN(————)有效时,程序存储器的内容被送至 PO口
37、数据总线);在访问外部RAM时,PSEN(————)无效。 AIE/PROG(————)——低字节地址锁存信号 AlE(Address latch Enable)。 在系统扩展时,AlE的下降沿将PO口输出的低8位地址锁存在外接的地址锁存器中,以实现低字节地址和数据的分时传送。此外,ALE端连续输出正脉冲.频率为晶振频率的1/6, 可用做外部定时脉冲使用。但要注意,每次访问外RAM时要丢失一个ALE脉冲。 在编程期间.该引脚输入编程脉冲(PROG(————))。 ③ 电源线 VCC——电源电压输入。 GND——接地。 ④ 外部晶振引线 X
38、TAL1——片内振荡器反相放大器和时钟发生线路的输入端。使用片内振荡器时,连接外部石英晶体和微调电容。 XTAL2——片内振荡器反相放大器的输出端。当使用片内振荡器时,外接石英晶体 和微调电容。 当使用外部振荡器时,引脚XTAL1接收外振荡器信号,XTAIL2悬空。 3.2.5 中断控制 可采用中断的时机: ① 当计数值数完时要做一个特定的动作。 ② 当外部信号有一个脉冲信号产生时要做某种特定的运算。 ③ 当外部某些信号成立时,必须立即处理。 ④ 当收到通信界面上的一个特定值时,必须立即反应。 ⑤ 当程序必须处理数个小程序,且这些程序必须几乎同时都
39、在执行中。 ⑥ 当程序必须随时更新某项数据或显示值。 ⑦ 当程序必须自动且随时去检查系统中的状态值时。 上述的情形亦可采用平常的程序,以持续或经常询问的写法来应付,但是若系统有多个条件要询问时,写法就会变得相当的复杂。假如改用程序中断的写法,则程序的写法就会变得较单纯些,中断程序通常有以下一个或一个以上的特征,假使我们的应用中发现有这些特征时,在程序规划前就要考虑是否采用中断的写法。 特征1:每隔一个时间间隔就必须做某件特定的事情。 特征2:当某个条件(不论软件或硬件线路)成立时,就让CPU立即处理。 特征3:CPU 正以多任务(Multi-task)的模式,同时处理数个程序或
40、信号。 特征4:某项状态可能平时均不成立,可是一成立时,CPU 必须立即停止原先的动作,马上来处理这个状态。 3.2.6 单片机控制程序设计 单片机模块包括单片机AT89S51及其控制的显示和键盘系统,AT89S51对FPGA的数据进行计算,计算出用车总费用并送入显示系统显示,同时它接收键盘信息并处理显示切换。系统采用6+1显示,6个数码管作常规显示,一个数码管作状态显示。按键共有5个,分别是功能切换键,确定键,修改键,启动模拟键和空车牌压下模拟键。 图3.2.5 主程序流程图 图 3.2.6 按键处理流程图 图3.2.7 显示子程
41、序流程图 图3.2.8 里程显示子程序流程图 图3.2.9 乘车费用显示子程序流程图 3.2.7 单片机汇编语言源程序 ;CZJFXT.ASM LED8 EQU 7FH LED7 EQU 7EH ;时间显缓 LED6 EQU 7DH LED5 EQU 7CH LED4 EQU 7BH LED3 EQU 7AH LED2 EQU 79H LED1 EQU 78H FUNKEY EQU P1.0 ;功能 SELKEY EQU P1.1 ;选择 FIXKEY EQU P1.2
42、 ;修改 RUN EQU P1.4 ;运行信号(传感器) RUNBZ EQU 28H.4 ZK EQU P1.5 ;载客信号-单片机(传感器) ZKBZ EQU 28H.2 ;载客标志 SZKBZ EQU P2.7 ;送FPGA的载客标志 INT_R1 EQU 46H INT_R0 EQU 47H INT_R2 EQU 48H KEYNUM EQU 49H ADA EQU P2.0 ADB EQU P2.1 ADC EQU P2.2 SDBZ EQU P2.3 ;时段标志
43、 LCBZ EQU P2.4 ;里程标志 DDBZ EQU P2.5 ;等待标志 DDBZC EQU 28H.5 XDBZ EQU P2.6 ;等待超过1小时标志 FYDY8 EQU 3FH ;费用显缓 FYDY7 EQU 3EH FYDY6 EQU 3DH FYDY5 EQU 3CH FYDY4 EQU 3BH FYDY3 EQU 3AH FYDY2 EQU 39H FYDY1 EQU 38H ;主程序 START: JMP MAIN ;转移到主程序
44、 ORG 000BH ;中断服务入口地址 LJMP PIT0 ORG 30H MAIN: CLEAR:MOV R0,#00H MOV R1,#128 MOV A,#00H L1: MOV @R0,A INC R0 DJNZ R1,L1 MOV P2,#00H MOV SP,#60H ;开辟堆栈区 MOV TMOD,#01H ;定时器0,定时工作方式1,16位 MOV TL0,#0B0H ;初
45、值为4C00H,50MS MOV TH0,#03CH SETB TR0 ;启动定时器工作 SETB IE.7 ;中断总允许 SETB IE.1 ;允许定时中断 MOV 30H,#14H ;中断循环次数初值为20次 ML2:LCALL KKEYI MLL3:CJNE A,#04H,ML4 SETB RUNBZ SJMP ML2 ;调用键盘扫描程序 ML4: CJNE
46、A,#00H,MLL1 CLR 28H.0 CLR 28H.6 LCALL SJJZ LCALL KKEYI CJNE A,#00H,MLL3 LCALL LCDJDISP LCALL KKEYI CJNE A,#00H,MLL3 CLR 28H.0 LJMP ML6 LCALL KKEYI MLLL1:CJNE A,#00H,MLL3 LJMP ML5 MLL1:JNB RUNBZ,ML2 CJNE A,#05H,ML2
47、 SETB ZKBZ SETB SZKBZ NOP LCALL DELAY3 CLR SZKBZ ;LCALL QJDISP ;起价显示 ML5:LCALL FYDISP ;费用显示 LCALL KKEYII JNB 28H.3,ML3 ;有键按下转ML3 LJMP ML5 ;没键按下继续刷新费用显示 ML3:LJMP MLL3 ML6:LCALL LCDISP LCALL KKEYII JNB 28H.3,
48、MLLL1 LJMP ML6 DDDISP: ;等待时间显示子程序 MOV FYDY8,#0DH MOV FYDY7,#12H MOV FYDY6,#12H RET ;时间校正子程序 SJJZ:MOV R6,#03H MOV 40H,#LED6 SJL0:LCALL KKEYI CJNE A,#01H,NEXT3 SJL3:LCALL KKEYI SJL1:CJNE A,#02H,NEXT3 MOV A
49、R6 CJNE A,#03H,SL0 MOV R0,40H LCALL DAAD1 MOV A,R2 ;是否到了60S? XRL A,#24H JNZ SJL4 ;不到,转RET1返回 LCALL CLR0 ;到了60S,则秒显示缓冲单元清0 LJMP SJL4 SL0:CJNE A,#02H,SL1 MOV R0,40H LCALL DAAD1 MOV A,R2
50、 ;是否到了60S? XRL A,#60H JNZ SJL4 ;不到,转RET1返回 LCALL CLR0 ;到了60S,则秒显示缓冲单元清0 LJMP SJL4 SL1:CJNE A,#01H,SJL4 MOV R0,40H LCALL DAAD1 MOV A,R2 ;是否到了60S? XRL A,#60H JNZ SJL4 ;不到,转RET1返回 LCALL






