1、基于51单片机的交通灯控制系统 单片机实习报告题 目: 基于51单片机的交通灯控制系统 姓 名: 卢凯龙 李尚昆 戴光杰 学 号: 3317203 3317120 1847129 专 业: 机械设计制造及其自动化 班 级: 机制71/72班 学 院: 工学院 指导教师: 吕成绪 职称: 2010年 12 月21日南京农业大学教务处制 一、引言 当今,红绿灯安装在各个道口上,已经成为疏导交通车辆最常见和最有效的手段。大多红绿灯由红绿黄三色圆形投光器组成:“红”灯表示“停止”,“黄”灯表示“注意”,“绿”灯表示“通行”。本电路设计了一个简易的交通灯控制系统,利用51单片机的定时器产生秒信号,控制十
2、字路口的红绿黄灯交替点亮和熄灭,并且用2只LED数码管显示十字路口两个方向的剩余时间。并运用按键设置两个方向的通行时间(绿灯点亮的时间)和暂缓通行时间(黄灯点亮的时间),使系统的工作符合一般交通灯控制要求。二、系统结构与分析1、单片机最小系统如图使用12M晶振,电路低电平复位。2、交通灯显示系统南北向和东西向各采用2个数码管计时,对该方向的指示灯的点亮时间进行倒计时,最长计时范围为99秒。设计时利用单片机的P0口和P2口作为字段和片选信号输出,经驱动芯片后驱动数码管显示倒计时时间,数码管采用动态扫描方式显示。交通灯管理方案:往南和往北的信号一致,即红灯(绿灯或黄灯)同时亮或同时熄灭。用两个数码
3、管来显示被点亮的指示灯还将点亮多久。往东和往西方向的信号一致,其工作方式与南北方向一样,也采用两个数码管来倒计时。当南北方向为绿灯和黄灯时,东西向的红灯点亮禁止通行;而东西方向为绿灯和黄灯时,南北向的红灯点亮禁止通行。设南北方向为主干道,通行时间为60秒,东西方向是次干道,通行时间为30秒,黄灯点亮的时间均为4秒。交通灯显示电路图:3、按键系统设置3个程序按键:设置键、增加键、减少键,因键盘使用频率很小,建议采用查询方式来读取键盘。另需配置一个非程序按键:系统复位键。本系统的工作流程: 接通电源时或系统复位后,系统按程序给定的时间工作,即南北向通行60秒,东西向通行30秒,黄灯亮4秒。首先南北
4、向通行,然后东西向通行,如此循环。通行时间的设置:当需要更改主、次干道的通行时间时,可以用“设置键、增加键、减少键”进行设置。 第一次按“设置键”时,南北向的绿灯亮,南北向的数码管显示当前南北向的通行时间,并且按每秒3次的频率闪烁(每秒钟亮3次暗3次),其余的信号指示灯和东西向的数码管熄灭,此时可以用“增加键”和“减少键”来改变南北向的通行时间。按一次“增加键”或“减少键”,数码管的显示时间增加1秒或减小1秒,长按“增加键”或“减少键”(按下的时间超过1秒钟以上),则数码管显示的时间按每秒钟增加或减少10的速度快速变化。 第二次按“设置键”时,南北向的黄灯亮,南北向的数码管显示当前南北向黄灯的
5、点亮时间,并且按每秒3次的频率闪烁(每秒钟亮3次暗3次),其余的信号指示灯和东西向的数码管熄灭,此时可以用“增加键”和“减少键”来改变南北向黄灯的点亮时间。 第三次按“设置键”时,东西向的绿灯亮,东西向的数码管显示当前东西向的通行时间,并且按每秒3次的频率闪烁,此时可以用“增加键”和“减少键”来改变东西向的通行时间。 第四次按“设置键”时,东西向的黄灯亮,东西向的数码管显示当前东西向黄灯的点亮时间,并且按每秒3次的频率闪烁,此时可以用“增加键”和“减少键”来改变东西向黄灯的点亮时间。第五次按“设置键”时,系统退出设置状态,回到交通信号灯状态,并且南北向先通行,东西向后通行。按键处电路图:4、电
6、路总图及电路图分析 电路应用单片机的定时器产生秒信号,通过P1口及相应程序控制红黄绿灯交替点亮和熄灭。数码管显示电路中,用上拉电阻驱动数码管,用单片机的I/O口控制数码管的段选和位选。三、电路程序设计1、程序代码及功能一览表:程序代码功能简介STAR完成东西,南北绿,黄灯的初值设定MAIN系列数码管位选寄存器的选定,定时器T0的设置,东西,南北红灯的初值设定完成交通灯按照设定的时间依次点亮。SWITCH,LOOP系列完成将十六进制数转化成(通过查表)数码管能是别的代码,并完成数码管的段选数据和位选数据放入指定的寄存器或内存。其中1系列是原始时的情况,2系列是设置时的情况。DISP数码管的显示
7、AD完成加一或加十SU完成减一或减十REL系列设置键的功能子程序,REL1是设置键按一下,REL2是设置键按两下。依次类推。Q系列协助完成加,减运算的简单的跳转,循环。Z系列由于跳转范围超过128个字节,用于缓跳 DEL系列延时子程序,DEL1延时10ms,DEL2延时160ms2、汇编程序代码: ORG 0000HSTAR: MOV 20H,#3CH ;南北绿灯时间初值 MOV 21H,#04H ;南北黄灯时间初值 MOV 22H,#1EH ;东西绿灯时间初值 MOV 23H,#04H ;东西黄灯时间初值MAIN: MOV 24H,#0FEH ;南北个位位选 MOV 25H,#0FDH ;南
8、北十位位选 MOV 51H,#0FBH ;东西个位位选 MOV 52H,#0F7H ;东西十位位选 MOV TMOD,#01H ;定时器T0工作方式1 MOV TL0,#0BFH MOV TH0,#63H ;T0的初始值(40ms) MOV IE,#00H ;禁止中断 CLR TF0 ;溢出位置0 MOV R6,#25 ;产生1秒所需中断次数 (25次) SETB P3.0 MOV A,20H ADD A,21H MOV 26H,A ;东西红灯初值放26H单元 MOV A,22H ADD A,23H MOV 27H,A ;南北红灯初值放27H单元 MOV R3,#0F3H ;南北绿灯亮,东西红
9、灯亮 MOV 31H,20H ;时间减计数 MOV 2AH,20H ;南北数码管显示初值送2AH单元 MOV 2BH,26H ;东西数码管显示初值送2BH单元MAIN1: MOV TL0,#0BFH MOV TH0,#63H CLR TF0 ;溢出位置0 SETB 8CH ;启动定时器T0 JNB TF0,$ LCALL LOOP1 ;调用显示程序 DJNZ R6,MAIN1 MOV R6,#25 LCALL SWITCH1 ;调用数码管数据转换程序 DJNZ 31H,MAIN1 MOV R3,#0F5H ;南北黄灯亮,东西红灯亮 MOV 31H,21H MOV 2AH,21HMAIN2: M
10、OV TL0,#0BFH MOV TH0,#63H CLR TF0 ;溢出位置0 SETB 8CH ;启动定时器T0 JNB TF0,$ LCALL LOOP1 ;调用显示程序 DJNZ R6,MAIN2 MOV R6,#25 LCALL SWITCH1 ;调用数码管数据转换程序 DJNZ 31H,MAIN2 MOV R3,#0DEH ;南北红灯亮,东西绿灯亮 MOV 2AH,27H MOV 31H,22H MOV 2BH,22HMAIN3: MOV TL0,#0BFH MOV TH0,#63H CLR TF0 ;溢出位置0 SETB 8CH ;启动定时器T0 JNB TF0 ,$ LCALL
11、 LOOP1 DJNZ R6,MAIN3 MOV R6,#25 LCALL SWITCH1 ;调用数码管数据转换程序 DJNZ 31H,MAIN3 MOV R3,#0EEH ;南北红灯亮,东西黄灯亮 MOV 31H,23H MOV 2BH,23HMAIN4: MOV TL0,#0BFH MOV TH0,#63H CLR TF0 ;溢出位置0 SETB 8CH ;启动定时器T0 JNB TF0 ,$ LCALL LOOP1 ;调用显示程序 DJNZ R6,MAIN4 MOV R6,#25 LCALL SWITCH1 ;调用数码管数据转换程序 DJNZ 31H,MAIN4 AJMP MAINSWI
12、TCH1: JNB P3.0,REL ;检测设置键是否按下 DEC 2AH DEC 2BH MOV A,2AH ;南北数码管显示初值送A MOV B,#0AH DIV AB ;除以10取十位与个位 MOV DPTR,#0300H MOVC A,A+DPTR ;查表取十位显示码 MOV R1,A ;十位显示码存在R1里 MOV A,B MOVC A,A+DPTR ;查表取个位显示码 MOV R2,A ;个位显示码存在R2里 MOV A,2BH ;东西数码管显示初值送A MOV B,#0AH DIV AB MOV DPTR,#0300H MOVC A,A+DPTR ;查表取十位显示码 MOV 45
13、H,A MOV A,B MOVC A,A+DPTR ;查表取个位显示码 MOV 44H,A RETLOOP1: MOV A,R2 ;南北数码管个位给A MOV R4,24H ;南北数码管个位位选给R4 ACALL DISP ;调用显示子程序 MOV A,R1 ;南北数码管十位给A MOV R4,25H ;南北数码管十位位选给R4 ACALL DISP ;调用显示子程序 MOV A,44H ;东西数码管个位给A MOV R4,51H ACALL DISP MOV A,45H ;东西数码管十位给A MOV R4,52H ACALL DISP MOV A,R3 MOV P1,A ;信号灯控制从P1口
14、输出 RETSWITCH2: MOV B,#0AH ;用于设置时的数码管数据转换子程序 DIV AB MOV DPTR,#0300H MOVC A,A+DPTR MOV R1,A ;需要显示的十位 MOV A,B MOVC A,A+DPTR MOV R2,A ;需要显示的个位LOOP2: MOV A,R2 MOV R4,24H ACALL DISP MOV A,R1 MOV R4,25H ACALL DISP MOV A,R3 MOV P1,A RETDISP: MOV R0,#0FFH ;显示子程序 MOV R5,ADISP1: MOV A,R4 MOV P2,A MOV A,R5 MOV
15、P0,A DJNZ R0,DISP1 ;延时显示时间,增加亮度 RETZ1: LJMP SWITCH1 ;由于跳转范围超过128个字节,用于缓跳Z2: LJMP MAIN ;由于跳转范围超过128个字节,用于缓跳REL: MOV R7,#00H ;设置子程序 MOV 60H,20H SJMP DEL0BUF1: CJNE R7,#01H, BUF2 MOV 20H,60H ;保存修改后的值 SJMP DEL0BUF2: CJNE R7,#02H,BUF3 MOV 21H,60H ;保存修改后的值 SJMP DEL0BUF3: CJNE R7,#03H,BUF4 MOV 22H,60H ;保存修
16、改后的值 SJMP DEL0BUF4: CJNE R7,#04H,Z2 MOV 23H,60H ;保存修改后的值DEL0: LCALL DEL1 ;若按下,则延时10MS JB P3.0,Z1 ;去抖动 JNB P3.0,$ ;检测设置键是否释放 INC R7 MOV 30H,#30 ;规定时间内(10s)没有键按下的循环计数 CJNE R7,#01H, REL2 REL1: MOV 24H,#0FEH ;设置键按一下子程序 MOV 25H,#0FDH MOV R3,#0FBH ;南北绿灯亮 MOV A,20H ;显示初值送累加器 LCALL SWITCH2 ;调用数据转化及显示子程 MOV
17、A,#0FFH MOV P2,A ;数码管闪烁 LCALL DEL2 ;延时160ms MOV A,20H MOV 60H,20H MOV 70H,#99 ;数码管可以显示的最大者 JNB P3.0, BUF1 ;检测设置键是否按下 JNB P3.1,AD ;检测增加键是否按下 JNB P3.2,Z3 ;检测减少键是否按下 DJNZ 30H,REL1 LJMP STAR ;若10S没有任何键按下,跳回主程序 REL2: MOV 70H,#9 MOV 30H,#30 CJNE R7,#02H,Z4 ;设置键按两下子程序 MOV 24H,#0FEH MOV 25H,#0FDH MOV R3,#0F
18、DH ;南北黄灯亮 MOV A,21H ;显示初值送累加器 LCALL SWITCH2 ;调用数据转化及显示子程序 MOV A,#0FFH MOV P2,A ;数码管闪烁 LCALL DEL2 ;延时160ms MOV A,21H MOV 60H,21H JNB P3.0,BUF1 ;检测设置键是否按下 JNB P3.1,AD ;检测增加键是否按下 JNB P3.2,Z3 ;检测减少键是否按下 DJNZ 30H, REL2 ;若10S没有任何键按下,跳回主程序 LJMP STARZ3: LJMP SU ;由于跳转范围超过128个字节,用于缓跳Z4: LJMP REL3 AD: LCALL DE
19、L1 ;延时10ms JB P3.1,SU ;去抖动 MOV 30H,#30 MOV 4AH,#6 ;用于检查是否有持续按下计数(6次)1sQ1: LCALL DEL2 ;延时160ms JB P3.1,Q2 DJNZ 4AH,Q1 ;检测是否持续按下 MOV A,#0AH ADD A,60H ;若持续按下,则每次加10 MOV 60H,A SJMP Q3Q2: INC 60H ;不是持续按下,每次加1Q3: MOV A,60H ;判断是否超过99 SUBB A,70H JNC Q4 ;若超过,跳到Q4 MOV A,60H LCALL SWITCH2 MOV A,#0FFH MOV P2,A
20、;数码管闪烁 LCALL DEL2 MOV A,60H JNB P3.0, Z6 ;检测设置键是否按下 JNB P3.1,AD ;检测增加键是否按下 JNB P3.2,SU ;检测减少键是否按下 DJNZ 30H,Q3 LJMP STAR ;若10S没有任何键按下,跳回主程序 Q4: MOV 5AH,#30Q5: MOV A,70H ;最大计数值99给数码管(之后只能减或停止设置) MOV 60H,70H LCALL SWITCH2 MOV A,#0FFH MOV P2,A ;数码管闪烁 LCALL DEL2 ;延时160ms JNB P3.0, Z6 ;检测设置键是否按下 JNB P3.2,
21、SU ;检测减少键是否按下 DJNZ 5AH,Q5 LJMP STAR ;若10S没有任何键按下,跳回主程序 SU: LCALL DEL1 ;延时10s JB P3.2,Z6 ;去抖动 MOV 30H,#30 MOV 4AH,#6Q6: LCALL DEL2 ;延时160ms JB P3.2,Q7 DJNZ 4AH,Q6 ;检测是否持续按下 MOV A,60H SUBB A,#0AH ;若持续按下,则每次减10 MOV 60H,A SJMP Q8Q7: DEC 60H ;若不是持续按下,每次减1Q8: MOV A,60H JC Z5 ;若低于0,跳回主程序 LCALL SWITCH2 MOV
22、A,#0FFH MOV P2,A ;数码管闪烁 LCALL DEL2 ;延时160ms JNB P3.0,Z6 ;检测设置键是否按下 JNB P3.1,Z7 ;检测增加键是否按下 JNB P3.2,SU ;检测减少键是否按下 DJNZ 30H,Q8 ;若10S没有任何键按下,跳回主程序 LJMP STARZ7: LJMP AD ;由于跳转范围超过128个字节,用于缓跳Z6: LJMP BUF1Z5: LJMP MAINREL3: MOV 70H,#99 ;设置键按三下子程序 MOV 30H,#30 CJNE R7,#03H,REL4 MOV 24H,#0FBH MOV 25H,#0F7H ;字
23、位口送相应单元 MOV R3,#0DFH ;东西绿灯亮 MOV A,22H LCALL SWITCH2 MOV A,#0FFH MOV P2,A ;数码管闪烁 LCALL DEL2 ;延时160s MOV A,22H MOV 60H,22H JNB P3.0,Z8 ;检测设置键是否按下 JNB P3.1,Z9 ;检测增加键是否按下 JNB P3.2,SU ;检测减少键是否按下 DJNZ 30H,REL3 ;若10S没有任何键按下,跳回主程序 LJMP STARZ8: LJMP DEL0 ;由于跳转范围超过128个字节,用于缓跳REL4: MOV 70H,#9 MOV 30H,#30 CJNE
24、R7,#04H,REL5 MOV 24H,#0FBH MOV 25H,#0F7H MOV R3,#0EFH ;东西黄灯亮 MOV A,23H LCALL SWITCH2 MOV A,#0FFH MOV P2,A ;数码管闪烁 LCALL DEL2 ;延时160s MOV A,23H JNB P3.0,Z8 ;检测设置键是否按下 MOV 60H,23H JNB P3.1,Z9 ;检测增加键是否按下 JNB P3.2,Z10 ;检测减少键是否按下 DJNZ 30H,REL4 ;若10S没有任何键按下,跳回主程序 LJMP STARZ9: LJMP ADZ10: LJMP SUREL5: LCALL
25、 DEL1 ;延时10s JNB P3.0,$ LJMP BUF1 DEL1: MOV R6,#2 ;延时10MS子程序L1: MOV 35H,#22 DJNZ 35H,$ DJNZ R6,L1 RETDEL2: MOV R5,#16 ;延时160MS子程序L2: MOV R6,#22 L3: MOV 35H,#248 DJNZ 35H,$ DJNZ R6,L3 DJNZ R5,L2 RET ORG 0300HTABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH END四、心得体会本次实习通过设计了一个简易的交通灯控制系统,加深了我们队单片机的了解。单片机作为微电子控制的新兴技术,具有使用灵活,方便,功耗小,成本低等特点。通过这次实习,使我组成员得到了一次用专业知识、专业技能分析和解决问题全面系统的锻炼。使我们在单片机的基本原理、单片机应用系统开发过程,以及在常用编程设计思路技巧的掌握方面都向前迈了一大步,为日后步入社会加入工作打下坚实的基础。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1