找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2552|回复: 0
收起左侧

基于单片机红绿灯系统设计论文

[复制链接]
ID:217382 发表于 2017-7-5 16:32 | 显示全部楼层 |阅读模式
数理与信息工程学院
课 程 设 计
   
题    目:      路口灯火控制及显示系统设计        
专    业:    计算机科学与技术  
班    级:             056班                    
姓    名:   ***     学号:***         
成    绩:                                 
目 录
第1节   引 言………………………………………………………………………    3
1. 1路口灯火控制及显示系统概述…………………………………………3
     1.2设计任……………………………………………3
1. 3  系统主要功能   …………………………………………………………     3
第2节口灯火控制及显示系统硬件设计……………………………………………    4
2.1系统的硬件构成及功能 …………………………………4
    2.2  设计中用到的芯片及其功能…………………………………………………    6
    2.2.1  8279芯片的说明    …………………………………………………    6
    2.2.2  其它器件的说明    …………………………………………………    7
    2.2.3  其它器件的说明    …………………………………………………    7
第3节   系统软件设计        ……………………………………………        9
3.1  系统主程序设计         …………………………………………………     9
   3.1.1程序框图及说明      …………………………………………………     9
3.2显示子程序及说明         ………………………………………………      11   
3. 3延时子程序的计算           ………………………………………………     12
3. 4各键的功能                 ………………………………………………     12
第4节 结束语            ……………………………………………………      13
   
