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

📄 signal_controller.asm

📁 基于51的交通信号灯控制程序
💻 ASM
字号:
;可更新计时时间,数字显示简单,倒计时不再连跳两秒
;各按键均可强制使用,可正确响应软件的各按钮设置
;时钟不太匹配
;---------端口定义----------------------
RG1        BIT        P0.0
RG2        BIT        P0.1
RG3        BIT        P0.2
RG4        BIT        P0.3
RG5        BIT        P0.4
RG6        BIT        P0.5
RG7        BIT        P0.6
RG8        BIT        P0.7;8个红/绿灯依次灭
;----------------------------------------
RGA        BIT        P2.0
RGB        BIT        P2.1
RGC        BIT        P2.2
RGD        BIT        P2.3;4个闪提示的红/绿灯

DI_A       BIT        P2.4
DI_B       BIT        P2.5
DI_C       BIT        P2.6
DI_D       BIT        P2.7;数码管的个位
;-----------------------------------------
LED_RST    BIT        P1.0;灯复位
LED_EN     BIT        P1.1;灯使能
R_ON       BIT        P1.2
G_ON       BIT        P1.3

RST        BIT        P1.5;1302的复位信号
S_CLK      BIT        P1.6;1302的串行时钟信号
S_DAT      BIT        P1.7;1302的串行数据(I/O)
;-----------------------------------------
R_DAT      BIT        P3.0;接收数据
T_DAT      BIT        P3.1;发送数据
DE_A       BIT        P3.2
DE_B       BIT        P3.3
DE_C       BIT        P3.4
DE_D       BIT        P3.5;数码管的十位

RG_SEL     BIT        P3.7;红绿选择
;-------------20H-----------
LED_END    BIT        00H;行灯全灭标志位
LIT_EXT    BIT        01H;闪灯标志位
RESTART    BIT        02H;接到新数重新开始标志位
RESET      BIT        03H;复位标志位
O_C_END    BIT        04H;一个颜色已完
T0_OVER    BIT        05H;T0溢出中断标志位

LED_OFF    BIT        06H;暂停标志位
KEY_DOWN   BIT        07H;按键标志位
;---------------21H----------------------
L_RST      BIT        08H
L_EN       BIT        09H;开始/暂停位
L_RED      BIT        0AH
L_GREEN    BIT        0BH
L_PAUSE    BIT        0CH;暂停结束位
L_END      BIT        0DH;

RS_REVFA   BIT        0EH
FST_SEC    BIT        0FH;第一秒标志
;---------------22H----------------------
SAVE_P0    DATA       22H
SAVE_P1    DATA       23H
SAVE_P2    DATA       24H
SAVE_P3    DATA       25H

W_DATA     DATA       26H;1302命令数据
W_DATB     DATA       27H;1302时钟数据
SEC_DAT    DATA       28H;秒数据
LED_LIGHT  DATA       29H;LED亮灭控制
L_NUM1     DATA       2AH
L_NUM2     DATA       2BH
SEC_CON    DATA       2CH

DEL00      DATA       2DH
DEL01      DATA       2EH
DEL02      DATA       3FH
TACOM      DATA       30H
RS_DATA    EQU        31H
RS_SEND    DATA       32H

save_num   data       34h
save_num10 data       35h
save_num0  data       36h

;-------------主程序------------

        ORG     0000H
        LJMP    MAIN
        ORG     000BH         ;定时器0入口地址
        LJMP    TIME0PR
        ORG     0023H         ;串行通信入口地址
	LJMP    RS_RECIEVE
        ORG     100H
MAIN:   LCALL   RAM_INI
        LCALL   DS1302_INI
        MOV     SP,#40H
BEGIN00:MOV     P0,#0FFH
        ORL     P2,#0FH
        CLR     RG_SEL
        CLR     FST_SEC
        CLR     RESET
BEGIN01:JNB     RS_REVFA,BEGIN01
        LCALL   RS_JUDGE
        JNB     LED_OFF,BEGIN02
        LCALL   LED_OFF00
        LJMP    BEGIN01
BEGIN02:JB      RESET,BEGIN00
START00:MOV     LED_LIGHT,#0FFH
        MOV     P0,#0FFH
        ORL     P2,#0FH
        CLR     RGA
        CLR     RESTART
        LCALL   RECIEVE00
        LCALL   JUDGE10
        MOV     R4,SAVE_NUM
        MOV     R0,L_NUM1
        MOV     R6,#08H
START01:LCALL   RECIEVE01
        JNB     RS_REVFA,START02
        LCALL   RS_JUDGE
        CLR     RS_REVFA
        JNB     LED_OFF,START07
        LCALL   LED_OFF00
        LJMP    BEGIN01
