51单片机模拟交通信号灯Word格式.docx

上传人:b****7 文档编号:22162532 上传时间:2023-02-02 格式:DOCX 页数:28 大小:47.78KB
下载 相关 举报
51单片机模拟交通信号灯Word格式.docx_第1页
第1页 / 共28页
51单片机模拟交通信号灯Word格式.docx_第2页
第2页 / 共28页
51单片机模拟交通信号灯Word格式.docx_第3页
第3页 / 共28页
51单片机模拟交通信号灯Word格式.docx_第4页
第4页 / 共28页
51单片机模拟交通信号灯Word格式.docx_第5页
第5页 / 共28页
点击查看更多>>
下载资源
资源描述

51单片机模拟交通信号灯Word格式.docx

《51单片机模拟交通信号灯Word格式.docx》由会员分享,可在线阅读,更多相关《51单片机模拟交通信号灯Word格式.docx(28页珍藏版)》请在冰豆网上搜索。

51单片机模拟交通信号灯Word格式.docx

(相应的功能流程图中已给出)

第二部分,

系统主干部分,即交通信号灯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

显示分钟低位

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1