参考文献 ………………………………………………………………14
源程序 ………………………………………………………………………………15
路口灯火控制及显示系统
第1节  引  言
随着经济的不断发展,越来越多的汽车进入普通老百姓家中,使得人们的生活质量不断提高,但是另一方面也容易引起交通堵塞,因此应在车辆通行繁忙的十字交叉路口设置的灯火控制系统来控制交通。单片机具有体积小、功能强可靠性高、价格低廉等一系列优点,不仅已成为工业测控领域普遍采用的智能化控制工具,而且已渗入到人们工作和和生活的各个角落,有力地推动了各行业的技术改造和产品的更新换代,应用前景广阔。随着电子技术的迅速发展,特别是随大规模集成电路出现,给人类生活带来了根本性的改变。因此利用单片机来控制十字交叉路口设置的灯火及显示有关提醒信息。
1.1  路口灯火控制及显示系统概述
本系统是车辆通行繁忙的十字交叉路口设置的灯火控制及显示系统,其特点是:道路较窄而车辆通行较多,支线、干线的车辆通行时间不等,并设有左右弯道通行时间,允许人工监控或修改各线通行时间,同时设有道路应急控制。16X16点阵LED液晶器可随着按键的不同,显示的内容也不相同。
1.2  设计任务
(1)干道:左右弯道:占时5秒。显示如上图所示的第四位;直道:占时35秒,显示如上图所示的高两为。
(2)支道:左右弯道;占时5秒,显示如上图所示的二三位;直道:占时25秒,显示如上图所示的第0位。
(3)同时的几位灯在直道时那位亮,在弯道时那位亮。
(4)在绿灯转红灯时,闪烁3次,变黄延时五秒变红灯。
(5)按一个按键K1时,显示为雨天小心。
(6)按一个按键K2时,显示为一路顺风。
1.3  系统主要功能
其主要功能有:在正常的情况下,干道通行时间为40秒,其中左右弯道占时5秒,直道通行时间为25秒,其中左右弯道占时5秒,直道占时20秒。并且能够在人工监控状态下,干道、支道通行时间通过键盘修改或通过开关人为控制。在下雨天,则按“K1”键,16X16点阵LED液晶器显示“雨天小心”。在晴天,则按“K2”键,显示“一路顺风”。
第二节
路口灯火控制及显示系统硬件设计
灯火控制系统的硬件设计以MCS-51单片机为主控器,包括一个扩展存储器(这里用的是32K的6264型号的EEPROM、 一个25键键盘、I/O口的扩展(8255)、地址的锁存(74LS373或74LS273)、还有反向器(7407)、8X8点阵LED液晶器4块、4~16线译码器74LS154一块、三极管S8050和S8550各16根、4.7KΩ电阻32根、二个8255A芯片、还有十二盏指示灯。
2.1  系统的硬件构成及功能
(1)硬件设计(硬件结构图如下图所示)
                                                                       
                                                         
                                                   图 2
16X16点阵LED液晶显示电路:
硬件系统在该系统中的作用主要是进行数据的传送,有关逻辑的计算,并且提供显示,人为的进行数据的修改,系统的启动,停止等等。此外系统运行的安全可靠性要靠硬件系统来实现。
硬件系统的设计还应满足以下原则:
(1) 满足系统的设计要求,易于操作维护。
(2) 系统功能灵活,便于扩展。
(3) 具有自动诊断功能。
硬件系统的设计主要包括下面的工作:
a:扩展存储器:本系统设计中用到的是6264EPROM即可做程序存储器又可做数据存储器。它跟2个74LS373地址锁存器相连,用到A0——A14共15根地址线,所以他的寻址范围0——7FFFH。
b .配置25键键盘,其中“A”为启动键,B为停止键.扩展并行接口8255A.c键为修改键,e,f键人工控制键。在该系统中列线用到的是8279的SL经过74LS138的8根列线中的3跟Y0,Y1,Y5,行线是8279的RL8根输出线。
2.2  设计中用到的芯片及其功能
2.2.1 8251芯片的说明
  8051芯片

MCS-51系列单片机芯片均为40条引脚,HMOS工艺制造的芯片用双列直插(DIP)方式封装,其引脚示意及功能分类如图1.2所示。

各引脚功能说明如下:
1.        主电源引脚
Vcc(40脚):接+5V电源正端。
Vss(20脚):接+5V电源地端。
    2. 外接晶体引脚
XTAL1(19脚):接外部石英晶体的一端。在单片机内部,它是一个反相放大器的输入端,这个放大器构成了片内振荡器。当采用外部时钟时,对于HMOS
单片机,该引脚接地;对于CHMOS单片机,该引脚作为外部振荡信号的输入端。
XTAL2(18脚):接外部石英晶体的另一端。在单片机内部,它是片内振荡器的反相放大器的输出端。当采用外部时钟时,对于HMOS单片机,该引脚作为外部振荡信号的输入端;对于CHMOS单片机,该引脚悬空不接。
2.        输入/输出引脚
    (1) P0口(39~32脚):P0.0~P0.7统称为P0口。在不接片外存储器与不扩展I/O口时,可作为准双向输入/输出口。在接有片外存储器或扩展I/O口时,P0口分时复用为低8位地址总线和双向数据总线。
    (2) P1口(1~8脚):P1.0~P1.7统称为P1口,可作为准双向I/O口使用。对于52子系列,P1.0与P1.1还有第二功能:P1.0可用作定时器/计数器2的计数脉冲输入端T2,P1.1可用作定时器/计数器2的外部控制端T2EX。
(3) P2口(21~28脚):P2.0~P2.7统称为P2口,一般可作为准双向I/O口使用;在接有片外存储器或扩展I/O口且寻址范围超过256字节时,P2口用作高8位地址总线。
                  表2.1   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     外部数据存储器读选通信号输入端,低电平有效
(4) P3口(10~17脚):P3.0~P3.7统称为P3口。除作为准双向I/O口使用外,还可以将每一位用于第二功能,而且P3口的每一条引脚均可以独立定义为第一功能的输入输出或第三功能。P3口的第二功能如表2.1所示。
4. 控制线
   (1) ALE/PROG(30脚):地址锁存有效信号输入端。ALE在每个机器周期内输出两个脉冲。在访问片外程序存储器期间,下降沿用于控制锁存P0输出的低8位地址;在不访问片外程序存储器期间,可作为对外输出的时钟脉冲或用于定时目的。但要注意,在访问片外数据存储器期间,ALE脉冲会跳空一个,此时作为时钟输出就不妥了。
对于片内含有EPROM的机型,在编程期间,该引脚用作编程脉冲PROG的输入端。
   (2) PSEN(29脚):片外程序存储器读选通信号输出端,低电平有效。当从外部程序存储器读取指令或常数期间,每个机器周期该信号两次有效,以通过数据总线P0口读回指令或常数。在访问片外数据存储器期间,PSEN信号将不再出现。
   (3) RST/VPD引脚(9脚):RST即为RESET,VPD为备用电源。该引脚为单片机的上电复位或掉电保护端。当单片机振荡器工作时,该引脚上出现持续两个机器周期的高电平,就可实现复位操作,使单片机回复到初始状态。上电时,考虑到振荡器有一定的起振时间,该引脚上高电平必须持续10ms以上才能保证有效复位。
当Vcc发生故障,降低到低电平规定值或掉电时,该引脚可接上备用电源VPD(+5V)为内部RAM供电,以保证RAM中的数据不丢失。
   (4)EA/Vpp(31脚):EA为片外程序存储器选用端。该引脚有效(低电平)时,只选用片外程序存储器,否则单片机上电或复位后选用片内程序存储器。
对于片内含有EPROM的机型,在编程期间,此引脚用作21V编程电源Vpp的输入端。
综上所述,MCS-51系列单片机的引脚可归纳为以下两点:
(1)        单片机功能多,引脚数少,因而许多引脚都有第二功能。
(2)        单片机对外呈现3总线形式,由P2、P0口组成16位地址总线;由P0
口分时复用为数据总线;由ALE、PSEN、RST、EA与P3口中的INT0、INT1、T0、T1、WR、RD共10个引脚组成控制总线,如图2.1(b)所示。由于是16位地址线,因此,可使片外存储器的寻址范围达到64KB。
2.2.2  8279芯片的说明
该芯片为一种专用的键盘显示器接口芯片,能对显示器进行自动扫描,能自动识别键盘的键号,大大减轻了CPU的负担。在这个系统中它主要的作用是形成键盘,显示器。提供人工控制的物理系统。
8279的组成:数据缓冲器,I/O控制逻辑,控制和定时寄存器及定时与控制电路,扫描计数器,回复
缓冲器,键盘去抖动及控制电路,FIFO/传感器RAM及其状态寄存器,显示RAM及显示地址寄存器等组成。
8279的结构及引脚功能:
8279的内部结构由数据缓冲器,I/O控制逻辑,控制和定时器及定时控制电路,扫描计数器,回复缓冲器,键盘去抖动及控制电路,FIFO/传感器RAM及其状态寄存器,显示RAM及显示地址寄存器等部分组成.
(1)数据缓冲器及I/O控制逻辑   数据缓冲器是一个双向缓冲器,它连接内部总线和外部总线,用于传送CPU和8279之间的命令,数据和状态.I/O控制逻辑完成对芯片的读写控制,芯片选择以及端口选择.
(2)控制和定时器及定时用来寄存操作命令字.
(3)扫描计数器   扫描计数器有两种工作方式.一种为外部译码方式.计数器以二进制方式计数,4位计数状态从扫描线SL0-SL3输出,经外部译码器译码后,形成16位扫描信号;另一种为内部译码方式.该方式下,扫描计数器的低二位经内部译码后从SL0-SL3输出,形成4位扫描信号.
(4)回复缓冲器,键盘去抖动及控制电路   回复缓冲器缓冲并锁存来自SL0-SL7八根回复线的回复信号.
(5)FIFO/传感器RAM及其状态寄存器   FIFO/传感器RAM是一个双重功能的8*8RAM.
(6)显示RAM及显示地址寄存器   显示RAM用来存储显示数据,容量为16*8位.在显示过程中,存储的显示数据轮流从显示寄存器输出.
在灯火控制实验中,它的片选信号线接Q0、数据选择输入线接的是Q1,所以他的控制口地址是FF82H,数据口地址是FF80H,中断是悬空的,因为键盘不是中断方式是查询方式。
2.2.3  其它器件的说明
6264静态RAM扩展
6264是8k的8位静态随机存储器芯片.CMOS工艺制作,单一+5V供电,28脚双列直插式封装.额定功耗为200MW.典型存取时间为200ns.地址线为A0-A14.
74LS373地址锁存器
74LS373地址锁存器是透明的带有三态门的八D锁存器.它的锁存控制端可直接与单片机的锁存控制信号端ALE相连,在ALE下降沿进行地址锁存.当三态门的使能端信号线/E为低电平时.三态门处于导通状态,允许Q端输出;当/E端为高电平时,输出三态门断开.输出端对外部电路呈高阻状态.
74.LS138译码器
74LS138译码器有3个输入端,组成8种输入状态,输出端有8个,每个输出端对应8种输入状态的一种,低电平有效。此外还有3个使能端E3,E2,E1,这3个使能端必须同时输入有效电平,译码器才能工作,既E3=1,E2=0,E1=0。
8255可编程接口芯片
(1) 三个并行I/O口-A口,B口,C口在此设计中用到了A,B两个口。
(2) 工作方式控制电路;
(3) 读写控制逻辑电路;
(4) 数据总线缓冲器;
引脚功能:CS片选信号,RD读入信号线,WR写入信号,A1,A0—端口选择信号;RESET复位信号线,Vcc,GND等。
74LS240驱动器
    在该系统中它是作为线驱动器起驱动作用的,它的输入端1A1----1A4,2A1----2A4,与8279的输出端相连,输出端与双色LED灯相连。其引脚图为附件。
第3节   系统的软件设计
在该系统的软件设计中用到的是模块程序设计,主要的模块程序是键盘的模块程序,它包括显示的模块程序,通过软件的设计使系统有简易的监控功能,通过键盘可以修改通行时间和启动或停止人工控制的路口灯火控制系统.
                                          
3.1  系统主程序设计
3.1.1程序框图及说明
在本次设计中最后对键盘程序方案流程图的确定如下图所示:
在本次设计中键盘采用查询方式,故在键盘程序的开始必须对现场进行保护,同时在查询结束时不能影响相应程序段中在上一时刻的计数值,故在对键盘进行查询完毕之后也必须能够把正
确的返回值送给断点,不能在此出现死循环(在调试中有此情况发生)。按照如下图,所示框图进行设计的调试后发现程序能够很好的从死循环中跳出,继续执行其后的程序。但也必须考虑到在需要的时候不妨让它暂时的进入到死循环状态。比如在按下B、E、F,这三个键时,就必须让程序在这里停止,不能让它返回。图中是让它去继续查询有无别的按键,也就是说在这几个键被按下的时候,如果没有别的按键,它就一直在此等待,执行自己相应的功能。
                    
                                       
          图 1 初始化                            图 2 8255干通支断程序
                                    
          图 3 8255干断支通程序  
                                       图 4 88255干通支断转换状态程序
  
                 
图 5 中断服务程序
3.2显示子程序及说明
主程序在刚上电时对系统进行初始化,然后读一次键开关状态,由键标志位决定显示的内容。
   
图 6 显示子程序
3.3延时子程序的计算
采用寄存器R0、R1、R2作为记数值,R2中暂存1,R1中存0。当减1后变为255即R1中存数256。R0中存数#0B2H即178。
DELAY2延时为:
N=(2+2+2+1+1+2*178)+255*(1+1+2+2*178)=9164。
共计9164个指令周期,而系统晶振为11.0592。所以t=12/11.0592=1.085(微秒)
延时DELAY2为:
T=9164*1.085/1000000=0.09996
约等于0.1(秒)
通过改变R2的值可以改变延时的秒数。
3.4各键的功能
各键功能:
在本次设计中主要定义和调用了以下几个键及其功能:A、B、C、D、E和F键。        各键功能如下所示:
A键  用于启动主程序,如果没有A键按下,则一直处于等待状态,所有的灯在此时为黄色,主程序不被执行。
B键  用于在工作过程中对程序做急停处理,在键B被按下的时候主程序停止不动(在此要
注意对断点的保护问题)。直到当有别的键被按下时才转至相应键的功能支执行相应的程序。
C键 用于做对任意时段时间的修改及其处理并且能够自动返回到该时段的初始状态重新进行计数(此数值即修改后的数值)。
E健 用于人工控制支断干通状态。无别的键按下便一直保持该状态。
F健 用于人工控制支通干断状态。无别的键按下便一直保持该状态。
结束语
这次课程设计我是把交通灯与16X16 LED液晶显示器一起联合起来写的,因为对这些项目不太熟悉,只是结合自已平时来写,因此有可能不是正确的。但经过这次课程设计,虽说没做出成品,程序的设计也是参考网络上的资料及书上的资料,因为我是计算机专业的,本身对电子方面的器件也不太熟悉,电路设计也不是太清楚。自已从中虽说没真正了解其真正的设计过程,但是从参考中得到一些启示,了解到在处理一些项目时,应该从哪几方面入手,知道哪个问题应该从哪方面下手,知道这里所使用的器件是做什么用途,为自已以后去设计相类似的项目打下基础,增加自已在单片机方面的一些经验。通过这次课程设计,我从中了解到原来在我们的生活中各个方面都用到了单片机,单片机影响了人们的生活,因此我们作为计算机专业的学生,应该在这方面多下些功夫,等以后有机会,去设计真正的成品。
参考文献
[1] 范风强 兰婵丽,《单片机语言C51应用实战集锦(修订版)》,电子工业出版社 北京
[2] 李光飞  楼苗然, 《51系列单片机        》,北京航空航天大学出版社         
[3] 潭浩强 ,《MCS-51单片机应用教程》,清华大学出版社                                 
[4] 梁廷贵 , 《现代集成电路手册》, 科学技术文献出版社
源程序
Z8279        EQU        0FF82H        ;8279状态/命令口地址
D8279        EQU        0FF80H  ;8279数据口地址
LEDMOD        EQU        00H     ;左边输入八位字符显示
                        ;外部译码键扫描方式,双键互锁
LEDFEQ        EQU        2FH     ;扫描速率
LEDCLS        EQU        0C1H    ;清除显示RAM
LEDWR0        EQU        80H     ;设定的将要写入的显示RAM地址      
READKB  EQU     40H     ;读FIFO RAM地址0的命令字
ORG                0000H
LJMP                START      ;主程序入口
ORG                0003H
LIMP                STARTA     ;开外部中断
ORG                000BH
RETI
ORG                0013H
LIMP                STARTB     ;开外部中断
                                             
显示程序:
ORG 0000H
        MOV DPTR,#8406H ;8255控制口地址  
        MOV A,        #80H    ;命令字传入控制口
        MOVX @DPTR,A
        LJMP START      ;开始程序     
        ORG 0040H
START: MOV 16H,#35      ;设定显示秒数
        MOV SP,#30H     
        LCALL STATUS0   ;调用初始状态全红灯
STARTA: MOV                DPTR,#TAB1  
          PUSH     DPH
          PUSH     DPL
                  LJMP            START1
STARTB: MOV                DPTR,#TAB2
          PUSH     DPH
          PUSH     DPL
                  LJMP            START1
START:  JZ                  P3.2,STARTA
JZ                P3.3,STARTB
MOV                DPTR,#TAB
                  LJMP            START1
START1: LACALL   CLEARMEN
MOV                R4,#O3H                ;相临字符串之间的间隔距离
MOV                R5,#40H                ;1帧显示时间控制
LJMP                FUZHI
初始化程序:
CLEARMEN:MOV        A,#0FFH
MOV                R2,#50H
MOV DPTR, #1FFFH
MOV   A,   #80H
MOVX  @DPTR,  A
ZERO:   MOV          R2,A                        ;50H~6FH内存单元清零
INC                R2
CJNE                R2,#6FH,ZERO
RET
扫描子程序:
DISPLAY: MOV          A,#0FFH
           MOV  DPTR,#1FFCH
           MOVX  @DPTR,  A
           MOV  DPTR,#1FFDH
MOVX   @DPTR,  A                        ;关扫描
MOV    DPTR, #1FFEH
MOVX   @DPTR,A
                       
MOV                R6,#OFH  ;关显示数据
MOV                R2,#6FH
DISLOOP:
MOV  DPTR,#1FFDH
          MOV    A,  R2
          MOVX  @DPTR,A
DEC                R2
MOV    A,R2
MOV  DPTR,#1FFCH
          MOV    A,  R2
MOVX  @DPTR,A
MOV  DPTR,#1FFEH
          MOV    A,  R6
MOVX  @DPTR,A
LCALL        DL1MS                        ;延时程序
JZ                R6,PAND                ;判断结束跳转程序
DEC                R2
DEC                R6
CIRCLE:   
LCALL STATUS1   ;南北绿灯东西红灯
LCALL STATUS2   ;南北绿灯闪转黄灯东西红灯
LCALL STATUS3   ;南北红灯东西绿灯
LCALL STATUS4   ;南北红灯东西绿灯闪转黄灯
LJMP                DISLOOP
赋值程序:
FUZHI:  POP  DPL
          POP  DPH
MOV                A,#00H
                  MOV                R0,#00H
DAT1:          MOV                A,@A+DPTR
MOV                6FH,A
LCALL        DISPLAY
判断程序:
PAND:          DJNZ                R5,DISPLAY
                  CJNE                R0,#5FH,PAND2
                  LJMP                FUZHI2
PAND2:  ACALL   LEFT1
MOV                A,R0
INC                A
MOV                R0,A
                  LJMP                DAT1
FUZHI2:  INC                R4
JZ                R4,START
ACALL        LEFT1
LCALL        DISPLAY
左移程序:
LEFT1:  MOV                R2,#50H
MOV                A,#51H
MOV                R2,A
INC                R2
INC                A
CJNE                R2,#6FH,LEFT1
RET
延时程序:
DL1MS:  MOV                R7,#250                ;延时1        mS
L1:          DJNZ     R7,L1
                  RET
显示数据表:
TAB1:DB  00H,00H,00H,00H,00H,10H,10H,0F0H                    ;雨
DB  10H,10H,00H,00H,00H,00H,00H,00H
DB  00H,00H,00H,7FH,01H,06H,09H,7FH
DB  06H,09H,11H,21H,7FH,00H,00H,00H
DB  00H,00H,00H,00H,00H,10H,10H,0F0H                    ;天
DB  10H,10H,00H,00H,00H,00H,00H,00H
DB  00H,40H,20H,10H,08H,04H,02H,01H
DB  01H,02H,04H,08H,10H,20H,40H,00H
DB  00H,00H,00H,00H,80H,40H,00H,0F0H                ;小
DB  00H,40H,80H,00H,00H,00H,00H,00H
DB  00H,00H,02H,01H,00H,10H,20H,3FH
DB  00H,00H,00H,02H,01H,00H,00H,00H
DB  00H,00H,80H,80H,00H,00H,00H,80H                 ;心
DB  00H,00H,00H,00H,00H,00H,00H,00H
DB  02H,01H,00H,00H,01H,02H,04H,06H
DB  09H,0AH,08H,08H,0AH,0DH,0AH,04H
TAB2:DB  00H,00H,00H,00H,00H,00H,00H,00H                    ;一
DB  00H,00H,00H,00H,00H,04H,0FFH,0FEH
DB  00H,00H,00H,00H,00H,00H,00H,00H
DB  00H,00H,00H,00H,00H,00H,00H,00H
DB  00H,40H,7CH,40H,44H,0FCH,45H,88H                ;路
DB  46H,50H,44H,20H,7CH,50H,50H,88H
DB  13H,06H,5CH,04H,50H,0F8H,50H,88H
DB  50H,88H,5CH,88H,0E0H,0F8H,00H,88H
DB  00H,04H,47H,0FEH,54H,20H,54H,40H                ;顺
DB  55H,0FCH,55H,04H,55H,24H,55H,24H
DB  55H,24H,55H,24H,55H,24H,55H,24H
DB  54H,50H,44H,48H,84H,86H,01H,02H
DB  00H,10H,3FH,0F8H,20H,10H,28H,50H                    ;风
DB  24H,50H,22H,90H,22H,90H,21H,10H
DB  21H,10H,22H,90H,22H,90H,24H,50H
DB  28H,50H,30H,12H,40H,0AH,80H,06H
键盘服务程序:
FUWU00:      
        PUSH                 11H                              ;保护现场
        PUSH                 PSW
        LCALL        GETKEY                               ;判断是否有键输入
        CJNE                 A,                #0FFH,        JAP0
        MOV                 50H,                B
        MOV                 A,                50H
        CJNE     A,            #0BH,        PADJ           ;是否为B键
        LCALL         KEYB                                 ;调用B键服务功能
WAIT0:      
LCALL        GETKEY                                          ;等待有键输入
        CJNE                 A,                #0FFH,        WAIT0
        MOV             50H,                B
        MOV                 A,                50H
        CJNE                 A,                #0AH,        PADJ           ;是否为A键
        LCALL         INIT8279                             ;清屏
        SJMP                 JAP0                             ;返回断点
PADJ:      
MOV                 A,                50H           
        CJNE                 A,                #0CH,        PDJE0         ;判断是否为C键
        LCALL        KEYC                             ;调用C键功能
        LCALL        KEYD                             ;调用D键功能
PDJE0:      
MOV                 A,                50H
        CJNE                 A,                #0EH,        PDJF0         ;判断是否为E键
        LCALL        KEYE                             ;调用E键功能
PDJF0:      
MOV                 A,                50H
        CJNE                 A,                #0FH,        WAIT0         ;是否为F键
        LCALL        KEYF                                ;调用F键功能
        LJMP                 WAIT0                            ;继续等待按键
JAP0:      
POP                 PSW                                 ;弹出堆栈
        POP                 11H
        RET                                            ;返回
FUWU01:      
        PUSH                 11H
        PUSH                 PSW
        LCALL        GETKEY
        CJNE                A,                #0FFH,        JAP01
        MOV                 50H,                B
        MOV                 A,                50H
        CJNE                 A,                #0BH,        PADJ1
        LCALL        KEYB
WAIT01:      
LCALL        GETKEY
        CJNE                 A,                #0FFH,        WAIT01
        MOV                 50H,                B
        MOV                 A,                50H
        CJNE                 A,                #0AH,        PADJ1
        LCALL        INIT8279
        MOV                 DPTR,        #8400H
        MOV                 A,                #96H
        MOVX                @DPTR,        A
        SJMP                 JAP01
PADJ1:      
MOV                 A,                50H
        CJNE                 A,                #0CH,        PDJE01
        LCALL        KEYC
        LCALL        KEYD1
PDJE01:      
MOV                 A,                50H
        CJNE                 A,                #0EH,        PDJF01
        LCALL        KEYE
PDJF01:      
MOV                 A,                50H
        CJNE                 A,                #0FH,        WAIT01
        LCALL        KEYF
        LJMP                 WAIT0
JAP01:      
POP                 PSW
        POP                11H
        RET
FUWU02:      
        PUSH                 11H
        PUSH                PSW
        LCALL        GETKEY
        CJNE                 A,                #0FFH,        JAP02
        MOV                 50H,                B
        MOV                 A,                50H
        CJNE                 A,                #0BH,        PADJ2
        LCALL        KEYB
WAIT02:      
LCALL        GETKEY
        CJNE                 A,                #0FFH,        WAIT02
        MOV                 50H,                B
        MOV                 A,                50H
        CJNE                 A,                #0AH,        PADJ2
        LCALL         INIT8279
        SJMP                  JAP02
PADJ2:      
MOV                 A,                50H
        CJNE                 A,                #0CH,        PDJE02
        LCALL        KEYC
        LCALL        KEYD2
PDJE02:      
MOV                 A,                50H
        CJNE                 A,                #0EH,        PDJF02
        LCALL        KEYE
PDJF02:      
MOV                 A,                50H
        CJNE                 A,                #0FH,        WAIT02
        LCALL        KEYF
        LJMP                 WAIT0
JAP02:      
POP                 PSW
        POP                 11H
        RET
FUWU03:      
        PUSH                 11H
        PUSH                 PSW
        LCALL        GETKEY
        CJNE                 A,                #0FFH,        JAP03
        MOV                 50H,                B
        MOV                 A,                50H
        CJNE                 A,                #0BH,        PADJ3
        LCALL        KEYB
WAIT03:      
LCALL        GETKEY
        CJNE                 A,                #0FFH,        WAIT03
        MOV                50H,                B
        MOV                 A,                50H
        CJNE                 A,                #0AH,        PADJ3
        LCALL        INIT8279
        SJMP                 JAP03
PADJ3:      
MOV                 A,                50H
        CJNE                 A,                #0CH,        PDJE03
        LCALL        KEYC
        LCALL        KEYD3
PDJE03:      
MOV                 A,                50H
        CJNE                 A,                #0EH,        PDJF03
        LCALL        KEYE
PDJF03:      
MOV                 A,                50H
        CJNE                 A,                #0FH,        WAIT01
        LCALL        KEYF
        LJMP                 WAIT0
JAP03:      
POP                PSW
        POP                 11H
        RET
键盘子程序:
KEYB:      
MOV                 R5,                #0BH                       ;在第七位显示字符B
        MOV                 R4,                #06H
      
LCALL        ERROR                                          ;调用出错程序
        RET
KEYC:      
LCALL        INIT8279         
        MOV                 R5,                #0CH                        ;在第七位显示字符C
        MOV                 R4,                #06H
        LCALL        DISLED                                          ;调用显示
WAIT1:      
LCALL        GETKEY                                             ;等待十位数据输入
        CJNE                 A,                #0FFH,        WAIT1
        MOV                 R5,                B
        MOV                 31H,                B
        MOV                 R4,                #01H                        ;把数据送第二位显示
        LCALL        DISLED            
WAIT2:      
LCALL        GETKEY                                      ;等待个位数据输入
        CJNE                 A,                #0FFH,        WAIT2
        MOV                 R5,                B
        MOV                 30H,                B
        MOV                 R4,                #0                          ;把数据送第一位显示
     LCALL        DISLED
        RET
KEYD:      
MOV                 A,                31H                          ;对十位数据进行处理
        MOV                 B,                #10
        MUL                 AB
        MOV                 B,                30H
        ADD                 A,                B
        MOV                 16H,                A                            ;把处理后的数据送入16H单元
        AJMP                 CIRCLE0                               ;转到干道时间显示
        RET
KEYD1:      
MOV                A,                31H
        MOV                 B,                #10
        MUL                 AB
        MOV                 B,                30H
        ADD                 A,                B
        MOV                 17H,                A                           ;处理后的数据送入17H单元
        AJMP                 CIRCLE1                              ;转到干道的延时5S时间显示
        RET
KEYD2:      
MOV                 A,                31H
        MOV                 B,                #10
        MUL                 AB
        MOV                 B,                30H
        ADD                 A,                B
        MOV                 18H,                A                          ;处理后的数据送入18H单元
        AJMP                 CIRCLE2                             ;转到支道时间显示
        RET
KEYD3:      
MOV                 A,                31H
        MOV                 B,                #10
        MUL                 AB
        MOV                 B,                30H
        ADD                 A,                B
        MOV                 19H,                A                               ;处理后的数据送入19H单元
        AJMP                 CIRCLE3                                  ;转到支道的延时5S时间显示
        RET
KEYE:      
MOV                 R5,                #0EH                            ;把字符E送到第七位显示
        MOV                 R4,                #06H
        LCALL        DISLED
        MOV                 DPTR,        #8400H                          ;控制交通灯为南北绿,东西红
        MOV                 A,                #96H
        MOVX                 @DPTR,         A
        RET
KEYF:      
MOV                 R5,                #0FH                            ;把字符F送到第七位显示
        MOV                 R4,                #06H
        LCALL        DISLED
        MOV                 DPTR,        #8400H                          ;控制交通灯为南北红,东西绿
        MOV                 A,                #69H
        MOVX                 @DPTR,        A
        RET
STATUS0:
        MOV DPTR , #8400H
        MOV A,#0FH
        MOVX @DPTR, A
        MOV R2,#10      ;延时一秒
        LCALL DELAY
        RET
STATUS1:                ;南北绿灯东西红灯
        MOV DPTR , #8400H
        MOV A,#96H
        MOVX @DPTR, A
        MOV 11H,16H
        LCALL INIT8279  ;初始化清屏     
STA1:   LCALL LC        ;处理并调用显示的数据
        MOV 15H,#07H    ;设定显示位数
        MOV 14H,#06H
        MOV R5,12H
        LCALL DISPLAY   ;调用显示
        MOV R5, 13H
        MOV R2,#10
        LCALL DELAY     ;延时
        LCALL FUWU      ;调用键盘服务程序
        DJNZ 11H,STA1   
        RET
STATUS2:                   ;南北绿灯闪转黄灯东西红灯
        MOV DPTR , #8400H
        MOV R3,#03H        ;闪烁三次
FLASH:
        MOV A,#9FH
        MOVX @DPTR,A
        MOV R2,#03H
        LCALL DELAY
        MOV A,#96H
        MOVX @DPTR,A
        MOV R2,#03H
        LCALL DELAY
        DJNZ R3,FLASH
        MOV A,#06H
        MOVX @DPTR,A
        LCALL INIT8279
        MOV 11H,#5          ;弯道时间
STA2:        LCALL LC
        MOV 14H,#4
        LCALL DISPLAY
        DJNZ 11H,STA2
        RET
STATUS3:                     ;南北红灯东西绿灯
        MOV DPTR , #8400H
        MOV A,#69H
        MOVX @DPTR, A
        MOV 11H,#25          ;设定支道时间
        LCALL INIT8279
STA3:   LCALL LC
        MOV 15H,#03H
        MOV 14H, #02H      
        LCALL DISPLAY
        DJNZ 11H,STA3
        RET
STATUS4:                      ;南北红灯东西绿灯闪转黄灯
        MOV DPTR , #8400H
        MOV R3,#03H
FLASH1:
        MOV A,#6FH
        MOVX @DPTR,A
        MOV R2,#03H
        LCALL DELAY
        MOV A,#69H
        MOVX @DPTR,A
        MOV R2,#03H
        LCALL DELAY
        DJNZ R3,FLASH1
      
MOV A,#09H
        MOVX @DPTR,A
        MOV 11H,#05H
        LCALL INIT8279
STA4:        LCALL LC
        MOV 14H,#00H        ;让该位显示0
        LCALL DISPLAY
        DJNZ 11H,STA4
        RET
INIT8279:                   ;初始化
        MOV        DPTR,#Z8279                       
        MOV        A,#LEDMOD
        MOVX        @DPTR,A
        MOV        A,#LEDFEQ
        MOVX        @DPTR,A
        MOV        A,#LEDCLS
        MOVX        @DPTR,A
        LCALL        DELAY
        RET
DISLED:                      ;显示字符子程序
        PUSH        DPH
        PUSH        DPL
        PUSH        ACC
        MOV        A,#LEDWR0
        ADD        A,R4
        MOV        DPTR,#Z8279
        MOVX        @DPTR,A
        MOV        DPTR,#LEDSEG
        MOV        A,R5
        MOVC        A,@A+DPTR
        MOV        DPTR,#D8279
        MOVX        @DPTR,A
        POP        ACC
        POP        DPL
        POP        DPH
        RET
DELAY:                      ;延时程序
        PUSH        0            ;延时100ms
        PUSH        1
       PUSH     2
DELAY1:        MOV        1,#0H
DELAY2:MOV 0,#0B2H
        DJNZ        0,$
        DJNZ        1,DELAY2
        DJNZ    2,DELAY1  
        POP     2
        POP        1
        POP        0
      
RET
DISPLAY:                    ;显示字符程序
        MOV R5,12H        ;存高位
        MOV R4,15H        ;显高位
        LCALL DISLED
        MOV R5,13H
        MOV R4,14H      
        LCALL DISLED
;        MOV R2,#10
;        LCALL DELAY
        ;MOV R5,#00H
        ;MOV R4,14H
        ;LCALL DISLED
        RET
LC:        MOV A, 11H         ;处理将要显示的数据
        MOV B,#0AH
        DIV AB
        MOV 12H,A
        MOV 13H,B
        RET
ERROR:        LCALL STATUS0      ;显示急停子程序
        MOV R5,#10H
        MOV R4,#05H
        LCALL DISLED
        MOV R5,#11H
        MOV R4,#04H
        LCALL DISLED
        MOV R5,#12H
        MOV R4,#03H
        LCALL DISLED
        MOV R5,#13H
        MOV R4,#02H
        LCALL DISLED
        RET
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表