START07:JB      RESET,BEGIN00
        JB      RESTART,START00
START02:LCALL   O_SEC00
        JNB     KEY_DOWN,START06
        LCALL   KEY00
START06:CJNE    R6,#00H,START03
        LCALL   FLICKER
        LJMP    START04
START03:DJNZ    R0,START04
        MOV     R0,L_NUM1
        LCALL   L_ONE
        DEC     R6
START04:DEC     SAVE_NUM
        DJNZ    R4, START01
        LCALL   RECIEVE01
        LCALL   O_SEC00
START05:CPL     RG_SEL
        LJMP    START00
;-----------RAM、RS232初始化---------
RAM_INI:MOV     A,#00H
	MOV     R0,#20H
RAM_INA:MOV     @R0,A
        INC     R0
        CJNE    R0,#60H,RAM_INA
        MOV     TMOD,#21H
	MOV     TH1,#0F4H
	MOV     TL1,#0F4H
        MOV     SCON,#01010000B
	MOV     PCON,#80H        ;4800bps
        MOV     TH0,#0CH
	MOV     TL0,#58H
        SETB    ET0             ;允许"T0"中断
 	SETB    TR0             ;启动定时器"0"
	SETB    TR1
	SETB    ES              ;开串行口中断
	SETB    EA              ;开中断
        MOV     A,#0FFH
        MOV     P0,A
        MOV     P1,A
        MOV     P2,A
        MOV     P3,A
        MOV     LED_LIGHT,A
        CLR     RS_REVFA
        CLR     FST_SEC
        CLR     RESET
        CLR     RESTART
        CLR     LED_OFF
        RET
;------RS232数据接收程序-----------
RS_RECIEVE:
        PUSH    ACC
        PUSH    PSW
	JNB     TI,RS_RECA
        POP     PSW
	POP     ACC
        RETI
RS_RECA:JNB     RI,RS_RET
        CLR     RI
	MOV     A,SBUF
RS_RECB:MOV     R1,#RS_DATA
        MOV     @R1,A
        SETB    RS_REVFA
RS_RET: POP     PSW
        POP     ACC
       	RETI
;-------RS232数据发送程序-----------
SEND_DATA:
        CLR     ES
        MOV     A,RS_SEND
        MOV     SBUF,A
        JNB     TI,$
	CLR     TI
        LCALL   DTIME
        SETB    ES
        RET
;-------------------------
DTIME:  MOV	R3,#080H
	DJNZ	R3,$
 	RET

;---------------------------------
RECIEVE00:
        MOV     R1,#RS_DATA
        MOV     A,@R1
        MOV     SAVE_NUM,A
        RET
;----------处理接收并发送------------
RECIEVE01:
        LCALL   DIV00
        LCALL   DISPLAY00
        MOV     RS_SEND,SAVE_NUM
        LCALL   SEND_DATA
        RET
;--------显示数字-----------
DISPLAY00:                  ;此程序的端口处理部分普遍适用
        MOV     A,SAVE_NUM0       ;个位
        RL      A
        RL      A
        MOV     SAVE_P3,P3        ;端口处理(4句)
        ANL     SAVE_P3,#0C3H
        ORL     SAVE_P3,A
        MOV     P3,SAVE_P3
        MOV     A,SAVE_NUM10      ;十位
        SWAP    A
        MOV     SAVE_P2,P2
        ANL     SAVE_P2,#0FH
        ORL     SAVE_P2,A
        MOV     P2,SAVE_P2
        RET
;--------16=>10------------     16进制变10进制
DIV00:  MOV     A,SAVE_NUM      ;两位数除10,三位除100
        MOV     B,#0AH
        DIV     AB
        MOV     SAVE_NUM10,A
        MOV     SAVE_NUM0,B
        RET
;-----------1302初始化--------------
DS1302_INI:
         MOV     W_DATA,#90H
         MOV     W_DATB,#0A0H        ;禁止向备用电池充电
         LCALL   SAVE_SDAT
         MOV     W_DATA,#80H
         MOV     W_DATB,#00H
         LCALL   SAVE_SDAT
       ;  MOV     W_DATA,#8EH
       ;  MOV     W_DATB,#80H
        ; LCALL   SAVE_SDAT          ;禁止向DS1302写数据
         RET
;--------读DS1302芯片秒数据--------
LOAD_SDAT:
        CLR	S_CLK               ;1302串行时钟信号清位(S_CLK的高低作为时钟控制1302)
	NOP
	SETB	RST                 ;1302复位信号置位,即启动1302发送数据
	MOV	R5,#08H
        MOV     A,W_DATA            ;读入1302的命令数据
