📄
字号:
K1 BIT P3.2 ;切换当前时间,开机时间,关机时间(P3.2口定义为K1)
K2 BIT P3.4 ;调时键K2(P3.4 口定义为K2)
K3 BIT P3.5 ;调分键K3(P3.5 口定义为K3)
K4 BIT P3.6 ;启动键K4(P3.6 口定义为K4)
SI BIT P3.3 ;遥控輸入口定义为SI
C_HOUR EQU 24H ;当前时的地址定义
C_MINUTE EQU 25H ;当前分的地址定义
C_SECOND EQU 26H ;当前秒的地址定义
ON_HOUR EQU 27H ;开机时的地址定义
ON_MINUTE EQU 28H ;开机分的地址定义
OFF_HOUR EQU 29H ;关机时的地址定义
OFF_MINUTE EQU 30H ;关机分的地址定义
WORK_MODE EQU 34H ;当前时间,开机时间,关机时间选择
USE_CODE EQU 35H ;用戶數據代碼地址定义
DATA_CODE EQU 36H ;數據代碼地址定义
COUNT EQU 50H ;計數地址定义
;******************************************************************************
ORG 0000H ;主程序入口地址
AJMP MAIN ;转主程序
ORG 0003H ;外中断0中断入口
AJMP INTEX0 ;跳至INTEX0执行中断服务程序
ORG 000BH ;定时器T0中断入口地址
AJMP WTO ;跳至定时器T0执行中断服务程序
ORG 0013H ;外中断1中断入口
LJMP INTEX1 ;跳至INTEX1执行中断服务程序
ORG 001BH ;定时器T1中断入口地址
RETI ;中断返回(不开中断)
ORG 0023H ;串行口中断入口地址
RETI ;中断返回(不开中断)
ORG 002BH ;定时器T2中断入口地址
RETI ;中断返回(不开中断)
;******************************************************************************
;* 主程序 *
;******************************************************************************
ORG 0030H
MAIN: MOV SP,#50H ;堆栈指针入口地址
CLR 00H ;清开始调整标志
CLR 01H ;清当前时间标志
CLR 02H ;清开机时间标志
CLR 03H ;清关机时间标志
CLR 04H ;遥控用戶識別标志
MOV 21H,#0 ;10MS定时中断计数器初值
MOV 22H,#0 ;500MS定时中断计数器初值
MOV C_HOUR,#0
MOV C_MINUTE,#0
MOV C_SECOND,#0 ;置当前时间为00:00:00
MOV ON_HOUR,#06H
MOV ON_MINUTE,#00H ;置开机时间为06:00
MOV OFF_HOUR,#12H
MOV OFF_MINUTE,#00H ;置关机时间为12:00
MOV WORK_MODE,#0 ;
MOV USE_CODE,#00H ;用戶數據代碼為00
MOV DATA_CODE,#00H ;數據代碼為00
MOV R6,#8 ;數據為8位
MOV TH0,#0D8H ;T0 10ms定时初值
MOV TL0,#0F0H ;T0 10ms定时初值
MOV TH1,#00H ;T1 定时初值為00
MOV TL1,#00H ;T1 定时初值為00
MOV TMOD,#11H ;T0 方式1设定
MOV IE,#00H ;关所有中断
CLR A ;
DEC A ;A为#0FFH
MOV P0,A ;P1-P3口置1
MOV P1,A ;
MOV P2,A ;
MOV P3,A ;
SETB EA ;开CPU中断
SETB EX1 ;开外中断
SETB EX0 ;开INT0中断请求
CLR ET0 ;禁止T0中断
CLR TR0 ;禁止T0计数
CLR IT0 ;置INT0为电平触发
SETB IT1 ;置INT1为邊沿触发
SETB PX1 ;置INT1为最高级中断
SETB P3.7 ;置开关输出控制端口P3.7为"1"
M: MOV A,C_HOUR
CJNE A,ON_HOUR,OFF_TIME
MOV A,C_MINUTE ;判断当前时间是否等於开机时间
CJNE A,ON_MINUTE,OFF_TIME
CLR P3.7 ;置开关输出控制端口P3.7为"0"
AJMP NEXT
OFF_TIME: MOV A,C_HOUR
CJNE A,OFF_HOUR,NEXT
MOV A,C_MINUTE
CJNE A,OFF_MINUTE,NEXT;判断当前时间是否等於关机时间
SETB P3.7 ;置开关输出控制端口P3.7为"1"
NEXT: JNB 01H,ONDISP
ACALL DISP1 ;调当前时间显示子程序
ONDISP: JNB 02H,OFFDISP
ACALL DISP2 ;调开机时间显示子程序
OFFDISP: JNB 03H,M
ACALL DISP3 ;调关机时间显示子程序
AJMP M ;转 M 循环
NOP ;PC值出错处理
NOP
NOP
AJMP MAIN ;重新初始化
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H ;显示代码数据
DB 92H,82H,0F8H,80H,90H
;*******************************************************************************************************
;* 当前时间显示子程序 *
;*******************************************************************************************************
DISP1: MOV R0,C_HOUR
MOV DPTR,#TAB ;笔划段码表指针
MOV A,R0
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV P1,A
CLR P2.0
ACALL DL ;送显时高位
SETB P2.0
MOV A,R0
ANL A,#0FH
MOVC A,@A+DPTR
MOV P1,A
CLR P2.1
ACALL DL
SETB P2.1 ;送显时低位
MOV R1,C_MINUTE
MOV A,R1
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV P1,A
CLR P2.2
ACALL DL
SETB P2.2 ;送显分高位
MOV A,R1
ANL A,#0FH
MOVC A,@A+DPTR
MOV P1,A
CLR P2.3
ACALL DL
SETB P2.3 ;送显分低位
MOV R2,C_SECOND
MOV A,R2
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV P1,A
CLR P2.4
ACALL DL
SETB P2.4 ;送显秒高位
MOV A,R2
ANL A,#0FH
MOVC A,@A+DPTR
MOV P1,A
CLR P2.5
ACALL DL
SETB P2.5 ;送显秒低位
RET
;*************************************************************************************************************
;* 定时器T0中断服务子程序 *
;*************************************************************************************************************
WTO: PUSH ACC ;保护现场
PUSH PSW
MOV A,#0B7H ;中断响应时间同步修正
ADD A,TL0 ;低8位初值修正
MOV TL0,A ;重装初值(低8位修正值)
MOV A,#0F0H ;高8位初值修正
ADDC A,TH0 ;
MOV TH0,A ;重装初值(高8位修正值)
INC 21H
MOV A,21H
CJNE A,#50,TORETI ;10mS * 50mS=0.5S
MOV 21H,#0
INC 22H
MOV A,22H
CJNE A,#2,TORETI ;0.5S * 2 =1S
MOV 22H,#0
CPL P0.0 ;秒指示
CPL P0.1
MOV A,#01H
ADD A,C_SECOND
DA A
MOV C_SECOND,A ;当前秒加1
CJNE A,#60H,TORETI ;为60吗(是秒清0,否返回)
MOV C_SECOND,#0
MOV A,#01H
ADD A,C_MINUTE
DA A
MOV C_MINUTE,A ;当前分加1
CJNE A,#60H,TORETI ;为60吗(是分清0,否返回)
MOV C_MINUTE,#0
MOV A,#01H
ADD A,C_HOUR
DA A
MOV C_HOUR,A ;当前时加1
CJNE A,#24H,TORETI ;为24吗(是时清0,否返回)
MOV C_HOUR,#0
TORETI: POP PSW ;恢复现场
POP ACC
RETI
;**************************************************************************************************
; 开机时间显示子程序 *
;**************************************************************************************************
DISP2: MOV R0,ON_HOUR
MOV DPTR,#TAB ;笔划段码表指针
MOV A,R0
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV P1,A
CLR P2.0
ACALL DL ;送显时高位
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -