⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jtled.asm

📁 基于7279的交通灯的源程序
💻 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 + -