单片机源程序如下:
- SECOND1 EQU 30H ;东西路口计时寄存器
- SECOND2 EQU 31H ;南北路口计时寄存器
- DBUF EQU 40H ;显示码缓冲区1
- TEMP EQU 44H ;显示码缓冲区2
- LED_G1 BIT P2.1 ;东西路口绿灯
- LED_Y1 BIT P2.2 ;东西路口黄灯
- LED_R1 BIT P2.3 ;东西路口红灯
- LED_G2 BIT P2.4 ;南北路口绿灯
- LED_Y2 BIT P2.5 ;南北路口黄灯
- LED_R2 BIT P2.6 ;南北路口红灯
- ORG 0000H
- LJMP START
- ORG 0100H
- START: MOV TMOD,#01H ;置T0为工作方式1
- MOV TH0,#3CH ;置T0定时初值50ms
- MOV TL0,#0B0H
- CLR TF0
- SETB TR0 ;启动T0
- CLR A
- MOV P1,A ;关闭不相关的LED
- ;***************************************************
- LOOP: MOV R2,#20 ;置1s计数初值,50ms*20=1s
- MOV R3,#20 ;红灯亮20s
- MOV SECOND1,#25 ;东西路口计时显示初值25s
- MOV SECOND2,#25 ;南北路口计时显示初值25s
- LCALL DISPLAY
- LCALL STATE1 ;调用状态1
- WAIT1: JNB TF0,WAIT1 ;查询50ms到否
- CLR TF0
- MOV TH0,#3CH ;恢复T0定时初值50ms
- MOV TL0,#0B0H
- DJNZ R2,WAIT1 ;判断1s到否?未到继续状态1
- MOV R2,#20 ;置50ms计数初值
- DEC SECOND1 ;东西路口显示时间减1s
- DEC SECOND2 ;南北路口显示时间减1s
- LCALL DISPLAY
- DJNZ R3,WAIT1 ;状态1维持20s
- ;*******************************************
- MOV R2,#5 ;置50ms计数初值 5*4=20
- MOV R3,#3 ;绿灯闪3s
- MOV R4,#4 ;闪烁间隔200ms
- MOV SECOND1,#5 ;东西路口计时显示初值5s
- MOV SECOND2,#5 ;南北路口计时显示初值5s
- LCALL DISPLAY
- WAIT2: LCALL STATE2 ;调用状态2
- JNB TF0,WAIT2 ;查询50ms到否
- CLR TF0
- MOV TH0,#3CH ;恢复T0定时初值50ms
- MOV TL0,#0B0H
- DJNZ R4,WAIT2 ;判断200ms到否?未到继续状态2
- CPL LED_G1 ;东西绿灯闪
- MOV R4,#4 ;闪烁间隔200ms
- DJNZ R2,WAIT2 ;判1s到否?未到继续状态2
- MOV R2,#5 ;置50ms计数初值
- DEC SECOND1 ;东西路口显示时间减1s
- DEC SECOND2 ;南北路口显示时间减1s
- LCALL DISPLAY
- DJNZ R3,WAIT2 ;状态2维持3s
- ;****************************************
- MOV R2,#20 ;置50ms计数初值
- MOV R3,#2 ;黄灯闪2s
- MOV SECOND1,#2 ;东西路口计时显示初值2s
- MOV SECOND2,#2 ;南北路口计时显示初值2s
- LCALL DISPLAY
- WAIT3: LCALL STATE3 ;调用状态3
- JNB TF0,WAIT3 ;查询100ms到否
- CLR TF0
- MOV TH0,#3CH ;恢复T0定时初值100ms
- MOV TL0,#0B0H
- DJNZ R2,WAIT3 ;判断1s到否?未到继续状态3
- MOV R2,#20 ;置100ms计数初值
- DEC SECOND1 ;东西路口显示时间减1s
- DEC SECOND2 ;南北路口显示时间减1s
- LCALL DISPLAY
- DJNZ R3,WAIT3 ;状态3维持2s
- ;*******************************************
- MOV R2,#20 ;置50ms计数初值
- MOV R3,#20 ;红灯闪20s
- MOV SECOND1,#25 ;东西路口计时显示初值25s
- MOV SECOND2,#25 ;南北路口计时显示初值25s
- LCALL DISPLAY
- WAIT4: LCALL STATE4 ;调用状态4
- JNB TF0,WAIT4 ;查询100ms到否
- CLR TF0
- MOV TH0,#3CH ;恢复T0定时初值100ms
- MOV TL0,#0B0H
- DJNZ R2,WAIT4 ;判断1s到否?未到继续状态4
- MOV R2,#20 ;置100ms计数初值
- DEC SECOND1 ;东西路口显示时间减1s
- DEC SECOND2 ;南北路口显示时间减1s
- LCALL DISPLAY
- DJNZ R3,WAIT4 ;状态4维持20s
- ;*******************************************
- MOV R2,#5 ;置50ms计数初值
- MOV R4,#4 ;红灯闪20ms
- MOV R3,#3 ;绿灯闪3s
- MOV SECOND1,#5 ;东西路口计时显示初值5s
- MOV SECOND2,#5 ;南北路口计时显示初值5s
- LCALL DISPLAY
- WAIT5: LCALL STATE5 ;调用状态5
- JNB TF0,WAIT5 ;查询100ms到否
- CLR TF0
- MOV TH0,#3CH ;恢复T0定时初值100ms
- MOV TL0,#0B0H
- DJNZ R4,WAIT5 ;判断200ms到否?未到继续状态5
- CPL LED_G2 ;南北绿灯闪
- MOV R4,#4 ;闪烁200ms
- DJNZ R2,WAIT5 ;判断1s到否?未到继续状态5
- MOV R2,#5 ;置100ms计数初值
- DEC SECOND1 ;东西路口显示时间减1s
- DEC SECOND2 ;南北路口显示时间减1s
- LCALL DISPLAY
- DJNZ R3,WAIT5 ;状态5维持3s
- ;****************************************
- MOV R2,#20 ;置50ms计数初值
- MOV R3,#2 ;红灯闪2s
- MOV SECOND1,#2 ;东西路口计时显示初值2s
- MOV SECOND2,#2 ;南北路口计时显示初值2s
- LCALL DISPLAY
- WAIT6: LCALL STATE6 ;调用状态6
- JNB TF0,WAIT6 ;查询100ms到否
- CLR TF0
- MOV TH0,#3CH ;恢复T0定时初值100ms
- MOV TL0,#0B0H
- DJNZ R2,WAIT6 ;判断1s到否?未到继续状态6
- MOV R2,#20 ;置100ms计数初值
- DEC SECOND1 ;东西路口显示时间减1s
- DEC SECOND2 ;南北路口显示时间减1s
- LCALL DISPLAY
- DJNZ R3,WAIT6 ;状态6维持2s
- LJMP LOOP ;大循环
- ;**********************************************
- STATE1: ;状态1
- SETB LED_G1 ;东西路口绿灯亮
- CLR LED_Y1
- CLR LED_R1
- CLR LED_G2
- CLR LED_Y2
- SETB LED_R2 ;南北路口红灯亮
- RET
- STATE2: ;状态2
- CLR LED_Y1
- CLR LED_R1
- CLR LED_G2
- CLR LED_Y2
- SETB LED_R2 ;南北路口红灯亮
- RET
- STATE3: ;状态3
- CLR LED_G1
- CLR LED_R1
- CLR LED_G2
- CLR LED_Y2
- SETB LED_R2 ;南北路口红灯亮
- SETB LED_Y1 ;东西路口绿灯亮
- RET
- STATE4: ;状态4
- CLR LED_G1
- CLR LED_Y1
- SETB LED_R1 ;东西路口红灯亮
- SETB LED_G2 ;南北路口绿灯亮
- CLR LED_Y2
- CLR LED_R2
- RET
- STATE5: ;状态5
- CLR LED_G1
- CLR LED_Y1
- SETB LED_R1 ;东西路口红灯亮
- CLR LED_Y2
- CLR LED_R2
- RET
- STATE6: ;状态6
- CLR LED_G1
- CLR LED_Y1
- SETB LED_R1 ;东西路口红灯亮
- CLR LED_G2
- CLR LED_R2
- SETB LED_Y2 ;南北路口红灯亮
- RET
- DISPLAY: ;数码显示
- MOV A,SECOND1 ;东西路口计时寄存器
- MOV B,#10 ;16进制数拆成两个10进制数
- DIV AB
- MOV DBUF+3,A
- MOV A,B
- MOV DBUF+2,A
- MOV A,SECOND2 ;南北路口计时寄存器
- MOV B,#10 ;16进制数拆成两个10进制数
- DIV AB
- MOV DBUF+1,A
- MOV A,B
- MOV DBUF,A
- MOV R0,#DBUF
- MOV R1,#TEMP
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
交通信号.rar
(38.88 KB, 下载次数: 19)
|