基于51单片机的交通灯控制系统.docx
《基于51单片机的交通灯控制系统.docx》由会员分享,可在线阅读,更多相关《基于51单片机的交通灯控制系统.docx(19页珍藏版)》请在冰豆网上搜索。
基于51单片机的交通灯控制系统
单片机实习报告
题目:
基于51单片机的交通灯控制系统
姓名:
卢凯龙李尚昆戴光杰
学号:
331720333171201847129
专业:
机械设计制造及其自动化
班级:
机制71/72班
学院:
工学院
指导教师:
吕成绪职称:
2010年12月21日
南京农业大学教务处制
一、引言
当今,红绿灯安装在各个道口上,已经成为疏导交通车辆最常见和最有效的手段。
大多红绿灯由红绿黄三色圆形投光器组成:
“红”灯表示“停止”,“黄”灯表示“注意”,“绿”灯表示“通行”。
本电路设计了一个简易的交通灯控制系统,利用51单片机的定时器产生秒信号,控制十字路口的红绿黄灯交替点亮和熄灭,并且用2只LED数码管显示十字路口两个方向的剩余时间。
并运用按键设置两个方向的通行时间(绿灯点亮的时间)和暂缓通行时间(黄灯点亮的时间),使系统的工作符合一般交通灯控制要求。
二、系统结构与分析
1、单片机最小系统
如图使用12M晶振,电路低电平复位。
2、交通灯显示系统
南北向和东西向各采用2个数码管计时,对该方向的指示灯的点亮时间进行倒计时,最长计时范围为99秒。
设计时利用单片机的P0口和P2口作为字段和片选信号输出,经驱动芯片后驱动数码管显示倒计时时间,数码管采用动态扫描方式显示。
交通灯管理方案:
往南和往北的信号一致,即红灯(绿灯或黄灯)同时亮或同时熄灭。
用两个数码管来显示被点亮的指示灯还将点亮多久。
往东和往西方向的信号一致,其工作方式与南北方向一样,也采用两个数码管来倒计时。
当南北方向为绿灯和黄灯时,东西向的红灯点亮禁止通行;而东西方向为绿灯和黄灯时,南北向的红灯点亮禁止通行。
设南北方向为主干道,通行时间为60秒,东西方向是次干道,通行时间为30秒,黄灯点亮的时间均为4秒。
交通灯显示电路图:
3、按键系统
设置3个程序按键:
设置键、增加键、减少键,因键盘使用频率很小,建议采用查询方式来读取键盘。
另需配置一个非程序按键:
系统复位键。
本系统的工作流程:
接通电源时或系统复位后,系统按程序给定的时间工作,即南北向通行60秒,东西向通行30秒,黄灯亮4秒。
首先南北向通行,然后东西向通行,如此循环。
通行时间的设置:
当需要更改主、次干道的通行时间时,可以用“设置键、增加键、减少键”进行设置。
第一次按“设置键”时,南北向的绿灯亮,南北向的数码管显示当前南北向的通行时间,并且按每秒3次的频率闪烁(每秒钟亮3次暗3次),其余的信号指示灯和东西向的数码管熄灭,此时可以用“增加键”和“减少键”来改变南北向的通行时间。
按一次“增加键”或“减少键”,数码管的显示时间增加1秒或减小1秒,长按“增加键”或“减少键”(按下的时间超过1秒钟以上),则数码管显示的时间按每秒钟增加或减少10的速度快速变化。
第二次按“设置键”时,南北向的黄灯亮,南北向的数码管显示当前南北向黄灯的点亮时间,并且按每秒3次的频率闪烁(每秒钟亮3次暗3次),其余的信号指示灯和东西向的数码管熄灭,此时可以用“增加键”和“减少键”来改变南北向黄灯的点亮时间。
第三次按“设置键”时,东西向的绿灯亮,东西向的数码管显示当前东西向的通行时间,并且按每秒3次的频率闪烁,此时可以用“增加键”和“减少键”来改变东西向的通行时间。
第四次按“设置键”时,东西向的黄灯亮,东西向的数码管显示当前东西向黄灯的点亮时间,并且按每秒3次的频率闪烁,此时可以用“增加键”和“减少键”来改变东西向黄灯的点亮时间。
第五次按“设置键”时,系统退出设置状态,回到交通信号灯状态,并且南北向先通行,东西向后通行。
按键处电路图:
4、电路总图及电路图分析
电路应用单片机的定时器产生秒信号,通过P1口及相应程序控制红黄绿灯交替点亮和熄灭。
数码管显示电路中,用上拉电阻驱动数码管,用单片机的I/O口控制数码管的段选和位选。
三、电路程序设计
1、程序代码及功能一览表:
程序代码
功能简介
STAR
完成东西,南北绿,黄灯的初值设定
MAIN系列
数码管位选寄存器的选定,定时器T0的设置,东西,南北红灯的初值设定完成交通灯按照设定的时间依次点亮。
SWITCH,LOOP系列
完成将十六进制数转化成(通过查表)数码管能是别的代码,并完成数码管的段选数据和位选数据放入指定的寄存器或内存。
其中1系列是原始时的情况,2系列是设置时的情况。
DISP
数码管的显示
AD
完成加一或加十
SU
完成减一或减十
REL系列
设置键的功能子程序,REL1是设置键按一下,REL2是设置键按两下。
。
。
依次类推。
Q系列
协助完成加,减运算的简单的跳转,循环。
Z系列
由于跳转范围超过128个字节,用于缓跳
DEL系列
延时子程序,DEL1延时10ms,DEL2延时160ms
2、汇编程序代码:
ORG0000H
STAR:
MOV20H,#3CH;南北绿灯时间初值
MOV21H,#04H;南北黄灯时间初值
MOV22H,#1EH;东西绿灯时间初值
MOV23H,#04H;东西黄灯时间初值
MAIN:
MOV24H,#0FEH;南北个位位选
MOV25H,#0FDH;南北十位位选
MOV51H,#0FBH;东西个位位选
MOV52H,#0F7H;东西十位位选
MOVTMOD,#01H;定时器T0工作方式1
MOVTL0,#0BFH
MOVTH0,#63H;T0的初始值(40ms)
MOVIE,#00H;禁止中断
CLRTF0;溢出位置0
MOVR6,#25;产生1秒所需中断次数(25次)
SETBP3.0
MOVA,20H
ADDA,21H
MOV26H,A;东西红灯初值放26H单元
MOVA,22H
ADDA,23H
MOV27H,A;南北红灯初值放27H单元
MOVR3,#0F3H;南北绿灯亮,东西红灯亮
MOV31H,20H;时间减计数
MOV2AH,20H;南北数码管显示初值送2AH单元
MOV2BH,26H;东西数码管显示初值送2BH单元
MAIN1:
MOVTL0,#0BFH
MOVTH0,#63H
CLRTF0;溢出位置0
SETB8CH;启动定时器T0
JNBTF0,$
LCALLLOOP1;调用显示程序
DJNZR6,MAIN1
MOVR6,#25
LCALLSWITCH1;调用数码管数据转换程序
DJNZ31H,MAIN1
MOVR3,#0F5H;南北黄灯亮,东西红灯亮
MOV31H,21H
MOV2AH,21H
MAIN2:
MOVTL0,#0BFH
MOVTH0,#63H
CLRTF0;溢出位置0
SETB8CH;启动定时器T0
JNBTF0,$
LCALLLOOP1;调用显示程序
DJNZR6,MAIN2
MOVR6,#25
LCALLSWITCH1;调用数码管数据转换程序
DJNZ31H,MAIN2
MOVR3,#0DEH;南北红灯亮,东西绿灯亮
MOV2AH,27H
MOV31H,22H
MOV2BH,22H
MAIN3:
MOVTL0,#0BFH
MOVTH0,#63H
CLRTF0;溢出位置0
SETB8CH;启动定时器T0
JNBTF0,$
LCALLLOOP1
DJNZR6,MAIN3
MOVR6,#25
LCALLSWITCH1;调用数码管数据转换程序
DJNZ31H,MAIN3
MOVR3,#0EEH;南北红灯亮,东西黄灯亮
MOV31H,23H
MOV2BH,23H
MAIN4:
MOVTL0,#0BFH
MOVTH0,#63H
CLRTF0;溢出位置0
SETB8CH;启动定时器T0
JNBTF0,$
LCALLLOOP1;调用显示程序
DJNZR6,MAIN4
MOVR6,#25
LCALLSWITCH1;调用数码管数据转换程序
DJNZ31H,MAIN4
AJMPMAIN
SWITCH1:
JNBP3.0,REL;检测设置键是否按下
DEC2AH
DEC2BH
MOVA,2AH;南北数码管显示初值送A
MOVB,#0AH
DIVAB;除以10取十位与个位
MOVDPTR,#0300H
MOVCA,@A+DPTR;查表取十位显示码
MOVR1,A;十位显示码存在R1里
MOVA,B
MOVCA,@A+DPTR;查表取个位显示码
MOVR2,A;个位显示码存在R2里
MOVA,2BH;东西数码管显示初值送A
MOVB,#0AH
DIVAB
MOVDPTR,#0300H
MOVCA,@A+DPTR;查表取十位显示码
MOV45H,A
MOVA,B
MOVCA,@A+DPTR;查表取个位显示码
MOV44H,A
RET
LOOP1:
MOVA,R2;南北数码管个位给A
MOVR4,24H;南北数码管个位位选给R4
ACALLDISP;调用显示子程序
MOVA,R1;南北数码管十位给A
MOVR4,25H;南北数码管十位位选给R4
ACALLDISP;调用显示子程序
MOVA,44H;东西数码管个位给A
MOVR4,51H
ACALLDISP
MOVA,45H;东西数码管十位给A
MOVR4,52H
ACALLDISP
MOVA,R3
MOVP1,A;信号灯控制从P1口输出
RET
SWITCH2:
MOVB,#0AH;用于设置时的数码管数据转换子程序
DIVAB
MOVDPTR,#0300H
MOVCA,@A+DPTR
MOVR1,A;需要显示的十位
MOVA,B
MOVCA,@A+DPTR
MOVR2,A;需要显示的个位
LOOP2:
MOVA,R2
MOVR4,24H
ACALLDISP
MOVA,R1
MOVR4,25H
ACALLDISP
MOVA,R3
MOVP1,A
RET
DISP:
MOVR0,#0FFH;显示子程序
MOVR5,A
DISP1:
MOVA,R4
MOVP2,A
MOVA,R5
MOVP0,A
DJNZR0,DISP1;延时显示时间,增加亮度
RET
Z1:
LJMPSWITCH1;由于跳转范围超过128个字节,用于缓跳
Z2:
LJMPMAIN;由于跳转范围超过128个字节,用于缓跳
REL:
MOVR7,#00H;设置子程序
MOV60H,20H
SJMPDEL0
BUF1:
CJNER7,#01H,BUF2
MOV20H,60H;保存修改后的值
SJMPDEL0
BUF2:
CJNER7,#02H,BUF3
MOV21H,60H;保存修改后的值
SJMPDEL0
BUF3:
CJNER7,#03H,BUF4
MOV22H,60H;保存修改后的值
SJMPDEL0
BUF4:
CJNER7,#04H,Z2
MOV23H,60H;保存修改后的值
DEL0:
LCALLDEL1;若按下,则延时10MS
JBP3.0,Z1;去抖动
JNBP3.0,$;检测设置键是否释放
INCR7
MOV30H,#30;规定时间内(10s)没有键按下的循环计数
CJNER7,#01H,REL2
REL1:
MOV24H,#0FEH;设置键按一下子程序
MOV25H,#0FDH
MOVR3,#0FBH;南北绿灯亮
MOVA,20H;显示初值送累加器
LCALLSWITCH2;调用数据转化及显示子程
MOVA,#0FFH
MOVP2,A;数码管闪烁
LCALLDEL2;延时160ms
MOVA,20H
MOV60H,20H
MOV70H,#99;数码管可以显示的最大者
JNBP3.0,BUF1;检测设置键是否按下
JNBP3.1,AD;检测增加键是否按下
JNBP3.2,Z3;检测减少键是否按下
DJNZ30H,REL1
LJMPSTAR;若10S没有任何键按下,跳回主程序
REL2:
MOV70H,#9
MOV30H,#30
CJNER7,#02H,Z4;设置键按两下子程序
MOV24H,#0FEH
MOV25H,#0FDH
MOVR3,#0FDH;南北黄灯亮
MOVA,21H;显示初值送累加器
LCALLSWITCH2;调用数据转化及显示子程序
MOVA,#0FFH
MOVP2,A;数码管闪烁
LCALLDEL2;延时160ms
MOVA,21H
MOV60H,21H
JNBP3.0,BUF1;检测设置键是否按下
JNBP3.1,AD;检测增加键是否按下
JNBP3.2,Z3;检测减少键是否按下
DJNZ30H,REL2;若10S没有任何键按下,跳回主程序
LJMPSTAR
Z3:
LJMPSU;由于跳转范围超过128个字节,用于缓跳
Z4:
LJMPREL3
AD:
LCALLDEL1;延时10ms
JBP3.1,SU;去抖动
MOV30H,#30
MOV4AH,#6;用于检查是否有持续按下计数(6次)1s
Q1:
LCALLDEL2;延时160ms
JBP3.1,Q2
DJNZ4AH,Q1;检测是否持续按下
MOVA,#0AH
ADDA,60H;若持续按下,则每次加10
MOV60H,A
SJMPQ3
Q2:
INC60H;不是持续按下,每次加1
Q3:
MOVA,60H;判断是否超过99
SUBBA,70H
JNCQ4;若超过,跳到Q4
MOVA,60H
LCALLSWITCH2
MOVA,#0FFH
MOVP2,A;数码管闪烁
LCALLDEL2
MOVA,60H
JNBP3.0,Z6;检测设置键是否按下
JNBP3.1,AD;检测增加键是否按下
JNBP3.2,SU;检测减少键是否按下
DJNZ30H,Q3
LJMPSTAR;若10S没有任何键按下,跳回主程序
Q4:
MOV5AH,#30
Q5:
MOVA,70H;最大计数值99给数码管(之后只能减或停止设置)
MOV60H,70H
LCALLSWITCH2
MOVA,#0FFH
MOVP2,A;数码管闪烁
LCALLDEL2;延时160ms
JNBP3.0,Z6;检测设置键是否按下
JNBP3.2,SU;检测减少键是否按下
DJNZ5AH,Q5
LJMPSTAR;若10S没有任何键按下,跳回主程序
SU:
LCALLDEL1;延时10s
JBP3.2,Z6;去抖动
MOV30H,#30
MOV4AH,#6
Q6:
LCALLDEL2;延时160ms
JBP3.2,Q7
DJNZ4AH,Q6;检测是否持续按下
MOVA,60H
SUBBA,#0AH;若持续按下,则每次减10
MOV60H,A
SJMPQ8
Q7:
DEC60H;若不是持续按下,每次减1
Q8:
MOVA,60H
JCZ5;若低于0,跳回主程序
LCALLSWITCH2
MOVA,#0FFH
MOVP2,A;数码管闪烁
LCALLDEL2;延时160ms
JNBP3.0,Z6;检测设置键是否按下
JNBP3.1,Z7;检测增加键是否按下
JNBP3.2,SU;检测减少键是否按下
DJNZ30H,Q8;若10S没有任何键按下,跳回主程序
LJMPSTAR
Z7:
LJMPAD;由于跳转范围超过128个字节,用于缓跳
Z6:
LJMPBUF1
Z5:
LJMPMAIN
REL3:
MOV70H,#99;设置键按三下子程序
MOV30H,#30
CJNER7,#03H,REL4
MOV24H,#0FBH
MOV25H,#0F7H;字位口送相应单元
MOVR3,#0DFH;东西绿灯亮
MOVA,22H
LCALLSWITCH2
MOVA,#0FFH
MOVP2,A;数码管闪烁
LCALLDEL2;延时160s
MOVA,22H
MOV60H,22H
JNBP3.0,Z8;检测设置键是否按下
JNBP3.1,Z9;检测增加键是否按下
JNBP3.2,SU;检测减少键是否按下
DJNZ30H,REL3;若10S没有任何键按下,跳回主程序
LJMPSTAR
Z8:
LJMPDEL0;由于跳转范围超过128个字节,用于缓跳
REL4:
MOV70H,#9
MOV30H,#30
CJNER7,#04H,REL5
MOV24H,#0FBH
MOV25H,#0F7H
MOVR3,#0EFH;东西黄灯亮
MOVA,23H
LCALLSWITCH2
MOVA,#0FFH
MOVP2,A;数码管闪烁
LCALLDEL2;延时160s
MOVA,23H
JNBP3.0,Z8;检测设置键是否按下
MOV60H,23H
JNBP3.1,Z9;检测增加键是否按下
JNBP3.2,Z10;检测减少键是否按下
DJNZ30H,REL4;若10S没有任何键按下,跳回主程序
LJMPSTAR
Z9:
LJMPAD
Z10:
LJMPSU
REL5:
LCALLDEL1;延时10s
JNBP3.0,$
LJMPBUF1
DEL1:
MOVR6,#2;延时10MS子程序
L1:
MOV35H,#22
DJNZ35H,$
DJNZR6,L1
RET
DEL2:
MOVR5,#16;延时160MS子程序
L2:
MOVR6,#22
L3:
MOV35H,#248
DJNZ35H,$
DJNZR6,L3
DJNZR5,L2
RET
ORG0300H
TABLE:
DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END
四、心得体会
本次实习通过设计了一个简易的交通灯控制系统,加深了我们队单片机的了解。
单片机作为微电子控制的新兴技术,具有使用灵活,方便,功耗小,成本低等特点。
通过这次实习,使我组成员得到了一次用专业知识、专业技能分析和解决问题全面系统的锻炼。
使我们在单片机的基本原理、单片机应用系统开发过程,以及在常用编程设计思路技巧的掌握方面都向前迈了一大步,为日后步入社会加入工作打下坚实的基础。