LOAD_PA:CLR	S_CLK
	RRC	A
	MOV	S_DAT,C             ;发送命令字——送串行数据信号
	SETB	S_CLK
	NOP
	DJNZ	R5,LOAD_PA          ;共8次
	MOV	R5,#08H
	CLR	S_CLK
	NOP
        SETB    S_DAT
	MOV	R5,#08H
LOAD_PB:CLR	S_CLK
	MOV	C,S_DAT             ;将读到的数据送“C”标志位
	RRC	A
      ;  MOV     SEC_CON,A
	SETB	S_CLK
	NOP
	DJNZ	R5,LOAD_PB
	CLR     RST
	RET
 ;-----向DS1302芯片写时钟数据------
SAVE_SDAT:
	CLR	S_CLK
	NOP
	SETB	RST
	MOV	R5,#08H
        MOV     A,W_DATA
PA_SAVE:CLR	S_CLK
	RRC	A
	MOV	S_DAT,C              ;发送命令字
	SETB	S_CLK
	NOP
	DJNZ	R5,PA_SAVE
	MOV	R5,#08H
        MOV     A,W_DATB
PB_SAVE:CLR	S_CLK
	RRC	A
	MOV	S_DAT,C              ;发送写数据
	SETB	S_CLK
	DJNZ	R5,PB_SAVE
        CLR     RST
 	RET
;----------计时一秒-----------
O_SEC00:LCALL   JUDGE00
O_SEC01:MOV	W_DATA,#81H
	LCALL	LOAD_SDAT         ;读秒信号
        CJNE    A,SEC_DAT,O_SEC02 ;不等既是增一秒转而显示
        LJMP    O_SEC01
O_SEC02:MOV     SEC_DAT,A
        RET
;-------判断计时开始-----------
;如是第一次读秒则先回送已存秒数,以消除跳字现象
JUDGE00:JB      FST_SEC,JUDGE01
        SETB    FST_SEC
        MOV     W_DATA,#83H
        MOV     W_DATB,SEC_DAT
        LCALL   SAVE_SDAT
JUDGE01:RET
;--------计算灭灯间隔---------
JUDGE10:MOV     A,SAVE_NUM
        CLR     C
        SUBB    A,#06H
        JNC     JUDGE11
        MOV     R6,#00H
        RET
;-----------------------------------
JUDGE11:MOV     B,#08H
        DIV     AB
        MOV     L_NUM1,A
        MOV     R2,B
        CJNE    R2,#00H,JUDGE12
        RET
JUDGE12:DJNZ    R2,JUDGE13
        RET
JUDGE13:DJNZ    R2,JUDGE14
        RET
JUDGE14:DJNZ    R2,JUDGE15
        RET
JUDGE15:DJNZ    R2,JUDGE16
        RET
JUDGE16:INC     L_NUM1
        RET
 ;-----------灭一行-------------
L_ONE:  CLR     C
        MOV     A,LED_LIGHT         ;灭一行
        RLC     A
        MOV     P0,A
        MOV     LED_LIGHT,A
       ; DJNZ    R6,L_RET
       ; SETB    LED_END             ;8行都灭之后设全灭标志
L_RET:  RET
;-----------闪   灯--------------
FLICKER:JNB     LIT_EXT,GO_OUT
LIGHT:  MOV     A,P2
        ORL     A,#0EH              ;闪灯——亮
        MOV     P2,A
        CLR     LIT_EXT             ;标志为0
        AJMP    F_RET
GO_OUT: MOV     A,P2
        ANL     A,#0F1H             ;闪灯——灭
        MOV     P2,A
        SETB    LIT_EXT             ;标志为1
F_RET:  RET
;------- 定时器“0”中断 ------
TIME0PR:PUSH    ACC
        PUSH    PSW
	MOV     TH0,#0CH
	MOV     TL0,#58H
	MOV     A,TACOM
	INC     A
	CJNE    A,#04H,TIME0PB
TIME0PA:LCALL   READ_KEY
        LCALL   DELAY00
        LCALL   READ_KEY
        MOV     TACOM,#00H
        SETB    T0_OVER
        SETB    TR0
        POP     PSW
        POP     ACC
        RETI
TIME0PB:JNC     TIME0PA
        MOV     TACOM,A
        SETB    TR0
        POP     PSW
	POP     ACC
	RETI
;-----------延时去抖动-------------
DELAY00:MOV     DEL00,#2H
DELAY01:MOV     DEL01,#070H
DELAY02:MOV     DEL02,#070H
DELAY03:DJNZ    DEL02,DELAY03
        DJNZ    DEL01,DELAY02
        DJNZ    DEL00,DELAY01
        RET
;-----------读按键--------------
READ_KEY:
        JB     LED_RST,READ_EN
        SETB   KEY_DOWN
        SETB   L_RST
        CLR    L_PAUSE
        CLR    L_EN
        CLR    L_RED
        CLR    L_GREEN
        CLR    L_END
        RET
READ_EN:JB     LED_EN,READ_RD
        JB     L_EN,READ_PS
        SETB   KEY_DOWN
        SETB   L_EN
        CLR    L_PAUSE
        CLR    L_END
        CLR    L_RST
        CLR    L_RED
        CLR    L_GREEN
        RET
READ_PS:JB     L_PAUSE,READ_ED
        SETB   KEY_DOWN
        SETB   L_PAUSE
        CLR    L_END
        CLR    L_RST
        CLR    L_RED
        CLR    L_GREEN
        RET
READ_ED:JB      L_END,READ_PS
        SETB    KEY_DOWN
        SETB    L_END
        CLR     L_PAUSE
        CLR     L_RST
        CLR     L_RED
        CLR     L_GREEN
        RET
READ_RD:JB     R_ON,READ_GN
        SETB   KEY_DOWN
        SETB   L_RED
        CLR    L_RST
        CLR    L_GREEN
        RET
READ_GN:JB     G_ON,READ_RET
        SETB   KEY_DOWN
        SETB   L_GREEN
        CLR    L_RST
        CLR    L_RED
READ_RET:
        RET
;---------判断是哪个键---------
KEY00:  JNB     L_RST,KEY01
        CLR     L_RST
        LJMP    BEGIN00
KEY01:  JNB     L_EN,KEY02
        LCALL   LED_PAUSE
        RET
KEY02:  JNB     L_RED,KEY04
        LCALL   RED00
KEY03:  JNB     L_RED,KEY03
        CLR     L_RED
        RET
KEY04:  JNB     L_GREEN,KEY06
        LCALL   GREEN00
KEY05:  JNB     L_GREEN,KEY05
        CLR     L_GREEN
KEY06:  RET
;----------暂  停------------
LED_PAUSE:
        MOV     R4,#14H          ;20S后自动恢复
PAUSE00:JB      L_RED,PAUSE01
        JB      L_GREEN,PAUSE02
        JB      L_END,PAUSE03
        LCALL   O_SEC00
        DJNZ    R4,PAUSE00
        LJMP    PAUSE03
PAUSE01:LCALL   UP00
        LJMP    PAUSE00
PAUSE02:LCALL   DOWN00
        LJMP    PAUSE00
PAUSE03:CLR     KEY_DOWN
        CLR     L_EN
        CLR     L_END
        RET
;----------调高数字------------------
UP00:   INC     SAVE_NUM
        LCALL   RECIEVE01
        CLR     L_RED
        RET
;----------调低数字------------------
DOWN00: DEC     SAVE_NUM
        LCALL   RECIEVE01
        CLR     L_GREEN
        RET
;--------红灯亮-----------
RED00:  CLR     RG_SEL
        PUSH    A
        MOV     A,#0FFH
        MOV     P0,A
        MOV     A,#0FH
        ORL     P2,A
        CLR     L_RED
        POP     A
        RET
;--------绿灯亮------------
GREEN00:SETB    RG_SEL
        PUSH    A
        MOV     A,#0FFH
        MOV     P0,A
        MOV     A,#0FH
        ORL     P2,A
        CLR     L_GREEN
        POP     A
        RET
;--------黄灯闪---------
YELLOW00:
        PUSH    A
        MOV     A,#0FFH
        MOV     P0,A
        MOV     A,#0FH
        ORL     P2,A
        CPL     RG_SEL
        POP     A
        RET
;-------判断接收到的命令字-----
RS_JUDGE:
        CLR     RS_REVFA
        MOV     R1,#RS_DATA
        MOV     A,@R1
        MOV     SAVE_NUM,A
        MOV     RS_SEND,A
        LCALL   SEND_DATA
RS00:   CJNE    A,#00H,RS01
        SETB    LED_OFF
        RET
RS01:   CJNE    A,#01H,RS02
        SETB    RESET
        RET
RS02:   CJNE    A,#02H,RS03
        LCALL   RED00
        JNB     RS_REVFA,RS02
        RET
RS03:   CJNE    A,#03H,RS04
        LCALL   GREEN00
        JNB     RS_REVFA,RS03
        RET
RS04:   CJNE    A,#04H,RS05
        LCALL   YELLOW00
        JNB     RS_REVFA,RS04
        RET
RS05:   SETB    RESTART
        CLR     RG_SEL
        RET
;--------灭  灯---------
LED_OFF00:
        CLR     LED_OFF
        MOV     P0,#00H
        ANL     P2,#0F0H
        RET

⌨️ 快捷键说明

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