51单片机模拟交通信号灯文档格式.docx
《51单片机模拟交通信号灯文档格式.docx》由会员分享,可在线阅读,更多相关《51单片机模拟交通信号灯文档格式.docx(23页珍藏版)》请在冰豆网上搜索。
(相应的功能流程图中已给出)
第二部分,
系统主干部分,即交通信号灯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;
关计数器
小时清零
分钟清零
秒清零
10毫秒清零
倒计时时间清零
置秒标志
RET
START_T:
电子钟计时子程序
程序主要部分
程序开始执行后将循环在这部分
CIRCLE:
LCALLSTATION1;
南北绿灯,东西红灯
LCALLSTATION2;
南北绿灯闪转黄灯,东西红灯
LCALLSTATION3;
南北红灯,东西绿灯
LCALLSTATION4;
南北红灯,东西绿灯闪转黄灯
LJMPCIRCLE
STATION1
STATION1:
MOVR7,30H
MOVA,R7
ADDA,40H
MOVR7,A
MOVA,#96H;
MOVX@DPTR,A
SETBTR1
扫描键盘
WO1:
CJNEA,#0FFH,JB1;
CJNEA,#3FH,PUSHB1;
若是按下F,则清零并且返回
MOVR4,#1
LCALLGETWORD;
读倒计时时间数
MOVA,B
MOVB,#10
DIVAB
SWAPA
ADDA,B
MOVR7,A;
保存输入的值
INCA
MOV30H,A
PUSHB1:
CJNEA,#3BH,PUSHC1;
若是按下B,则清零并且返回WAIT
AJMPWAIT
PUSHC1:
CJNEA,#3CH,PUSHD1
MOVR7,#3;
若按下C,输出3秒红灯
PUSHD1:
CJNEA,#3DH,PUSHE1;
若按下D,南北绿灯5秒
MOVR7,#5
MOVA,#96H
PUSHE1:
CJNEA,#3EH,JB1
MOVA,#69H
JB1:
CJNER7,#0H,WO1
STATION2
STATION2:
MOVR7,#3
MOVA,#06H
WO2:
CJNEA,#0FFH,JB2;
CJNEA,#3FH,PUSHB2;
MOVR4,#1
PUSHB2:
CJNEA,#3BH,PUSHC2;
PUSHC2:
CJNEA,#3CH,PUSHD2
PUSHD2:
CJNEA,#3DH,PUSHE2;
PUSHE2:
CJNEA,#3EH,JB2
JB2:
CJNER7,#0H,WO2
STATION3
STATION3:
WO3:
CJNEA,#0FFH,JB3;
CJNEA,#3FH,PUSHB3;
PUSHB3:
CJNEA,#3BH,PUSHC3;
PUSHC3:
CJNEA,#3CH,PUSHD3
PUSHD3:
CJNEA,#3DH,PUSHE3;
PUSHE3:
CJNEA,#3EH,JB3
JB3:
CJNER7,#0H,WO3
STATION4
STATION4:
MOVA,#09H
WO4:
CJNEA,#0FFH,JB4;
CJNEA,#3FH,PUSHB4;
PUSHB4:
CJNEA,#3BH,PUSHC4;
PUSHC4:
CJNEA,#3CH,PUSHD4
PUSHD4:
CJNEA,#3DH,PUSHE4;
PUSHE4:
CJNEA,#3EH,JB4
JB4:
CJNER7,#0H,WO4
电子钟停止的部分
STOP_T:
电子钟停止计时子程序
CLRTR1
时钟设置部分
SET_T:
设置初值子程序
MOVR4,#7
读小时数
CJNEA,#0FFH,INVALID;
判断输入合法性
ADDA,#232
JCINVALID;
判断输入小时值<
24
MOVR3,A;
保存输入的值
MOVR4,#5
读分钟数
ADDA,#196
判断输入分钟数<
60
MOVR2,A;
MOVR4,#3
读秒钟数
判断输入分钟值<
MOVR1,A;
AJMPSET_TOK
SET_COUT:
INVALID:
LCALLCLEAR_T;
时间清零
SET_TOK:
读取输入按键的部分
GETWORD:
读数子程序
WKEY1:
CJNEA,#0FFH,WKEY1;
无键输入,则再读
ADDA,#0C6H
JCERROR1;
判断输入是否大于9
SUBBA,#30H
判断输入是否小于0
MOVR5,A
LCALLDISLED;
显示输入的字符
MULAB
PUSHACC;
WKEY2:
CJNEA,#0FFH,WKEY2;
无键输入则再读
ADDA,#0C6H;
JCERROR2
SUBBA,#30H;
DECR4
MOVB,A
POPACC
MOVB,A;
把得到的值存在B
MOVA,#0FFH;
置合法输入标志
AJMPKEYOK
ERROR2:
ERROR1:
MOVA,#0;
置非法输入标志
KEYOK:
8279初始化
INIT8279:
8279初始化子程序
PUSHDPH;
保存现场
PUSHDPL
PUSHACC
LCALLDELAY;
延时
MOVDPTR,#Z8279
MOVA,#LEDMOD;
置8279工作方式
MOVA,#LEDFEQ;
置键盘扫描速率
MOVA,#LEDCLS;
清除LED显示
POPACC;
恢复现场
POPDPL
POPDPH
读取键盘子程序
GETKEY:
输入:
无;
输出:
B:
读到的键码A:
按键的标志
PUSHPSW
MOVDPTR,#Z8279
MOVXA,@DPTR;
读8279状态
ANLA,#07H;
屏蔽D7-D3
JNZGETVAL;
MOVA,#0H;
置标志(无键输入)
SJMPNKBHIT
GETVAL:
MOVA,#READKB;
读FIFORAM命令
MOVDPTR,#D8279
读键
ANLA,#3FH;
屏蔽SHIFT和CTRL键
MOVDPTR,#KEYCODE;
键码表起始地址
MOVCA,@A+DPTR;
查表
置返回键值
置标志(有键输入)
NKBHIT:
POPPSW;
T1定时器中断控制部分,
INT_T1:
INT_T1中断服务子程序
保护现场
50毫秒定时常数
DJNZR0,EXIT;
判断毫秒=0
DELAY1SECOND
COUNT1:
ADDA,#99H
DAA
减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
MOVR3,A
MINUTE:
MOVA,R2
分加1
MOVR2,A
SECOND:
MOVA,R1
秒加1
MOVR1,A
判断是否到了特定时间7~8,17~18点
CJNER3,#7,EXIT1
MOV40H,#5
SJMPSHOWT
CJNER3,#00010111B,EXIT1
EXIT1:
MOV40H,#0
SHOWT:
CJNER6,#0FFH,EXIT;
清标志
EXIT:
RETI;
中断返回
实验帮助11延时部分,不太清楚具体功能是什么,可能是键盘消抖
DELAY:
延时子程序
PUSH0;
PUSH1
MOV0,#0H
DELAY1:
MOV1,#0H
DJNZ1,$
DJNZ0,DELAY1
POP1;
POP0
RET
显示控制部分,但不是具体显示部分
DISPLAY:
ANLA,#0FH
ADDA,#10H
MOVR4,#6
显示小时低位
MOVR5,A
显示小时高位
MOVR4,#4
显示分钟低位
显