资源描述
目 录
摘 要 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 中断控制 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数码管。系统采用单片机和FPGA的结合进行系统的主体设计,测控FPGA芯片通过采集传感器脉冲信号WCLK进行里程计算,里程计费,利用外部脉冲信号SCLK产生标准时钟信号,以计算等待时间,等待费用,并产生里程标志(LCBZ),等待标志(DDBZ),熄灯标志(XDBZ)等有关控制标志信号,同时根据单片机发出的开始信号(START),时段标志(SDBZ),传输数据选择(SEL)等控制信号将有关计算结果传送给FPGA芯片。单片机MCU除了完成键盘扫描,显示控制外,还通过P0口与FPGA进行数据交换,并向测控FPGA芯片发出有关控制信号。本设计方案利用单片机和FPGA的结合,发挥它们各自的长处,分工清晰,实际使用和操作符合大众逻辑,容易被人接受。而且,单片机丰富的I/O口和FPGA模块化的设计为系统功能的扩展提供了空间和便利。
关键词 计费系统,单片机,FPGA芯片
第1章 绪论
出租车是现代人类的重要交通工具,而出租车的计费系统的安全性和先进性是人们普遍关心的问题,要求计费器性能稳定,计费准确,以及预防司机作弊行为等等都关系到乘客的切身利益。因此,设计出符合人们普遍要求及放心的产品具有重要的意义。同时,设计该系统所应用的知识涉及范围广,通过设计可以牢固掌握所学理论知识,对电子信息工程专业的就业方向有初步认识,将理论与实际有机联系起来。应该是对以前所学知识的一次审核吧!
本设计主要介绍了出租车计费系统的设计思路和过程,并给出了所涉及的相关知识的详细介绍。EDA技术应用,单片机的功能及应用,传感器检测技术,VHDL编程语言及汇编语言程序,显示系统设计及按键控制,等等。第一部分为绪论,第二部分为方案论证,第三部分为系统设计,第四部分是硬件及软件实现,第五部分系统检测及分析,第六部分是结论,第七部分是附录,第八部分是参考文献,第九部分是致谢.
目前,普遍的出租车计费器仅仅具有时钟,起步价,里程计费,等待计费及显示几个功能。其发展前景是可观的,将来的产品除具有这些功能外,另外还可增加如下功能:防作弊功能,IC卡付费:顾客能在制定点购买一定额度的“顾客IC卡”,乘车后可用IC卡付帐,付帐是否成功有相应的提示。车主可定期将总营业额写入“车主IC卡”中,并据此IC卡向所属公司领取报酬。车票资料打印:顾客付费后可打印发票,打印内容包括车主信息和车费信息等。可打印车主总营业额信息。语音播报:当乘客上车时,可自动问候乘客,当到达目的地,自动播报乘车费用并礼貌再见,表达希望下次乘坐的意思。增加的这些功能将会更好地为乘客服务。
本系统设计也可应用于其他计费系统中,如电脑计费系统等等,其应用技术也有相当范围的应用面,如显示和播报部分也可应用于智能饭卡﹑智能电动车﹑机器人等电子相关产品中。可见掌握了该系统的设计和分析可实现对电子专业知识的具体应用,增强理论联系实际的能力。除此以外,所涉及的知识面也联系到现实生活中很多相关电子产品,也将对其他电子产品有一定理论基础。
信息工程学院毕业设计(论文)
第2章 系统设计
2.1 系统组成
其中系统电源电压为+16V。速度传感器不需要进行设计,假设它具有汽车每运行1㎞提供1000个脉冲信号的特性。显示器采用LED数码管。具体功能要求如下:
图2.1系统方框图
2.1.1 计费及显示
①里程,即汽车行程里程,用四位数字显示,显示方式为“XXX.X”,单位为㎞,精确到0.1㎞。
②单价,即里程单价,用三位数字显示,显示方式为“X.XX”,单价为元/㎞,根据每天不同的时间段有两种情况:当时间段为06:00~23:00时单价为1.4元/㎞,其他时间段内单价为1.80元/㎞。
③等候时间,用四位数字显示分钟和秒,显示方式为“XX:XX”,等候的定义是:当汽车行驶速度小于或等于12㎞/h时为“等候”。在等候时间大于1小时的情况下,可以不显示等候时间,但必须对等候时间进行统计计算。
④等候单价,等候单价有两种情况:在等候时间小于1小时的情况下,等候单价为1元每5分钟;在等候时间大于1小时的情况下,等候单价为20元每小时。
⑤费用的计算,出租车的起价为5.00元,当里程小于2㎞时,按起价计算费用;当里程大于2㎞时按下式计算费用:费用=里程*里程单价+等候时间*等候单价。
⑥费用的显示,用五位数字显示,显示方式为“XXX.XX”,单价为元。
2.1.2 时钟及显示
当出租车在通常运行状态下,应能显示当前的时间,在汽车熄火的情况下,时钟必须正常运行,但是可以不显示时钟.
2.1.3 计费开始提示
当出租车载上乘客并起步后,将空车指示牌扳倒时,空车指示牌里的指示灯熄灭,并有语音或灯光提示信号。
图2.2 总体原理框图
2.2 功能模块设计
根据系统的设计要求,将整个测控FPGA系统CZJFXT分为七个模块,它们分别是:分频器模块FPQ,等待判别模块DDPB,里程计算模块LCJS,里程计费模块LCJF,等待计时模块DDJS,等待计费模块DDJF,输出数据选择模块SCXZ。
分频器模块FPQ:将外部时钟信号SCLK(设计时假设为1024HZ)经过适当分频后,产生1HZ的系统工作用基准时钟信号CLK1HZ,供给系统中的有关模块计时用。
等待判别模块DDPB:根据速度传感器脉冲信号WCLK和分频器产生的基准时钟信号CLK1HZ,计算单位时间里WCLK的脉冲个数(每㎞产生1000个脉冲信号,即每米产生1个脉冲信号),亦即出租车行驶速度,从而判别出租车是否处于等待状态,发出等待标志信号DDBZ。当速度大于12㎞/H,即速度大于200M/MIN时,出租车处于运行状态,这时等待标志DDBZ=0;当速度小于等于12㏎/H,即速度小于等于200M/MIN时,出租车处于等待状态,这时等待标志DDBZ=1。该模块的VHDL程序设计可分为三个进程:60S周期性跳变信号产生进程,每分钟行驶距离计算进程,等待标志判别进程。等待标志判别进程就是比较每分钟WCLK脉冲个数与等待状态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,经过一个系统时钟周期后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,说明行驶距离超过2㎞,里程计费启动;如果LCBZ=0,说明没超过2㎞,按起价计费。
等待计时模块DDJS:在等待标志信号DDBZ和基准时钟信号CLK1HZ的控制下,进行等待时间DDSJ的计算,其中DDSJ的低8位表示等待时间的秒数,DDSJ的高8位表示等待时间的分钟数,同时根据等待时间的长短发出一个熄灯标志信号XDBZ。当等待时间小于等于1小时,XDBZ=0,等待时间显示灯亮;当等待时间大于1小时,XDBZ=1,等待时间显示不亮。该模块的VHDL程序是通过一个多层嵌套的加法进程来完成等待计时的。
等待计费模块DDJF:在等待标志信号DDBZ和熄灯标志信号XDBZ控制下,进行等待费用DDFY的计费操作。该模块的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 传感器
传感器通常是指能感受并能按一定规律将所感受的被测非电量(包括物理量、化学量、生物量等)转换成便于处理与传输的电量(一般为电量,也有少数为其他物理量,如光信号)的器件或装置。
光电传感器是把光信号转换为电信号的传感器,光电传感器的种类极多。它们共同的特点是响应速度快,易于实现非接触测量,非常适于与计算机接口。
3.1.1 光电传感器电路设计
光电传感器工作时,大致应用了三种效应:通过光子与物质的相互作用能直接得到电信号的量子效应;光被物质吸收变成热量后,利用热电转换得到电信号的热效应;光作为一种电磁波,直接与物质相互作用,从而感应出电信号的波动相互作用效应。
反射式光电传感器是用来检测黑白线条的,如图3.1.1(a)所示
由于黑白物体的反射系数不同,利用反射光可以使光敏三极管实现导通和断开,调节传感器与被测对象之间的距离,使光敏三极管只能接受到白色物体反射回来的光束。而黑色物体的反射系数小,所反射回来的光束很弱,光敏三极管无法接受到反射光。 从而实现对黑白线条的检测。
还要在输出信号处加个控制电路,如图3.1.1(b)起隔离强信号和方波整形的作用.
(a)
(b)
图3.1.1 反射式光电传感器
3.1.2车轮光电开关检测电路
由于要测出出租车的运行速度,每1千米产生1000个脉冲信号并计算出单位时间里的脉冲个数,转换成车轮所转的圈数,即产生脉冲数的多少。在该设计中采用在车轮的转盘上安装一个3条黑白线均匀的圆盘,再用光电开关来检测,如下图4.1.2所示,当出租车运动时,车轮转动,光电传感器利用接收黑白电平时输出的高低电平,当光电传感器检测到黑色条纹时,输出高电平给单片机,相反当检测到白色条纹时输出低电平,从而把连续输出高低电平转化为脉冲数,也就把电机转动时带动有黑白线的圆盘黑白条数转换成脉冲数,从而测试出出租车运行速度。
图3.1.2 光电检测电路
用一张贴有黑色胶带的白纸,让光电传感器离纸不到5cm的平面上与胶带垂直经过,看计数是否与所经过的的胶带数目相等,若多次测试都是吻合的,则此光电传感器良好.
3.2 单片机
单片机既是一个微型的计算机,它具有组成计算机系统的三个要素:CPU、内存与I/O。
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
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):
8051内部有晶体振荡电路,只要在外部加上石英振荡晶体,即可产生频率非常稳定的振荡信号,这个振荡信号正是8051的心脏,所有8051的时钟序列都以此振荡信号为基准。
内部数据存储器(Data Memory):
当程序在运行时,有些数据是经常在变动的,例如LED的显示状态或显示值等,它会因I/O测量的结果而变动,这些值就暂时放置在此区域中,供其他程序进一步读取,这也代表此区域是可以随时读写的。8051系列的CPU提供128个字节可读写的数据存储单元,52系列的CPU则提供256个字节的数据存储单元,这个数据区域中有一段区域16个字节共128位是可以进行位寻址的,MCS—51系列的CPU有相当强的位处理指令,可以妥善且有效地运用该数据存储器,使用方法将在8051的指令说明中再详述。
内部程序存储器(Program memory):
这段区域用于存放我们的应用程序,而且这部分一经确认后是永远不做修改的。8051系列的CPU提供内部4096个字节(4KB)的程序存储器,8052系列的CPU则提供2倍即8192个字节(8KB)的程序存储器,而8031和8032则不含此单元。此单元可以使CPU选择由内部的程序区启动或由外部的程序区启动,内部的程序区启动具有保护功能,后者成本较为低廉。在8051系统中特地将程序区和数据区分隔开,两者最大的差异是后者可以读取和写入,简而言之,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):
当程序的空间超出MSC—51系列内存程序空间的限制时,会通过本单元的控制线路向外部送出地址线信号和控制信号,同时当程序执行MOVX @DPTR,A指令时,代表对外部数据内存做写入的运行,此时也要靠本单元送出必要的控制信号,才能达成外部READ与WRITE的运行请求。
8051运算处理单元(Core):
这是整个单片机的控制处理核心,它读取程序码,经过计算及处理后,将结果送到各个寄存器或输入/输出端口上,并且接受内部和外部的中断信号,然后执行特定的中断服务程序。只要加入电源并且石英晶体开始运行后,本单元就一直不停地工作着,通常我们所谓的死机是指本单元跳入一个未知没有出口的循环中执行,而不是指CPU停止一切的运行,不再执行任何程序。
累加器(Accumulator):
累加器是众多寄存器中最重要的一个寄存器,通常以简写Acc代表累加器,8051的指令中有许多指令和Acc寄存器有关,也有多个指令非通过Acc不可,基本上,8051的指令中赋予Acc 累加器的权限最大。Intel公司建议程序的执行尽量以Acc为主。
B寄存器(B Register):
B寄存器是一个一般用途的工作寄存器,当8051使用乘除指令时,则一定要通过B寄存器来做运算。
中断优先顺序控制寄存器(IPC,Interrupt Priority Control):
这个寄存器中存放中断时的优先顺序表,若对应的位设成1时,代表中断有较高的中断优先权。
允许中断控制寄存器(IEC,Interrupt Enable Control):
此寄存器内含系统允许中断的中断源设置值,8051共有5个中断可供选择,8052则有6个中断源,IEC寄存器内另有一个位简称位,若=0时就禁止系统所有的中断要求。
串行输出入缓冲寄存器(SBUF,Serial Buffer):
所有待送出或刚进入的串行数据值都存放在此寄存器中,8051的串行通信是非常简单的,只要一设置完通信协议后,再执行一个MOVSBUF,A指令,就可立即将并行数据值转化成串行数据送到外部。
串行通信控制寄存器 (SCON,Serial ControL或称UART):
此寄存器主要在设置串行通信的模式,当串行数据已经送完或数据已收妥时,会有对应的位被设置成1,这些位也可以当成中断要求信号,请求CPU执行特定的串行中断服务程序。
定时/计数控制寄存器(TCON,Timer/Counter Control):
这个寄存器可以控制定时/计数器的打开或关闭,若一经打开且计数到溢位时,TCON上亦有对应的位被设成1,CPU必须针对此位的状态,决定是否重新设置定时/计数值。
堆栈指标寄存器(SP,Stack Pointer):
8051利用SP指引最近一次存入堆栈内的地址,每当我们在程序中调用其他子程序时,原程序的返回地址就会自动存入内部DATA MEMORY组成的堆栈(Stack)中,而当子程序执行到RET指令时,CPU会自动由堆栈中取回原先存入的返回地址,继续执行原程序。每当CPU将8位值存入堆栈时,我们称之为PUSH(推入),这时SP值会增加1,反之堆栈中取回8位值时,则称之为POP(提回),此时SP值会减少1。
在写8051单片机的控制程序时,在程序起始状态阶段一定要设置SP值,以便程序有足够的堆栈空间,也可以利用软件程序随时机动调整的堆栈指标SP的值。
特殊功能寄存器区(SFR,Special Function Register)
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(*)、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级程序锁定位;
具有硬件看门狗定时器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摆脱这种困境而自动恢复的一种方法;
⑤ 退出掉电方式由单纯硬件复位方式增加到硬件复位和中断两种方式;
⑥ 新增加了断电标志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口可用于接收指令代码宇节;在程序校验时,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的捕捉/重装触发器输入端;
定时器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 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(External Access Enable)。
当EA(——)信号接地时,对ROM的读操作限定在外部程序存储器,地址为0000H~FFFFH;当EA(——)接地时,对ROM的读操作从内部程序存储器开始,并可延续至外部程序存储器。
在编程时,该引脚可接编程电压(AT89C51的VPP为5V或12V;AT89LV51的VPP为12 V)。在编程校验时,该引脚可接VCC。
PSEN(————)——片外程序存储器读选通信号用PSEN(Program Store Enable),低电平有效.
在片外程序存储器取指令期间,当PSEN(————)有效时,程序存储器的内容被送至 PO口(数据总线);在访问外部RAM时,PSEN(————)无效。
AIE/PROG(————)——低字节地址锁存信号 AlE(Address latch Enable)。
在系统扩展时,AlE的下降沿将PO口输出的低8位地址锁存在外接的地址锁存器中,以实现低字节地址和数据的分时传送。此外,ALE端连续输出正脉冲.频率为晶振频率的1/6,
可用做外部定时脉冲使用。但要注意,每次访问外RAM时要丢失一个ALE脉冲。
在编程期间.该引脚输入编程脉冲(PROG(————))。
③ 电源线
VCC——电源电压输入。
GND——接地。
④ 外部晶振引线
XTAL1——片内振荡器反相放大器和时钟发生线路的输入端。使用片内振荡器时,连接外部石英晶体和微调电容。
XTAL2——片内振荡器反相放大器的输出端。当使用片内振荡器时,外接石英晶体 和微调电容。
当使用外部振荡器时,引脚XTAL1接收外振荡器信号,XTAIL2悬空。
3.2.5 中断控制
可采用中断的时机:
① 当计数值数完时要做一个特定的动作。
② 当外部信号有一个脉冲信号产生时要做某种特定的运算。
③ 当外部某些信号成立时,必须立即处理。
④ 当收到通信界面上的一个特定值时,必须立即反应。
⑤ 当程序必须处理数个小程序,且这些程序必须几乎同时都在执行中。
⑥ 当程序必须随时更新某项数据或显示值。
⑦ 当程序必须自动且随时去检查系统中的状态值时。
上述的情形亦可采用平常的程序,以持续或经常询问的写法来应付,但是若系统有多个条件要询问时,写法就会变得相当的复杂。假如改用程序中断的写法,则程序的写法就会变得较单纯些,中断程序通常有以下一个或一个以上的特征,假使我们的应用中发现有这些特征时,在程序规划前就要考虑是否采用中断的写法。
特征1:每隔一个时间间隔就必须做某件特定的事情。
特征2:当某个条件(不论软件或硬件线路)成立时,就让CPU立即处理。
特征3:CPU 正以多任务(Multi-task)的模式,同时处理数个程序或信号。
特征4:某项状态可能平时均不成立,可是一成立时,CPU 必须立即停止原先的动作,马上来处理这个状态。
3.2.6 单片机控制程序设计
单片机模块包括单片机AT89S51及其控制的显示和键盘系统,AT89S51对FPGA的数据进行计算,计算出用车总费用并送入显示系统显示,同时它接收键盘信息并处理显示切换。系统采用6+1显示,6个数码管作常规显示,一个数码管作状态显示。按键共有5个,分别是功能切换键,确定键,修改键,启动模拟键和空车牌压下模拟键。
图3.2.5 主程序流程图
图 3.2.6 按键处理流程图
图3.2.7 显示子程序流程图
图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 ;修改
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 ;时段标志
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 ;转移到主程序
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 ;初值为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 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
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,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,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 ;是否到了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
展开阅读全文