📄 timing.asm
字号:
;--------------------------------------------------------------------------
;
; TIMING--定时开关控制器程序
; V1.0
;软件说明:
;此软件是V1.0版本2006-07-12
;
;
;
;--------------------------------------------------------------------------
;联网地址(0--FF)
;地址=0FFH 为广播地址,地址=0 ~ 0FEH 为单机地址
LW_ADDR EQU 1
;--------------------------------------------------------------------------
;变量定义表
;------------------------寄存器定义----------------------------------------
RHOUR DATA 28H ;当前小时寄存器,以BCD形式
RMINUTE DATA 29H ;当前分钟寄存器,以BCD形式
TMSG DATA 2AH ;当前时段寄存器,以BCD形式
TEST_H DATA 30H ;小时缓冲
TEST_M DATA 31H ;分钟缓冲
;--------------------------------------------------------------------------
;------------------------标志位定义----------------------------------------
ONOFF_FLG EQU 00H
;---------------------------------------------------------------------------
;------------------------地址常量定义---------------------------------------
SD_ADDR EQU 0010H ;时段表存储开始地址,外部RAM
MAXTEG EQU 000FH ;最大时段值存储地址,外部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 ;时段表中单个时段结构的长度
;
;
;信号引脚定义
DOG EQU P3.5 ;
ONOFF EQU P1.0 ;=1 关 =0 开
TIME EQU P3.4 ;=0 DS12887片选有效
;
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
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
MOV A,#03H
MOVX @DPTR,A
INC DPTR ;清时
MOV A,#07H
MOVX @DPTR,A
INC DPTR
MOV A,#00H
MOVX @DPTR,A
INC DPTR ;清周
MOV A,#01H
MOVX @DPTR,A
INC DPTR ;清日
MOVX @DPTR,A
INC DPTR ;清月
MOVX @DPTR,A
MOV DPTR,#000AH ;以BCD码计时,允许报警中断
MOV A,#0A0H ;设为010允许保留时间
MOVX @DPTR,A
MOV DPTR,#000CH
MOVX A,@DPTR
INC DPTR
MOVX A,@DPTR
MOV DPTR,#000BH
MOV A,#22H ;B寄存器SET位置0,12887正常运行,
MOVX @DPTR,A
CPL DOG
;
;将时段方案表装入存储器(62256)
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,#MAXTEG ;最大时段值存储地址
MOV A,#SDXZ3 ;当前最大时段设为"10"
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,更新数据.
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 ;
;------------------------------------------------------------
;判断当前最大时段是多少,存入62256
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -