📄 jtled.asm
字号:
;//*******************************************************************
;文件名:交通灯程序 FOR MCU51
;功能:双色LED模拟交通灯信号,。
;接线:P1.0同时接LG1、LG3,P1.1接LR1、LR3,P1.2接LG2、LG4,P1.3同时接LR2、LR4,
;
;//*******************************************************************
$INCLUDE(C8051F020.INC)
SECOND1 EQU 30H ;东西秒寄存器
SECOND2 EQU 31H ;南北秒寄存器
DBUF EQU 40H ;显示缓冲1
TEMP EQU 44H ;显示缓冲2
LED_G1 BIT P1.0 ;东西绿灯
LED_R1 BIT P1.1 ;东西红灯
LED_G2 BIT P1.2 ;南北绿灯
LED_R2 BIT P1.3 ;南北红灯
Din BIT P1.6 ;串行显示数据
CLK BIT P1.7 ;串行显示时钟
ORG 0000H
LJMP START
ORG 0100H
START:
mov WDTCN, #0deh ; 禁止看门狗定时器
mov WDTCN, #0adh
; mov OSCXCN, #67h ; 外部晶振22.1184MHz
clr A ; wait at least 1ms 延时1ms
djnz acc, $ ; wait ~512us
djnz acc, $ ; wait ~512us
orl OSCICN, #02h ; 使用内部8MHz时钟
PORT_Init:
; mov XBR0, #00h
; mov XBR1, #00h
mov XBR2, #40h
EMIF_Init:
mov EMI0CF, #2Ch ; 复用方式,高4端口。
mov EMI0TC, #45h ; 时序控制,timing (7-cycle MOVX)
mov P74OUT, #0FFh ; P4-7口推挽输出
mov P1MDOUT,#0FFH ;端口驱动
mov CKCON, #00h ; 定时器Timer0使用系统时钟1/12作为时间基准
MAIN: LCALL STATE0 ;调用状态0
LCALL DELAY ;调用延时
MOV TMOD,#01H ;置T0工作方式1
MOV TH0, #70H ;置T0定时初值50mS 8MHz时钟
MOV TL0, #0FBH
SETB TR0 ;启动T0 CLR EA
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, #70H ;恢复T0定时初值50mS
MOV TL0, #0FBH
SETB TR0 ;启动T0
DJNZ R2,WAIT1 ;判1S到否?未到继续状态1
MOV R2,#20 ;置50mS计数初值
DEC SECOND1 ;东西秒显示减一
DEC SECOND2 ;南北秒显示减一
LCALL DISPLAY
DJNZ R3,WAIT1 ;状态1维持20S
;***************************************************
MOV R2,#2 ;250mS灭,250mS亮 (250mS+250mS)*2=1S
MOV R3,#3 ;绿灯闪3S
MOV R4,#5 ;闪烁间隔200mS
MOV SECOND1,#5 ;东西秒显示初值5S
MOV SECOND2,#5 ;南北秒显示初值5S
LCALL DISPLAY
WAIT2: LCALL STATE2 ;调用状态2
JNB TF0,WAIT2 ;查询50mS到否
CLR TF0
MOV TH0, #70H ;恢复T0定时初值50mS
MOV TL0, #0FBH
DJNZ R4,WAIT2 ;判200mS到否?未到继续状态2
CPL LED_G1 ;东西绿灯闪
MOV R4,#5 ;闪烁间隔200mS
DJNZ R2,WAIT2 ;判1S到否?未到继续状态2
MOV R2,#5 ;置50mS计数初值
DEC SECOND1 ;东西秒显示减一
DEC SECOND2 ;南北秒显示减一
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 ;查询30mS到否
CLR TF0
MOV TH0, #70H ;恢复T0定时初值50mS
MOV TL0, #0FBH
DJNZ R2,WAIT3 ;判1S到否?未到继续状态3
MOV R2,#20 ;置50mS计数初值
DEC SECOND1 ;东西秒显示减一
DEC SECOND2 ;南北秒显示减一
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 ;查询50mS到否
CLR TF0
MOV TH0, #70H ;恢复T0定时初值50mS
MOV TL0, #0FBH
DJNZ R2,WAIT4 ;判1S到否?未到继续状态4
MOV R2,#20 ;置50mS计数初值
DEC SECOND1 ;东西秒显示减一
DEC SECOND2 ;南北秒显示减一
LCALL DISPLAY
DJNZ R3,WAIT4 ;状态4维持20S
;***************************************************
MOV R2,#5 ;置50mS计数初值 5*4=20
MOV R4,#4 ;闪烁间隔200mS
MOV R3,#3 ;绿灯闪3S
MOV SECOND1,#5 ;东西秒显示初值5S
MOV SECOND2,#5 ;南北秒显示初值5S
LCALL DISPLAY
WAIT5: LCALL STATE5 ;调用状态5
JNB TF0,WAIT5 ;查询50mS到否
CLR TF0
MOV TH0, #70H ;恢复T0定时初值100mS
MOV TL0, #0FBH
DJNZ R4,WAIT5 ;判200mS到否?未到继续状态5
CPL LED_G2 ;南北绿灯闪
MOV R4,#4 ;闪烁200mS
DJNZ R2,WAIT5 ;判1S到否?未到继续状态5
MOV R2,#5 ;置100mS计数初值
DEC SECOND1 ;东西秒显示减一
DEC SECOND2 ;南北秒显示减一
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, #70H ;恢复T0定时初值100mS
MOV TL0, #0FBH
DJNZ R2,WAIT6 ;判1S到否?未到继续状态6
MOV R2,#20 ;置100mS计数初值
DEC SECOND1 ;东西秒显示减一
DEC SECOND2 ;南北秒显示减一
LCALL DISPLAY
DJNZ R3,WAIT6 ;状态6维持2S
LJMP LOOP ;大循环
STATE0: ;状态0
MOV P1,#0
CLR LED_G1
SETB LED_R1 ;东西红灯亮
CLR LED_G2
SETB LED_R2 ;南北红灯亮
RET
STATE1: ;状态1
SETB LED_G1 ;东西绿灯亮
CLR LED_R1
CLR LED_G2
SETB LED_R2 ;南北红灯亮
RET
STATE2: ;状态2
CLR LED_R1
CLR LED_G2
SETB LED_R2 ;南北红灯亮
RET
STATE3: ;状态3
SETB LED_G1
SETB LED_R1 ;东西黄灯亮
CLR LED_G2
SETB LED_R2 ;南北红灯亮
RET
STATE4: ;状态4
CLR LED_G1
SETB LED_R1 ;东西红灯亮
SETB LED_G2 ;南北绿灯亮
CLR LED_R2
RET
STATE5: ;状态5
CLR LED_G1
SETB LED_R1 ;东西红灯亮
CLR LED_R2
RET
STATE6: ;状态6
CLR LED_G1
SETB LED_R1 ;东西红灯亮
SETB LED_G2
SETB LED_R2 ;南北黄灯亮
RET
DISPLAY: ;数码显示
MOV A, SECOND1 ;东西秒寄存器
MOV B, #10 ;16进制数拆成两个10进制数
DIV AB
MOV DBUF+1,A
MOV A,B
MOV DBUF, A
MOV A, SECOND2 ;南北秒寄存器
MOV B, #10 ;16进制数拆成两个10进制数
DIV AB
MOV DBUF+3, A
MOV A,B
MOV DBUF+2, A
MOV R0,#DBUF
MOV R1,#TEMP
MOV R7,#4
DP10: MOV DPTR,#LEDMAP
MOV A,@R0
MOVC A,@A+DPTR
MOV @R1,A
INC R0
INC R1
DJNZ R7,DP10
MOV R0,#TEMP
MOV R1,#4
DP12: MOV R7,#8
MOV A,@R0
DP13: RLC A
MOV DIN,C
CLR CLK
SETB CLK
DJNZ R7,DP13
INC R0
DJNZ R1,DP12
RET
LEDMAP: DB 3FH,6,5BH,4FH,66H,6DH ;0,1,2,3,4,5
DB 7DH,7,7FH,6FH,77H,7CH ;6,7,8,9,A,B
DB 58H,5EH,7BH,71H,0,40H ;C,D,E,F, , -
Delay: mov r5, #5
DLoop0: mov r6, #0
DLoop1: mov r7, #0
DLoop2:
NOP
NOP
djnz r7, DLoop2
djnz r6, DLoop1
djnz r5, DLoop0
ret
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -