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

上传人:b****3 文档编号:11807968 上传时间:2023-06-02 格式:DOCX 页数:27 大小:48.13KB
下载 相关 举报
51单片机模拟交通信号灯.docx_第1页
第1页 / 共27页
51单片机模拟交通信号灯.docx_第2页
第2页 / 共27页
51单片机模拟交通信号灯.docx_第3页
第3页 / 共27页
51单片机模拟交通信号灯.docx_第4页
第4页 / 共27页
51单片机模拟交通信号灯.docx_第5页
第5页 / 共27页
51单片机模拟交通信号灯.docx_第6页
第6页 / 共27页
51单片机模拟交通信号灯.docx_第7页
第7页 / 共27页
51单片机模拟交通信号灯.docx_第8页
第8页 / 共27页
51单片机模拟交通信号灯.docx_第9页
第9页 / 共27页
51单片机模拟交通信号灯.docx_第10页
第10页 / 共27页
51单片机模拟交通信号灯.docx_第11页
第11页 / 共27页
51单片机模拟交通信号灯.docx_第12页
第12页 / 共27页
51单片机模拟交通信号灯.docx_第13页
第13页 / 共27页
51单片机模拟交通信号灯.docx_第14页
第14页 / 共27页
51单片机模拟交通信号灯.docx_第15页
第15页 / 共27页
51单片机模拟交通信号灯.docx_第16页
第16页 / 共27页
51单片机模拟交通信号灯.docx_第17页
第17页 / 共27页
51单片机模拟交通信号灯.docx_第18页
第18页 / 共27页
51单片机模拟交通信号灯.docx_第19页
第19页 / 共27页
51单片机模拟交通信号灯.docx_第20页
第20页 / 共27页
亲,该文档总共27页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

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

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

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

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

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

当前位置:首页 > 工作范文 > 行政公文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2