一、要求: 1.交通灯按表格要求,用发光二极管显示。 2.用数码管进行倒计时显示。 3.夜晚时数码管和红、绿灯都不亮,黄灯以1HZ闪烁。 4.用按键转换白天和夜晚的显示方式。 二、设计综述: 利用单片机实现交通灯的控制, 该任务分以下几个方面: (1) 实现东西方向和南北方向的红、绿、黄灯的循环控制。要实现此功能需要表示三种不同颜色的LED灯分别接在P1个管脚,用软件实现。 (2)用数码管显示倒计时。接P0端口与P2端口,并给P0口接上上拉电阻。 (3)实现夜晚黄灯闪烁。这需要人工实现,编程时利用到中断才能达到目的,P3.2口所接按钮为黑夜黄灯闪烁中断,只要按钮按下,那么四个方向红绿灯不亮,黄灯以1HZ闪烁。当情况解除,让时间回到之前继续进行。
三、总电路图:
单片机汇编语言源码:
- 程序:
- ORG 0000H
- LJMP MAIN ;上电,转向主程序
- ORG 0003H
- LJMP HDSS ;跳转到夜晚黄灯1HZ闪烁程序
- ORG 0030H
- MAIN:
- SETB TR0 ;启动T0
- SETB EA ;允许CPU中断
- SETB EX0 ;开放外部中断0
- SETB IT0 ;设外中断0为边沿触发
- MOV TMOD,#01H ;设置T0工作于模式一
- LCALL DXLNBH ;调用程序,东西绿灯亮,南北红灯亮
- LCALL DXHNBH ;调用程序,东西黄灯亮,南北红灯亮
- LCALL NBLDXH ;调用程序,南北绿灯亮,东西红灯亮
- LCALL NBHDXH ;调用程序,南北黄灯亮,东西红灯亮
- AJMP MAIN
- ;东西绿灯亮,南北红灯亮
- DXLNBH: MOV R0,#6
- LOOP4: MOV R2,#100 ;设循环次数,定时1s,每隔10ms循环一次,循环100次为1s
- LOOP5: MOV TL0,#0F0H ;装入计数值低8位
- MOV TH0,#0D8H ;装入计数值高8位
- JNB TF0,[ DISCUZ_CODE_7 ]nbsp; ;T0没有溢出等待
- CLR TF0 ;产生溢出,清标志位
- DJNZ R2,LOOP5 ; R2不为0,继续循环
- MOV P1,#00H
- SETB P1.3 ;点亮红灯
- SETB P1.1 ;点亮绿灯
- MOV A,R0 ;将R0的值赋予累加器A
- DEC A ;累加器A自减
- MOV DPTR,#TAB ;查表
- MOVC A,@A+DPTR
- MOV P0,A
- MOV A,R0
- DEC A
- ADD A,#04H
- MOVC A,@A+DPTR
- MOV P2,A
- DJNZ R0,LOOP4
- RET
- ;东西黄灯亮,南北红灯亮
- DXHNBH:MOV R0,#4
- LOOP7:MOV R2,#100 ;设循环次数,定时1s,每隔10ms循环一次,循环100次为1s
- LOOP8:MOV TL0,#0F0H ;装入计数值低8位
- MOV TH0,#0D8H ;装入计数值高8位
- JNB TF0,[ DISCUZ_CODE_7 ]nbsp; ;T0没有溢出等待
- CLR TF0 ;产生溢出,清标志位
- DJNZ R2,LOOP8
- MOV P1,#00H
- SETB P1.3 ;点亮红灯
- SETB P1.2 ;点亮黄灯
- MOV A,R0
- DEC A
- MOV DPTR,#TAB
- MOVC A,@A+DPTR
- MOV P0,A
- MOV A,R0
- DEC A
- MOVC A,@A+DPTR
- MOV P2,A
- DJNZ R0,LOOP7
- RET
- ;南北绿灯亮,东西红灯亮
- NBLDXH:MOV R0,#6
- LOOP10:MOV R2,#100 ;设循环次数,定时1s,每隔10ms循环一次,循环100次为1s
- LOOP11:MOV TL0,#0F0H
- MOV TH0,#0D8H
- JNB TF0,$
- CLR TF0
- DJNZ R2,LOOP11
- MOV P1,#00H
- SETB P1.0 ;点亮红灯
- SETB P1.4 ;点亮绿灯
- MOV A,R0
- ADD A,#04H
- DEC A
- MOV DPTR,#TAB
- MOVC A,@A+DPTR
- MOV P0,A
- MOV A,R0
- DEC A
- MOVC A,@A+DPTR
- MOV P2,A
- DJNZ R0,LOOP10
- RET
- ;南北黄灯亮,东西红灯
- NBHDXH:MOV R0,#4
- LOOP13:MOV R2,#100 ;设循环次数,定时1s,每隔10ms循环一次,循环100次为1s
- LOOP14:MOV TL0,#0F0H ;装入计数值低8位
- MOV TH0,#0D8H ;装入计数值高8位
- JNB TF0,[ DISCUZ_CODE_7 ]nbsp; ; T0没有溢出等待
- CLR TF0 ;产生溢出,清标志位
- DJNZ R2,LOOP14
- MOV P1,#00H
- SETB P1.0 ;点亮红灯
- SETB P1.5 ;点亮黄灯
- MOV A,R0
- DEC A
- MOV DPTR,#TAB
- MOVC A,@A+DPTR
- MOV P0,A
- MOV A,R0
- DEC A
- MOVC A,@A+DPTR
- MOV P2,A
- DJNZ R0,LOOP13
- RET
- ;夜晚黄灯1HZ闪烁
- HDSS:MOV P0,#00H ;赋初值
- MOV P1,#00H
- MOV P2,#00H
- LOOP1:MOV R3,#50 ;设循环次数,定时1s,每隔20ms循环一次,循环50次为1s
- LOOP2: MOV TL0,#0F0H ;装入计数值低8位
- MOV TH0,#0D8H ;装入计数值高8位
- JNB TF0,[ DISCUZ_CODE_7 ]nbsp; ;T0没有溢出等待
- CLR TF0 ;产生溢出,清标志位
- DJNZ R3,LOOP2 ;判断R3是否为0
- CPL P1.2 ;P1.2取反输出
- CPL P1.5 ;P1.5取反输出
- JNB P3.2,LOOP1 ;判断位变量是否为0
- RETI ;中断返回
- TAB:DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 6FH, 77H
- END
复制代码
全部资料51hei下载地址:
交通灯.zip
(19.52 KB, 下载次数: 44)
|