51单片机模拟交通信号灯.docx
- 文档编号:11807968
- 上传时间:2023-06-02
- 格式:DOCX
- 页数:27
- 大小:48.13KB
51单片机模拟交通信号灯.docx
《51单片机模拟交通信号灯.docx》由会员分享,可在线阅读,更多相关《51单片机模拟交通信号灯.docx(27页珍藏版)》请在冰点文库上搜索。
51单片机模拟交通信号灯
《单片机实验》设计报告
交通信号灯模拟系统设计
交通信号灯模拟系统设计
摘要:
本系统以单片机为核心,主要应用单片机中定时器计数器,IO接口,中断系统等,结合8279键盘控制电路,数码管显示以及LED灯实现对十字路口交通信号灯的智能控制。
成功实现了利用单片机的定时器定时,令十字路口的红绿灯交替点亮和熄灭,通过按键对红绿灯点亮和熄灭时间进行调整及设置以及对红绿灯点亮和熄灭时间进行倒计时时间显示等基本功能。
并在此基础上进一步扩展,实现了对某些特殊功能的操作,如:
突发紧急情况,所有路线全部红灯,或南北向(主干道)强制绿灯通行,以及东西向(次干道)强制绿灯等,并且可在交通高峰期(系统默认上午7:
00-8:
00,下午17:
00-18:
00)自动修改绿灯时间。
系统功能完善,可操控性好,代码通俗易懂。
关键字:
51单片机交通信号灯智能控制8279
主要功能:
分析题目可知,有两种方案设计的方法,也即两条不同的主干分别对应不同的方案,方案一以键盘控制为主干,穿插对系统时钟的检测,倒计时的检测等,系统主干为循环检测键盘是否被按下并作出相应操作。
方案二以交通信号灯不同的点亮与熄灭状态为主干,即系统的主干是交通灯状态的循环,在循环中检测按键并作出相应调整。
此次试验选择的是方案二,因为对方案一的代码实现比较复杂。
信号灯的状态依次为:
南北绿灯,东西红灯->南北黄灯,东西红灯->南北红灯,东西绿灯->南北红灯,东西黄灯。
解决这部分问题的关键在于8279键盘扫描和相应的数码管显示,在实验帮助里有详细代码,另一个难点在于内置时钟和倒计时显示,这一部分内容通过使用单片机内的定时器能很好的解决,实验帮助五有详细的代码,通过定时器T1产生中断来定时,从而完成一秒的时间。
具体详见附录代码。
设计的主要内容:
第一部分,系统开机界面,设置及人机互动的按键控制,流程图如下:
(相应的功能流程图中已给出)
第二部分,
系统主干部分,即交通信号灯4个大循环以及循环内部检测按键完成拓展功能的实现,在循环内检测按键,实现相应功能,流程如下:
具体细节,例如定时器的设计等在纸质档报告中有详细分析,在这里就不赘述
总结:
总的来说这次试验比较成功,题目要求的功能基本都实现了,对于单片机汇编程序语言的理解也更深刻了,课本上的知识比较分散,每部分之间都没有什么联系,通过实验很好的把各部分之间联系起来,加深记忆,更便于理解。
唯一不足的是对于题目的考虑不周,特殊功能采用键盘扫描子程序解决了,而没有采用终端,使得程序应激性不好,没有很好的应变性。
在以后的编程中会注意这方面的内容。
附录:
(详细代码)
;-------------------------------------------------------
Z8279EQU0FF82H;8279状态/命令口地址
D8279EQU0FF80H;8279数据口地址
LEDMODEQU00H;左边输入八位字符显示
;外部译码键扫描方式,双键互锁
LEDFEQEQU2FH;扫描速率
LEDCLSEQU0C1H;清除显示RAM
LEDWR0EQU80H;设定的将要写入的显示RAM地址
READKBEQU40H;读FIFORAM地址0的命令字
;-------------------------------------------------------
ORG0000H
AJMPSTART
ORG001BH;INTT1入口地址
AJMPINT_T1
ORG0040H
START:
MOVSP,#60H
LCALLINIT8279;初始化8279
MOVR3,#0H;时
MOVR2,#0H;分
MOVR1,#0H;秒
MOVR7,#0H;倒计时时间
MOVR0,#20;50毫秒
MOV40H,#0;用于改变主次干道时长比
MOVR6,#0FFH;标志
MOVTMOD,#10H
MOVTL1,#00H;50毫秒的时间常数
MOVTH1,#4CH
SETBEX0
SETBET1
SETBEA;允许中断
;初始状态,全红灯
MOVDPTR,#8300H
MOVA,#0FH
MOVX@DPTR,A
;键盘操作
WAIT:
LCALLGETKEY;读键盘
CJNEA,#0FFH,CONT;判断是否有键输入
MOVA,B
CJNEA,#3CH,KEY_C;输入键是'C',转CLEAR_T
LCALLCLEAR_T
KEY_C:
CJNEA,#3AH,KEY_A;输入键是'A',转START_T
LCALLSTART_T
KEY_A:
CJNEA,#3DH,KEY_D;输入键是'D',转STOP_T
LCALLSTOP_T
KEY_D:
CJNEA,#3BH,KEY_E;输入键是'B',转SET_T
LCALLSET_T;设置系统时间
KEY_E:
CJNEA,#3FH,KEY_B;输入键是'F',转SET_COUT
LCALLSET_COUT;设置倒计时间
KEY_B:
CJNEA,#3EH,CONT;输入键是'E',转MONITOR
AJMPMONITOR
CONT:
CJNER6,#0FFH,WAIT;若无秒标志则循环
LCALLDISPLAY;显示时间
MOVR6,#0;清标志
SJMPWAIT;循环
MONITOR:
NOP
SJMP$;等待回到监控
;按键对应的功能
CLEAR_T:
;时间清零子程序
CLRTR1;关计数器
MOVR3,#0H;小时清零
MOVR2,#0H;分钟清零
MOVR1,#0H;秒清零
MOVR0,#20;10毫秒清零
MOVR7,#0H;倒计时时间清零
MOVR6,#0FFH;置秒标志
RET
START_T:
;电子钟计时子程序
;程序主要部分
;程序开始执行后将循环在这部分
CIRCLE:
LCALLSTATION1;南北绿灯,东西红灯
LCALLSTATION2;南北绿灯闪转黄灯,东西红灯
LCALLSTATION3;南北红灯,东西绿灯
LCALLSTATION4;南北红灯,东西绿灯闪转黄灯
LJMPCIRCLE
RET
;STATION1
STATION1:
;南北绿灯,东西红灯
MOVR7,30H
MOVA,R7
ADDA,40H
MOVR7,A
MOVDPTR,#8300H
MOVA,#96H;南北绿灯,东西红灯
MOVX@DPTR,A
SETBTR1
;扫描键盘
WO1:
LCALLGETKEY;读键盘
CJNEA,#0FFH,JB1;判断是否有键输入
MOVA,B
CJNEA,#3FH,PUSHB1;若是按下F,则清零并且返回
MOVR4,#1
LCALLGETWORD;读倒计时时间数
MOVA,B
MOVB,#10
DIVAB
SWAPA
ADDA,B
MOVR7,A;保存输入的值
INCA
MOV30H,A
LCALLDISPLAY;显示时间
PUSHB1:
CJNEA,#3BH,PUSHC1;若是按下B,则清零并且返回WAIT
CLRTR1;关计数器
MOVR3,#0H;小时清零
MOVR2,#0H;分钟清零
MOVR1,#0H;秒清零
MOVR0,#20;10毫秒清零
MOVR7,#0H;倒计时时间清零
MOVR6,#0FFH;置秒标志
AJMPWAIT
PUSHC1:
CJNEA,#3CH,PUSHD1
MOVR7,#3;若按下C,输出3秒红灯
MOVDPTR,#8300H
MOVA,#0FH
MOVX@DPTR,A
PUSHD1:
CJNEA,#3DH,PUSHE1;若按下D,南北绿灯5秒
MOVR7,#5
MOVA,#96H
MOVX@DPTR,A
PUSHE1:
CJNEA,#3EH,JB1
MOVR7,#5
MOVA,#69H
MOVX@DPTR,A
JB1:
CJNER7,#0H,WO1
RET
;STATION2
STATION2:
MOVR7,#3
MOVDPTR,#8300H
MOVA,#06H
MOVX@DPTR,A
SETBTR1
WO2:
LCALLGETKEY;读键盘
CJNEA,#0FFH,JB2;判断是否有键输入
MOVA,B
CJNEA,#3FH,PUSHB2;若是按下F,则清零并且返回
MOVR4,#1
LCALLGETWORD;读倒计时时间数
MOVA,B
MOVB,#10
DIVAB
SWAPA
ADDA,B
MOVR7,A;保存输入的值
INCA
MOV30H,A
LCALLDISPLAY;显示时间
PUSHB2:
CJNEA,#3BH,PUSHC2;若是按下B,则清零并且返回WAIT
CLRTR1;关计数器
MOVR3,#0H;小时清零
MOVR2,#0H;分钟清零
MOVR1,#0H;秒清零
MOVR0,#20;10毫秒清零
MOVR7,#0H;倒计时时间清零
MOVR6,#0FFH;置秒标志
AJMPWAIT
PUSHC2:
CJNEA,#3CH,PUSHD2
MOVR7,#3;若按下C,输出3秒红灯
MOVDPTR,#8300H
MOVA,#0FH
MOVX@DPTR,A
PUSHD2:
CJNEA,#3DH,PUSHE2;若按下D,南北绿灯5秒
MOVR7,#5
MOVA,#96H
MOVX@DPTR,A
PUSHE2:
CJNEA,#3EH,JB2
MOVR7,#5
MOVA,#69H
MOVX@DPTR,A
JB2:
CJNER7,#0H,WO2
RET
;STATION3
STATION3:
;南北红灯,东西绿灯
MOVR7,30H
MOVDPTR,#8300H
MOVA,#69H
MOVX@DPTR,A
SETBTR1
WO3:
LCALLGETKEY;读键盘
CJNEA,#0FFH,JB3;判断是否有键输入
MOVA,B
CJNEA,#3FH,PUSHB3;若是按下F,则清零并且返回
MOVR4,#1
LCALLGETWORD;读倒计时时间数
MOVA,B
MOVB,#10
DIVAB
SWAPA
ADDA,B
MOVR7,A;保存输入的值
INCA
MOV30H,A
LCALLDISPLAY;显示时间
PUSHB3:
CJNEA,#3BH,PUSHC3;若是按下B,则清零并且返回WAIT
CLRTR1;关计数器
MOVR3,#0H;小时清零
MOVR2,#0H;分钟清零
MOVR1,#0H;秒清零
MOVR0,#20;10毫秒清零
MOVR7,#0H;倒计时时间清零
MOVR6,#0FFH;置秒标志
AJMPWAIT
PUSHC3:
CJNEA,#3CH,PUSHD3
MOVR7,#3;若按下C,输出3秒红灯
MOVDPTR,#8300H
MOVA,#0FH
MOVX@DPTR,A
PUSHD3:
CJNEA,#3DH,PUSHE3;若按下D,南北绿灯5秒
MOVR7,#5
MOVA,#96H
MOVX@DPTR,A
PUSHE3:
CJNEA,#3EH,JB3
MOVR7,#5
MOVA,#69H
MOVX@DPTR,A
JB3:
CJNER7,#0H,WO3
RET
;STATION4
STATION4:
MOVR7,#3
MOVDPTR,#8300H
MOVA,#09H
MOVX@DPTR,A
SETBTR1
WO4:
LCALLGETKEY;读键盘
CJNEA,#0FFH,JB4;判断是否有键输入
MOVA,B
CJNEA,#3FH,PUSHB4;若是按下F,则清零并且返回
MOVR4,#1
LCALLGETWORD;读倒计时时间数
MOVA,B
MOVB,#10
DIVAB
SWAPA
ADDA,B
MOVR7,A;保存输入的值
INCA
MOV30H,A
LCALLDISPLAY;显示时间
PUSHB4:
CJNEA,#3BH,PUSHC4;若是按下B,则清零并且返回WAIT
CLRTR1;关计数器
MOVR3,#0H;小时清零
MOVR2,#0H;分钟清零
MOVR1,#0H;秒清零
MOVR0,#20;10毫秒清零
MOVR7,#0H;倒计时时间清零
MOVR6,#0FFH;置秒标志
AJMPWAIT
PUSHC4:
CJNEA,#3CH,PUSHD4
MOVR7,#3;若按下C,输出3秒红灯
MOVDPTR,#8300H
MOVA,#0FH
MOVX@DPTR,A
PUSHD4:
CJNEA,#3DH,PUSHE4;若按下D,南北绿灯5秒
MOVR7,#5
MOVA,#96H
MOVX@DPTR,A
PUSHE4:
CJNEA,#3EH,JB4
MOVR7,#5
MOVA,#69H
MOVX@DPTR,A
JB4:
CJNER7,#0H,WO4
RET
;电子钟停止的部分
STOP_T:
;电子钟停止计时子程序
CLRTR1
RET
;时钟设置部分
SET_T:
;设置初值子程序
CLRTR1;关计数器
MOVR4,#7
LCALLGETWORD;读小时数
CJNEA,#0FFH,INVALID;判断输入合法性
MOVA,B
ADDA,#232
JCINVALID;判断输入小时值<24
MOVA,B
MOVB,#10
DIVAB
SWAPA
ADDA,B
MOVR3,A;保存输入的值
MOVR4,#5
LCALLGETWORD;读分钟数
CJNEA,#0FFH,INVALID;判断输入合法性
MOVA,B
ADDA,#196
JCINVALID;判断输入分钟数<60
MOVA,B
MOVB,#10
DIVAB
SWAPA
ADDA,B
MOVR2,A;保存输入的值
MOVR4,#3
LCALLGETWORD;读秒钟数
CJNEA,#0FFH,INVALID;判断输入合法性
MOVA,B
ADDA,#196
JCINVALID;判断输入分钟值<60
MOVA,B
MOVB,#10
DIVAB
SWAPA
ADDA,B
MOVR1,A;保存输入的值
AJMPSET_TOK
SET_COUT:
MOVR4,#1
LCALLGETWORD;读倒计时时间数
CJNEA,#0FFH,INVALID;判断输入合法性
MOVA,B
MOVB,#10
DIVAB
SWAPA
ADDA,B
MOVR7,A;保存输入的值
INCA
MOV30H,A
AJMPSET_TOK
INVALID:
LCALLCLEAR_T;时间清零
SET_TOK:
LCALLDISPLAY;显示时间
RET
;读取输入按键的部分
GETWORD:
;读数子程序
WKEY1:
LCALLGETKEY;读键盘
CJNEA,#0FFH,WKEY1;无键输入,则再读
MOVA,B
ADDA,#0C6H
JCERROR1;判断输入是否大于9
MOVA,B
SUBBA,#30H
JCERROR1;判断输入是否小于0
MOVR5,A
LCALLDISLED;显示输入的字符
MOVB,#10
MULAB
PUSHACC;保存输入的值
WKEY2:
LCALLGETKEY;读键盘
CJNEA,#0FFH,WKEY2;无键输入则再读
MOVA,B
ADDA,#0C6H;判断输入是否大于9
JCERROR2
MOVA,B
SUBBA,#30H;判断输入是否小于0
JCERROR2
DECR4
MOVR5,A
LCALLDISLED;显示输入的字符
MOVB,A
POPACC
ADDA,B
MOVB,A;把得到的值存在B
MOVA,#0FFH;置合法输入标志
AJMPKEYOK
ERROR2:
POPACC
ERROR1:
MOVA,#0;置非法输入标志
KEYOK:
RET
;8279初始化
INIT8279:
;8279初始化子程序
PUSHDPH;保存现场
PUSHDPL
PUSHACC
LCALLDELAY;延时
MOVDPTR,#Z8279
MOVA,#LEDMOD;置8279工作方式
MOVX@DPTR,A
MOVA,#LEDFEQ;置键盘扫描速率
MOVX@DPTR,A
MOVA,#LEDCLS;清除LED显示
MOVX@DPTR,A
POPACC;恢复现场
POPDPL
POPDPH
RET
;读取键盘子程序
GETKEY:
;输入:
无;输出:
B:
读到的键码A:
按键的标志
PUSHDPH;保存现场
PUSHDPL
PUSHPSW
MOVDPTR,#Z8279
MOVXA,@DPTR;读8279状态
ANLA,#07H;屏蔽D7-D3
JNZGETVAL;判断是否有键输入
MOVA,#0H;置标志(无键输入)
SJMPNKBHIT
GETVAL:
MOVA,#READKB;读FIFORAM命令
MOVX@DPTR,A
MOVDPTR,#D8279
MOVXA,@DPTR;读键
ANLA,#3FH;屏蔽SHIFT和CTRL键
MOVDPTR,#KEYCODE;键码表起始地址
MOVCA,@A+DPTR;查表
MOVB,A;置返回键值
MOVA,#0FFH;置标志(有键输入)
NKBHIT:
POPPSW;恢复现场
POPDPL
POPDPH
RET
;T1定时器中断控制部分,
INT_T1:
;INT_T1中断服务子程序
PUSHDPH;保护现场
PUSHDPL
PUSHACC
PUSHPSW
MOVTL1,#00H;50毫秒定时常数
MOVTH1,#4CH
DJNZR0,EXIT;判断毫秒=0
MOVR0,#20;DELAY1SECOND
MOVR6,#0FFH;置秒标志
COUNT1:
MOVA,R7
ADDA,#99H
DAA
MOVR7,A;减1
CJNER1,#59H,SECOND;判断秒=59
MOVR1,#99H
CJNER2,#59H,MINUTE;判断分=59
MOVR2,#99H
CJNER3,#23H,HOUR;判断时=23
MOVR3,#99H
HOUR:
MOVA,R3
ADDA,#1;时加1
DAA
MOVR3,A
MINUTE:
MOVA,R2
ADDA,#1;分加1
DAA
MOVR2,A
SECOND:
MOVA,R1
ADDA,#1;秒加1
DAA
MOVR1,A
;判断是否到了特定时间7~8,17~18点
CJNER3,#7,EXIT1
MOV40H,#5
SJMPSHOWT
CJNER3,#00010111B,EXIT1
MOV40H,#5
SJMPSHOWT
EXIT1:
MOV40H,#0
SHOWT:
CJNER6,#0FFH,EXIT;若无秒标志则循环
LCALLDISPLAY;显示时间
MOVR6,#0;清标志
EXIT:
POPPSW;恢复现场
POPACC
POPDPL
POPDPH
RETI;中断返回
;实验帮助11延时部分,不太清楚具体功能是什么,可能是键盘消抖
DELAY:
;延时子程序
PUSH0;保存现场
PUSH1
MOV0,#0H
DELAY1:
MOV1,#0H
DJNZ1,$
DJNZ0,DELAY1
POP1;恢复现场
POP0
RET
;显示控制部分,但不是具体显示部分
DISPLAY:
MOVA,R3
ANLA,#0FH
ADDA,#10H
MOVR5,A
MOVR4,#6
LCALLDISLED;显示小时低位
MOVA,R3
SWAPA
ANLA,#0FH
MOVR5,A
MOVR4,#7
LCALLDISLED;显示小时高位
MOVA,R2
ANLA,#0FH
ADDA,#10H
MOVR5,A
MOVR4,#4
LCALLDISLED;显示分钟低位
MOVA,R2
SWAPA
ANLA,#0FH
MOVR5,A
MOVR4,#5
LCALLDISLED;显示分钟高位
MOVA,R1
ANLA,#0FH
ADDA,#10H
MOVR5,A
MOVR4,#2
LCALLDISLED;显示秒低位
MOVA,R1
SWAPA
ANLA,#0FH
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 单片机 模拟 交通 信号灯