📄 suidao light.asm
字号:
;--------------------------------------------------------------------------
;
; 隧道指示灯控制器程序
; V1.0
;软件说明:
;此软件是V1.0版本2006-11-01
;使用12887储存时段表和显示方案
;
;
;--------------------------------------------------------------------------
;联网地址(0--FF)
;地址=0FFH 为广播地址,地址=0 ~ 0FEH 为单机地址
LW_ADDR EQU 1
;--------------------------------------------------------------------------
;变量定义表
;------------------------寄存器定义----------------------------------------
RHOUR DATA 28H ;当前小时寄存器,以BCD形式
RMINUTE DATA 29H ;当前分钟寄存器,以BCD形式
TMSG DATA 2AH ;当前时段寄存器,以BCD形式
TEST_H DATA 2BH ;小时缓冲
TEST_M DATA 2CH ;分钟缓冲
;--------------------------------------------------------------------------
;------------------------标志位定义----------------------------------------
;ONOFF_FLG EQU 00H
;---------------------------------------------------------------------------
;------------------------地址常量定义---------------------------------------
SD_ADDR EQU 0010H ;时段表存储开始地址,外部RAM
MAXTEG EQU 000FH ;最大时段值存储地址,外部RAM
XS_ADDR EQU 0030H ;显示方案表存储开始地址,外部RAM
;---------------------------------------------------------------------------
;------------------------常量定义-------------------------------------------
;本机使用9600波特率,SMOD=0
BD_RATE EQU 0FDH ;9600 BOAD_RATE VALUE 11.0592M
SDXZ EQU 09H ;时段限制(BCD)SDXZ=SDXZ1+1
;SDXZ1 EQU 08H ;时段限制(BCD)
SDXZ3 EQU 08H
SD_NUM EQU 20H ;时段表长度=8 * 4
SD_LONG EQU 04H ;时段表中单个时段结构的长度
XS_NUM EQU 09H ;显示方案表长度
SEND_NUM EQU 34H ;模拟口1发送数代换数
JISHU_NUM EQU 35H ;模拟口1发送计数器代换数
R0_NUM EQU 36H;
;
;信号引脚定义
DOG EQU P3.5 ;
TIME EQU P3.4 ;=0 DS12887片选有效
XDAT EQU P1.0
XTXD EQU P1.1
XLAT EQU P1.2
STACK EQU 50H
;
;---------------------------------------------------------------------------
;------------------------以下为程序清单-------------------------------------
ORG 0000H
AJMP START ;主程序
ORG 0023H
LJMP S_PORT ;INTERRUPT OF SERIES PORT
;首先对89C51初始化
ORG 0030H
START: NOP
MOV 8EH,#02H ;应用STC89C53RC时,禁止内部扩屏RAM
MOV SP,#STACK ;设堆栈首地址
MOV PCON,#00000000B ;SMOD=0
MOV SCON,#01010000B ;1101 0000 (MODE 1 ;RECEIVE ENABLE)
MOV TMOD,#00100000B ;0010 0000 (T1 MODE 2_TIME)
MOV TCON,#01000000B ;0100 0000 (TR1=1 )
MOV TL1,#BD_RATE ;T1 IS TIMER ,MAKE BARD_RATE
MOV TH1,#BD_RATE
MOV IP,#00010000B ;0001 0000 (S-PORT HIGH interrupt)
MOV IE,#10010000B ;1001 0000 (S_PORT ENABLE INT)
CPL DOG
;初始化各变量寄存器
MOV 20H,#00H ; 清位寻址区
MOV 21H,#00H ;
MOV 22H,#00H ;
MOV 23H,#00H ;
CLR TIME
MOV TMSG,#01H ;当前时段
MOV DPTR,#007EH ;判断是否初次运行
MOVX A,@DPTR
CJNE A,#2CH,CLKSET
INC DPTR
MOVX A,@DPTR
CJNE A,#2CH,CLKSET
NOP
NOP
LJMP SFLOG ;应该直到RDTIME
CLKSET: CPL DOG
;对DS12887初始化,写操作
MOV DPTR,#000BH ;B寄存器SET位置1,禁止12887运行,
MOV A,#0A2H ;设24小时制
MOVX @DPTR,A
MOV DPTR,#0000H ;清秒
CLR A
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
INC DPTR ;清分
MOVX @DPTR,A
INC DPTR ;分闹钟用03
MOV A,#03H
MOVX @DPTR,A
INC DPTR ;清时
MOV A,#07H
MOVX @DPTR,A ;7时
INC DPTR
MOV A,#00H
MOVX @DPTR,A ;时闹钟00
INC DPTR ;清周
MOV A,#01H ;周一
MOVX @DPTR,A
INC DPTR ;日1
MOVX @DPTR,A
INC DPTR
MOV A,#11H ;月11
MOVX @DPTR,A
INC DPTR
MOV A,#06H ;年06
MOVX @DPTR,A
MOV DPTR,#000AH ;以BCD码计时,允许报警中断
MOV A,#0A0H ;设为010允许保留时间 ,uip位不应该置位
MOVX @DPTR,A
MOV DPTR,#000CH ;C寄存器没有作用
MOVX A,@DPTR
INC DPTR
MOVX A,@DPTR ;D寄存器没有作用
MOV DPTR,#000BH
MOV A,#22H ;B寄存器SET位置0,12887正常运行,
MOVX @DPTR,A
CPL DOG
;
;将时段方案表装入存储器(12887)
LDTB: MOV DPTR,#SD_ADDR ;时段表存储开始地址,外部RAM
MOV R0,DPL
MOV R1,DPH
MOV DPTR,#TABL2 ;时段表首地址
MOV R5,#SD_NUM ;时段表长度
LOADNUM: CLR A
MOVC A,@A+DPTR ;查表输入
MOV P2,R1
MOVX @R0,A ;
INC DPTR
LCALL INCR0R1
DJNZ R5,LOADNUM
CPL DOG
MOV DPTR,#XS_ADDR ;显示方案表存储开始地址,外部RAM
MOV R0,DPL
MOV R1,DPH
MOV DPTR,#TABL1 ;显示方案表首地址
MOV R5,#XS_NUM ;显示方案表长度
LOADNUMM: CLR A
MOVC A,@A+DPTR ;查表输入
MOV P2,R1
MOVX @R0,A ;
INC DPTR
LCALL INCR0R1
DJNZ R5,LOADNUMM
CPL DOG
MOV DPTR,#MAXTEG ;最大时段值存储地址
MOV A,#SDXZ3 ;当前最大时段设为"8"
MOVX @DPTR,A ;
;
SFLOG: CPL DOG ;不是初次运行
MOV DPTR,#007EH ;置运行标志
MOV A,#2CH
MOVX @DPTR,A
INC DPTR
MOVX @DPTR,A
;************************************************************************
RDTIME: MOV DPTR,#000AH ;访问DS12887
MOVX A, @DPTR ;读取当前时刻
CPL DOG
JBC ACC.7,RDTIME ;当UIP为1,更新数据. 只读,不用清0
MOV DPTR,#0002H ;当UIP为0,244us更新一次,
MOVX A,@DPTR ;时间,日历等在此时可以访问
MOV RMINUTE,A ;UIP READ ONLY,
INC DPTR ;置寄存器B中SET位1,清UIP位
INC DPTR
MOVX A,@DPTR
MOV RHOUR,A
CPL DOG ;
;------------------------------------------------------------
;判断当前最大时段是多少,存入12887
MOV R3,#00H
LLP1: INC R3 ;
CJNE R3,#SDXZ3,PLC1 ;
NOP
LJMP OUTP1
PLC1: MOV A,R3
MOV R4,A
LCALL JSSD
; MOV DPTR,#SD_ADDR ;读取时段表数据
INC DPTR
INC DPTR
MOVX A,@DPTR ;
MOV TEST_H,A ;
INC DPTR ;
MOVX A,@DPTR
MOV TEST_M,A
LCALL DECDPTR ;DPTR=DPTR-1
MOV A,#SD_LONG
CLR C
ADD A,DPL
MOV DPL,A
CLR A
ADDC A,DPH
MOV DPH,A
MOVX A,@DPTR
CJNE A,TEST_H,LLP1
INC DPTR
MOVX A,@DPTR
CJNE A,TEST_M,LLP1
;小时,分钟相同则认为后面没有新时段
OUTP1: MOV DPTR,#MAXTEG ;最大时段值存储地址
MOV A,R3
LCALL BINBCD ; 其实可以不转都行的
MOVX @DPTR,A
;根据当前时刻,判断应该运行第几时段
CKTAB: MOV A,TMSG
LCALL BCDBIN
MOV R4,A
NOP
JZ NORGT
NOP
CJNE A,#SDXZ,THIS3
THIS3: NOP
JC NWR
NORGT: MOV A,#01H ;大于10,则重赋值
MOV TMSG,A
MOV R4,#01H
NWR: LCALL JSSD ;计算时段条地址,R4为时段值
INC DPTR ;DPTR存储时段条地址
INC DPTR
MOVX A,@DPTR
MOV R4,A ;THE TABLE HOUR IN R4
INC DPTR
MOVX A,@DPTR
LCALL DECDPTR
MOV R5,A ;THE TABLE MINUTE IN R5
MOV A,R4
CJNE A,RHOUR,LL1
MOV A,R5
CJNE A,RMINUTE,LL1
NOP
NOP
LJMP FOUND
LL1: NOP
JC BIG
MOV A,TMSG ;如果比现时时间大,则将时段减一
CJNE A,#01H,DECR
PUSH DPL
PUSH DPH
MOV DPTR,#MAXTEG
MOVX A,@DPTR
POP DPH
POP DPL
MOV TMSG,A
NOP
LJMP FOUND
DECR: MOV A,TMSG
LCALL BCDBIN
DEC A
MOV TMSG,A
NOP
LJMP CKTAB
BIG: PUSH DPL
PUSH DPH
MOV DPTR,#MAXTEG ;THE PRESENT TIME-STAGE IS MAX?
MOVX A,@DPTR
POP DPH
POP DPL
CJNE A,TMSG,LL2
NOP
LJMP FOUND
LL2: MOV A,DPL ;GET THE NEXT HOUR ADDRESS
ADD A,#SD_LONG
MOV DPL,A
CLR A
ADDC A,DPH
MOV DPH,A
MOVX A,@DPTR ;THE NEXT HOUR IS IN R4
MOV R4,A
INC DPTR
MOVX A,@DPTR ;THE NEXT MINUTE IS IN R5
MOV R5,A
MOV A,R4
CJNE A,RHOUR,LL3
MOV A,R5
CJNE A,RMINUTE,LL3
MOV A,TMSG
INC A
CLR C
CLR AC
MOV TMSG,A
NOP
LJMP CKTAB
LL3: NOP
JC BIGGER
NOP
LJMP FOUND
BIGGER: MOV A,TMSG
INC A
CLR C
CLR AC
DA A
MOV TMSG,A
NOP
LJMP CKTAB
FOUND:
CPL DOG
MOV A,TMSG ;获得当前时段
LCALL BCDBIN
MOV R4,A
LCALL JSSD ;计算时段条地址,R4为时段值
CLR XDAT ;595上升沿有效
CLR XTXD
CLR XLAT
INC DPTR
MOVX A,@DPTR;根据时段,查得当前方案
CPL DOG
CJNE A,#55H,CHEKA
LCALL ZHENGC
CHEKA: CJNE A,#0AAH,CHEKB
LCALL DIAOG
CHEKB: NOP
LJMP RDTIME
DIAOG: PUSH DPL
PUSH DPH
MOV A,#0FFH
LCALL SENDNUM
MOV DPTR,#XS_ADDR
MOV A,R0
MOV R0_NUM,A
MOV R0,#9
ZZ: MOVX A,@DPTR
LCALL SENDNUM
INC DPTR
CPL DOG
DJNZ R0,ZZ
MOV A,R0_NUM
MOV R0,A
LCALL FLAT
POP DPH
POP DPL
RET
ZHENGC: PUSH DPL
PUSH DPH
MOV A,#00H
LCALL SENDNUM
MOV DPTR,#XS_ADDR
MOV A,R0
MOV R0_NUM,A
MOV R0,#9
ZZZ: MOVX A,@DPTR
LCALL SENDNUM
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -