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

📄 122.asm

📁 在89S51单片机上实现的交通灯控制源代码
💻 ASM
字号:
;******************************************************************
;              电信二班    郑尹铭     2005309214
;              电信一班    胡庆在     2005309123
;
;                       交通灯控制程序
;******************************************************************

        ORG 0000H
        LJMP 0030H

        ORG 0030H
        MOV SP,#60H
        MOV TMOD,#01H          ;定时方式设置
        MOV TH0,#3CH           ;装入初值
        MOV TL0,#0B0H
;******************************************************************
;                      初始化红绿灯,全亮
;******************************************************************

        MOV DPTR,#0FFD8H         ;东西入口地址
        MOV A,#0C0H
        MOVX @DPTR,A             ;东西灯全亮
        INC DPTR                 ;FFD9南北入口地址
        MOV A,#0C0H
        MOVX @DPTR,A            ;南北灯全亮
        SETB TR0           ;开定时

;******************************************************************
;                      东西绿灯,南北红灯段
;******************************************************************
JOD3:   MOV DPTR,#0FFD8H
        MOV A,#0EDH             ;东西绿灯
        MOVX @DPTR,A
        INC DPTR
        MOV A,#0F6H             ;南北红灯
        MOVX @DPTR,A
        MOV R2,#15H             ;绿灯秒数装入
        MOV R3,#20H             ;红灯秒数装入
        CLR 00H                ;标志位
        LJMP LOOP0              ;跳转到数码管扫描,等待定时
;******************************************************************
;                      东西黄灯闪烁段
;******************************************************************
JOD1:   MOV R4,#05H             ;闪烁次数
        MOV R2,#05H             ;闪烁秒数
        SETB 01H                ;闪烁标志位

JOD5:   SETB 02H                ;黄灯亮标志位
        MOV DPTR,#0FFD8H
        MOV A,#0DBH             ;东西黄灯亮
        MOVX @DPTR,A
        INC DPTR
        MOV A,#0F6H            ;南北红灯亮
        MOVX @DPTR,A
        DEC R4                 ;闪烁次数减一
        DJNZ R4,DX1            ;判断是否中止闪烁
        LJMP LOOP0             ;调转到扫描
DX1:    CLR 01H                ;停止闪烁标志位
        LJMP LOOP0             ;调转到扫描


JOD6:   CLR 02H                 ;黄灯灭标志位
        MOV DPTR,#0FFD8H
        MOV A,#0FFH             ;东西黄灯灭
        MOVX @DPTR,A
        INC DPTR
        MOV A,#0F6H             ;南北红灯亮
        MOVX @DPTR,A
        DEC R4                  ;闪烁次数减一
        DJNZ R4,DX2             ;判断是否中止闪烁
        LJMP LOOP0              ;调转到扫描
DX2:    CLR 01H                 ;停止闪烁标志位
        LJMP LOOP0              ;调转到扫描

;******************************************************************
;                      东西红灯,南北绿灯段
;******************************************************************


JOD4:   MOV DPTR,#0FFD8H
        MOV A,#0F6H         ;东西红灯亮
        MOVX @DPTR,A
        INC DPTR
        MOV A,#0EDH        ;南北绿灯亮
        MOVX @DPTR,A
        MOV R2,#20H
        MOV R3,#15H
        SETB 00H
        LJMP LOOP0              ;延时

;******************************************************************
;                      南北绿灯闪烁段
;******************************************************************

JOD7:   MOV R4,#05H        ;闪烁次数
        MOV R3,#05H        ;黄灯秒数
        SETB 01H           ;黄灯标志位

JOD2:   MOV DPTR,#0FFD8H
        MOV A,#0F6H        ;东西红灯亮
        MOVX @DPTR,A
        INC DPTR
        MOV A,#0DBH        ;南北黄灯亮
        MOVX @DPTR,A
        DEC R4                  ;闪烁次数减一
        DJNZ R4,DX3             ;判断是否中止闪烁
        LJMP LOOP0              ;调转到扫描
DX3:    CLR 01H                 ;停止闪烁标志位
        LJMP LOOP0              ;调转到扫描


JOD8:   MOV DPTR,#0FFD8H
        MOV A,#0F6H             ;东西红灯亮
        MOVX @DPTR,A
        INC DPTR
        MOV A,#0FFH             ;南北黄灯灭
        MOVX @DPTR,A
        DEC R4                  ;闪烁次数减一
        DJNZ R4,DX4             ;判断是否中止闪烁
        LJMP LOOP0              ;调转到扫描
DX4:    CLR 01H                 ;停止闪烁标志位
        LJMP LOOP0              ;调转到扫描


        
LOOP0:  MOV DPTR,#TAB           ;装入字段表首地址

;******************************************************************
;                      东西个位数码管扫描
;******************************************************************
        
LOOP1:  MOV A,R2                ;秒数装入A
        ANL A,#0FH              ;取出个位数
        MOVC A,@A+DPTR          ;查表
        MOV P0,A              ;设置字位码
        MOV P2,#11110111B              ;送字位码
        MOV P2,#0FFH
;******************************************************************
;                      东西十位数码管扫描
;******************************************************************

LOOP2:  MOV A,R2                ;秒数装入A
        SWAP A                  ;交换个位与十位
        ANL A,#0FH              ;取出十位数
        MOVC A,@A+DPTR          ;查表
        MOV P0,A              ;送字段
        MOV P2,#11111011B              ;送字位码
        MOV P2,#0FFH              ;避免影响,关字段

        
;******************************************************************
;                      南北个位数码管扫描
;******************************************************************
LOOP3:  MOV A,R3                 ;秒数装入A
        ANL A,#0FH               ;取出个位数
        MOVC A,@A+DPTR           ;查表
        MOV P0,A               ;送字段
        MOV P2,#11111101B               ;送字位码
        MOV P2,#0FFH               ;避免影响,关字段

        
;******************************************************************
;                      南北十位数码管扫描
;******************************************************************

LOOP4:  MOV A,R3                   ;秒数装入A
        SWAP A                     ;交换个位与十位
        ANL A,#0FH                 ;取出十位数
        MOVC A,@A+DPTR             ;查表
        MOV P0,A                 ;送字段
        MOV P2,#11111110B                 ;送字位码
        MOV P2,#0FFH                 ;避免影响,关字段
        JBC TF0,TIME0
        SJMP LOOP1                 ;循环扫描数码管
        
;******************************************************************
;                      中断响应程序
;******************************************************************

TIME0:  MOV TH0,#3CH           ;装入初值
        MOV TL0,#0B0H
        DJNZ 32H,DS1           ;判断中断循环次数
        ;CLR TR0                ;循环结束停定时器
        SJMP JISHU             ;跳转到计数多分支程序
DS1:    LJMP LOOP1                   ;循环未继续,继续扫描数码管

;******************************************************************
;                      计数多分支段
;******************************************************************

JISHU:  MOV 32H,#14H     ;定时循环重装初值


        MOV A,R2
        SUBB A,#01H           ;30H整形
        MOV R2,A
        JNB AC,DP1
        MOV A,R2
        SUBB A,#06H
        MOV R2,A

DP1:    MOV A,R3
        SUBB A,#01H
        MOV R3,A            ;31H整形
        JNB AC,DP4
        MOV A,R3
        SUBB A,#06H
        MOV R3,A


DP4:    ;SETB TR0
        JB 00H,DP5          ;东西 OR 南北判断
;******************************************************************
;                      东西
;******************************************************************
        JB 01H,DP6          ;判断黄灯是否开始闪烁
        CJNE R2,#00H,LOOP1  ;秒数未到,继续扫描数码管
        CJNE R3,#00H,DP8    ;绿灯秒数到,红灯未到,跳转到黄灯初启化
        LJMP JOD4           ;红灯时间到,转绿灯
DP8:    LJMP JOD1           ;


DP6:    JB 02H,DP7          ;黄灯闪烁分支
        LJMP JOD5
DP7:    LJMP JOD6

;******************************************************************
;                      南北
;******************************************************************

DP5:    JB 01H,DP10           ;南北
        CJNE R3,#00H,LOOP1
        CJNE R2,#00H,DP9
        LJMP JOD3
DP9:    LJMP JOD7

DP10:    JB 02H,DP11
         LJMP JOD2
DP11:    LJMP JOD8
        

TAB:    DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
        

        END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -