


;*****************************Tinyok LP-5124**************************************
;*MCU: AT89C51 *
;*MCU-crystal: 6M *
;*Version: 1.0 *
;*Last Updata: 2005-1-13 *
;*Author: 东哥单片机学习网( www.picavr.com ) ; *
;*Description: FOR-通用定时器( COMMON TIMER ) *
; 1.可分别设置单次和循环定时 *
; 2.可随时设置开机,关机定时时间单位为秒,分,时 *
; 3.最大定时为999小时. *
;*********************************************************************************
Ktest BIT P1.0 ;测试键 (P1.0 口定义为Ktest键)
Ksel BIT P1.1 ;设置键 (P1.1 口定义为Ksel键)
Kh BIT P1.2 ;调百位键(P1.2 口定义为Kh键)
Km BIT P1.3 ;调十位键(P1.3 口定义为Km键)
Ks BIT P1.4 ;调个位键(P1.4 口定义为Ks键)
Kdot BIT P1.5 ;调精度键 (P1.5 口定义为Kdot键)
SCL BIT P3.2 ;SCL定义为P3.2(EEPROM时钟传送口)
SDA BIT P3.3 ;SDA定义为P3.3(EEPROM数据传送口)
;**********************************************************************************
LED_ON_H BIT P0.0 ;开机调时指示灯(P0.0-口定义为LED_ON_H)
LED_ON_M BIT P0.1 ;开机调时指示灯(P0.1-口定义为LED_ON_M)
LED_ON_S BIT P0.2 ;开机调时指示灯(P0.2-口定义为LED_ON_S)
LED_OFF_H BIT P0.3 ;关机调时指示灯(P0.3-口定义为LED_OFF_H)
LED_OFF_M BIT P0.4 ;关机调时指示灯(P0.4-口定义为LED_OFF_M)
LED_OFF_S BIT P0.5 ;关机调时指示灯(P0.5-口定义为LED_OFF_S)
LED_MS1 BIT P0.6 ;开机调时指示灯(P0.6-口定义为LED_MS1)
LED_MS2 BIT P0.7 ;开机调时指示灯(P0.7-口定义为LED_MS2)
;**********************************************************************************
OPEN BIT 20H.0 ;ON/OFF-单位标志位定义为-00H,=1为ON时间,=0为OFF时间
ON_S BIT 20H.1 ;ON_S-秒单位标志位定义为-01H,=1单位为ON-"秒"
ON_M BIT 20H.2 ;ON_M-分单位标志位定义为-02H,=1单位为ON-"分"
ON_H BIT 20H.3 ;ON_H-时单位标志位定义为-03H,=1单位为ON-"时"
OFFS BIT 20H.4 ;OFFS-秒单位标志位定义为-04H,=1单位为OFF-"秒"
OFFM BIT 20H.5 ;OFFM-分单位标志位定义为-05H,=1单位为OFF-"分"
OFFH BIT 20H.6 ;OFFH-时单位标志位定义为-06H,=1单位为OFF-"时"
SING BIT 20H.7 ;SING-单次输出标志位定义为-07H,=1为单次输出
;**********************************************************************************
CYCL BIT 21H.0 ;CYCL-循环输出标志位定义为-08H,=1为循环输出
LD_O BIT 21H.1 ;ON-开机调时标志位定义为-09H,=1为ON调时指示
LD_F BIT 21H.2 ;OFF-关机调时标志位定义为-0AH,=1为OFF调时指示
WORK BIT 21H.3 ;WORK-开机关机调志位定义为-0BH,=1为ON时间
STOP BIT 21H.4 ;STOP-关机标志位定义为-0CH,=1开机时间到-关机
MS10 BIT 21H.5 ;10ms标志位定义为-0DH,=1单位为ON-"10ms"
MS100 BIT 21H.6 ;100ms标志位定义为-0EH,=1单位为ON-"100ms"
DISP BIT 21H.7 ;显示标志位定义为-0FH,=1显示ms精度
MS_ST BIT 23H.0 ;MS输出标志位定义为-10H,=1O为MS输出
LD_MS BIT 23H.1 ;MS调时指示灯位定义为-11H,=1为ms调时指示
;**********************************************************************************
Konh BIT 22H.0 ;设置开机时间显示为“ 时”键
Konm BIT 22H.1 ;设置开机时间显示为“ 分”键
Kons BIT 22H.2 ;设置开机时间显示为“ 秒”键
Koffh BIT 22H.3 ;设置关机时间显示为“ 时”键
Koffm BIT 22H.4 ;设置关机时间显示为“ 分”键
Koffs BIT 22H.5 ;设置关机时间显示为“ 秒”键
Ksingle BIT 22H.6 ;设置单次工作键
Kcycle BIT 22H.7 ;设置循环工作键
;**********************************************************************************
KEY_PO EQU P0 ;P0口定义为KEY_PO
FLAG1 EQU 22H ;定义P0为标志寄存器22H
C_SECOND EQU 30H ;当前个位的地址定义
C_MINUTE EQU 31H ;当前十位的地址定义
C_HOUR EQU 32H ;当前百位的地址定义
TIME_DISP EQU 33H ;E2PROM暂存寄存器地址定义
ON_SECOND EQU 34H ;开机个位的地址定义
ON_MINUTE EQU 35H ;开机十位的地址定义
ON_HOUR EQU 36H ;开机百位的地址定义
OFF_SECOND EQU 37H ;关机个位的地址定义
OFF_MINUTE EQU 38H ;关机十位的地址定义
OFF_HOUR EQU 39H ;关机百位的地址定义
MS_SECOND EQU 3AH ;MS个位的地址定义
MS_MINUTE EQU 3BH ;MS十位的地址定义
MS_HOUR EQU 3CH ;MS百位的地址定义
BUF_MINUTE EQU 40H ;开机分暂存寄存器地址定义
BUFS_MINUTE EQU 41H ;开机分暂存寄存器地址定义
BUF_HOUR EQU 42H ;开机时暂存寄存器地址定义
BUFM_MINUTE1 EQU 43H ;关机分暂存寄存器地址定义
BUFM_MINUTE2 EQU 44H ;关机分暂存寄存器地址定义
BUFH_HOUR1 EQU 45H ;关机时暂存寄存器地址定义
CONNET EQU 46H ;时间精度选择寄存器
BUF_MS_S EQU 47H ;定义单位为10MS
BUF_MS_M EQU 48H ;定义单位为100MS
BUF_MS_H EQU 49H ;定义单位为-显示00
ERROR_L EQU 59H ;上复位标志低位寄存器
ERROR_H EQU 60H ;上复位标志高位寄存器
;**********************************************************************************
ORG 0000H ;主程序入口地址
LJMP MAIN ;跳至主程序
LJMP ERR ;0003H外中断0中断入口地址引向出错处理程序
NOP
NOP
LJMP ERR ;引向出错处理程序
LJMP INTT0 ;000BH定时器T0跳至INTT0执行中断服务程序执行
NOP
NOP
LJMP ERR ;引向出错处理程序
LJMP ERR ;0013H外中断1中断入口地址引向出错处理程序
NOP
NOP
LJMP ERR ;引向出错处理程序
LJMP INTT1 ;001BH定时器T1跳至INTT1执行中断服务程序执行
NOP
NOP
LJMP ERR ;引向出错处理程序
LJMP ERR ;0023H串行口中断入口地址引向出错处理程序
NOP
NOP
LJMP ERR ;引向出错处理程序
LJMP ERR ;002BH定时器T2中断入口地址引向出错处理程序
NOP
NOP ;程序从0030H开始
;**********************************************************************************
;* 主程序 *
;**********************************************************************************
MAIN: MOV IE,#00H ;关中断
MOV SP,#60H ;堆栈指针入口地址
MOV PSW,#00H ;选用寄存器组0
MOV TMOD,#11H ;设T0、T1为16位定时器
MOV A,ERROR_L ;
CJNE A,#0AAH,set_start_C ;判断上复位标志,无标志转冷启动
MOV A,ERROR_H ;
CJNE A,#55H,set_start_C ;无标志转冷启动
AJMP ERR_SET_DATA ;有上复位标志转热启动
nop
nop
LJMP ERR ;软件陷阱
set_start_C: ;
MOV 20H,#00 ;标志位清零
MOV 21H,#00 ;标志位清零
MOV 23H,#00 ;标志位清零
MOV BUF_MINUTE,#00H ;开机分暂存寄存器清零
MOV BUFS_MINUTE,#00H ;开机分暂存寄存器清零
MOV BUF_HOUR,#00H ;开机时暂寄存器器清零
MOV BUFM_MINUTE1,#00H ;关机分暂存寄存器清零
MOV BUFM_MINUTE2,#00H ;关机分暂存寄存器清零
MOV BUFH_HOUR1,#00H ;关机时暂存寄存器清零
MOV CONNET,#00H ;时间精度选择寄存器清零
MOV TMOD,#11H ;设T0、T1为16位定时器
MOV TL0,#58H ;50MS定时初值(T0计时用)
MOV TH0,#9EH ;50MS定时初值
MOV TL1,#58H ;50MS定时初值(T1闪烁调时间用)
MOV TH1,#9EH ;50MS定时初值
MOV IE,#80H ;开CPU中断,禁止T0,T1中断,禁止T0,T1计数
MOV P0,#0FFH ;置P0口1
MOV P1,#0FFH ;置P1口1
MOV P3,#0FCH ;置P3口1,关输出P3.0,P3.1口
MOV R5,#14H ;1S定时用初值( 50ms *20 )
;*************************************************
MOV R1,#TIME_DISP ;欲读数据存放地址指针TIME_DISP
MOV R3,#0A4H ;器件地址
MOV R4,#10H ;片内字节地址
MOV R7,#0AH ;连续写字节数为10
ACALL Read_DATA ;调读串行E2PROM子程序
MOV A,TIME_DISP ;E2PROM-10H寄存器内数据放入A
CJNE A,#01,SET_DATA ;比较E2PROM-10H是否等于01,是则表示内存有数据,
;否则预设ON/OFF时间初值
MOV C_SECOND,ON_SECOND ;开机时间个位键放入当前时间
MOV C_MINUTE,ON_MINUTE ;开机时间十位键放入当前时间
MOV C_HOUR,ON_HOUR ;关机时间百位键放入当前时间
AJMP start ;转键扫描程序
nop
nop
LJMP ERR ;软件陷阱
;**************************************************
SET_DATA:
MOV ON_HOUR,#01 ;开机时间百位数取码指针
MOV ON_MINUTE,#02 ;开机时间十位数取码指针
MOV ON_SECOND,#10 ;开机时间个位数取码指针
MOV C_SECOND,ON_SECOND ;开机时间个位数放入当前时间
MOV C_MINUTE,ON_MINUTE ;开机时间十位数放入当前时间
MOV C_HOUR,ON_HOUR ;关机时间百位数放入当前时间
MOV OFF_HOUR,#01 ;关机时间百位数取码指针
MOV OFF_MINUTE,#03 ;关机时间十位数取码指针
MOV OFF_SECOND,#10 ;关机时间个位数取码指针
MOV MS_HOUR,#01 ;MS时间百位数取码指针
MOV MS_MINUTE,#02 ;MS时间十位数取码指针
MOV MS_SECOND,#01 ;MS时间个位数取码指针
AJMP start ;转键扫描程序
nop
nop
LJMP ERR ;软件陷阱
;********************************************************************************
ERR_SET_DATA:
MOV SCON,#00H ;有上复位标志,热启动,清串行口控制寄存器
MOV IP,#00H ;清中断优先控制寄存器
SETB EA ;开中断
;********************************************************************************
;* *
;********************************************************************************
start:
JB DISP,NEXT_DISP_MS ;判断显示标志位,=1调MS显示子程序
ACALL DISP1 ;调显示子程序
SJMP key_start ;转键扫描程序
nop
nop
LJMP ERR ;软件陷阱
NEXT_DISP_MS: ;
ACALL DISP_MS ;调MS显示子程序
key_start: ;键扫描程序
MOV KEY_PO,#0FFH ;置P0口为1
MOV A,KEY_PO ;读P0口数据放入A
MOV FLAG1,A ;P0口数据放入FLAG1寄存器
JB Kons,key_on_s ;判断Kons键按下否
JB Konm,key_on_m ;判断Konm键按下否
JB konh,key_on_h ;判断Konh键按下否
key_OFF:
JB koffs,key_off_s ;判断Koffs键按下否
JB koffm,key_off_m ;判断Koffm键按下否
JB koffh,key_off_h ;判断Koffh键按下否
key_single: ;
JB ksingle,key_single1 ;判断单次键ksingle按下否
JB kcycle,key_cycle ;判断循环键kcycle按下否
AJMP key_set ;转判断设置键Ksel按下否
nop
nop
LJMP ERR ;软件陷阱
;*********************************************************************************
key_on_s:
SETB ON_S ;置ON-秒单位标志位为1
CLR ON_M ;
CLR ON_H ;
AJMP key_OFF ;判断单次输出键Koffs按下否
nop
nop
LJMP ERR ;软件陷阱
key_on_m:
CLR ON_S
SETB ON_M ;置ON-分单位标志位为1
CLR ON_H
AJMP key_OFF ;判断单次输出键Koffm按下否
nop
nop
LJMP ERR ;软件陷阱
key_on_h:
CLR ON_S
CLR ON_M
SETB ON_H ;置ON-时单位标志位为1
AJMP key_OFF ;判断单次输出键Koffh按下否
nop
nop
LJMP ERR ;软件陷阱
key_off_s:
SETB OFFS ;置OFF-秒单位标志位为1
CLR OFFM ;
CLR OFFH ;為
AJMP key_single ;判断单次输出键ksingle按下否
nop
nop
LJMP ERR ;软件陷阱
key_off_m:
CLR OFFS
SETB OFFM ;置OFF-分单位标志位为1
CLR OFFH
AJMP key_single ;判断单次输出键ksingle按下否
nop
nop
LJMP ERR ;软件陷阱
key_off_h:
CLR OFFS
CLR OFFM
SETB OFFH ;置OFF-时单位标志位为1
AJMP key_single ;判断单次输出键ksingle按下否
nop
nop
LJMP ERR ;软件陷阱
key_single1:
SETB SING ;单次输出标志位置1
CLR CYCL ;清循环输出标志位
AJMP key_SET ;转判断Ksel键和kdot键是否同时按下
nop
nop
LJMP ERR ;软件陷阱
key_cycle:
CLR SING ;清单次输出标志位
SETB CYCL ;循环输出标志位置1
AJMP key_SET ;转判断Ksel键和kdot键是否同时按下
nop
nop
LJMP ERR ;软件陷阱
;*********************************************************************************
KEY_SET:
JB Ksel,KEY_dot_set ;判断设置键Ksel按下否,否-则转判调精度kdot键按下否
DISP_SET_HOUR:
CLR EA ;关CPU中断
JB DISP,MS_SEL_DISP ;
ACALL DISP1 ;调显示子程序
AJMP MS_SEL_OUT ;
nop
nop
LJMP ERR ;软件陷阱
MS_SEL_DISP: ACALL DISP_MS ;
MS_SEL_OUT:
JB Kdot,KEY_sel_set ;判断调精度kdot键按下否,否-则转判设置键Ksel是否还按住
SET_START:
ACALL DISP1 ;调显示子程序
JNB Ksel,SET_START ;判断Ksel键和kdot键是否还同时按下,是调显示子程序
JNB Kdot,SET_START ;
;************************************************
SETB EA ;开CPU中断
SETB ET1 ;开T1中断
SETB TR1 ;启动timer1计数
CLR ET0 ;关T0中断
CLR TR0 ;禁止timer0计数
MOV R2,#06H ;0.3秒定时用初值
AJMP key_on_set ;同时按下转设置ON时间程序
nop
nop
LJMP ERR ;软件陷阱
KEY_sel_set:
JNB Ksel,DISP_SET_HOUR ;判断ksel键是否还按下,是则调显示子程序
SETB EA ;
AJMP start ;按下返回键扫描程序
nop
nop
LJMP ERR ;软件陷阱
;************************************************
key_on_exit:
AJMP key_on_hour ;
nop
nop
LJMP ERR ;软件陷阱
;************************************************
KEY_dot_set:
JB Kdot,key_on_exit ;判断调精度kdot键按下否,否-则退出
DISP_DOT_HOUR:
JB DISP,MS_DOT_DISP ;
ACALL DISP1 ;调显示子程序
AJMP MS_DOT_OUT ;
nop
nop
LJMP ERR ;软件陷阱
MS_DOT_DISP:
ACALL DISP_MS ;
MS_DOT_OUT:
CLR EA ;关CPU中断
JB Ksel,KEY_dot_set1 ;判断设置键Ksel按下否,否-则判断调精度kdot键按下否
AJMP SET_START ;
nop
nop
LJMP ERR ;软件陷阱
KEY_dot_set1: ;
JNB Kdot,DISP_DOT_HOUR ;判断调精度kdot键松开否,否-则再判断设置键Ksel按下否
SETB EA ;开CPU中断
;************************************************
SET_10MS:
MOV A,CONNET ;
CJNE A,#00H,SET_100MS ;比较CONNET=0?,是则设置为10ms
MOV CONNET,#01H ;置CONNET=01H
SETB MS_ST ;置MS输出标志位为1,=1设置ms时间初值
SETB DISP ;置显示标志位为1,=1调MS显示子程序
MOV TL0,#78H ;10MS定时初值(T0计时用)
MOV TH0,#0ECH ;10MS定时初值
SETB MS10 ;置10ms标志位为1,=1输出时间单位为10ms
CLR MS100 ;清100ms标志位为0
MOV BUF_MS_S,#0E1H ;10MS显示单位数据
MOV BUF_MS_M,#0E0H ;
MOV BUF_MS_H,#0E0H ;
AJMP MS_TEST_OUT ;转判断调百位键Kh按下否
nop
nop
LJMP ERR ;软件陷阱
;************************************************
SET_100MS:
MOV A,CONNET ;
CJNE A,#01H,SET_MS_OUT ;比较CONNET=0?,是则设置为100ms
MOV CONNET,#02H ;置CONNET=02H
SETB MS_ST ;置MS输出标志位为1,=1设置ms时间初值
SETB DISP ;置显示标志位为1,=1调MS显示子程序
MOV TL0,#0B0H ;100MS定时初值(T0计时用)
MOV TH0,#3CH ;100MS定时初值
CLR MS10 ;清10ms标志位为0
SETB MS100 ;置100ms标志位为1,=1输出时间单位为100ms
MOV BUF_MS_S,#0E0H ;100MS显示单位数据
MOV BUF_MS_M,#0E1H ;
MOV BUF_MS_H,#0E0H ;
AJMP MS_TEST_OUT ;转判断调百位键Kh按下否
nop
nop
LJMP ERR ;软件陷阱
;************************************************
SET_MS_OUT:
MOV A,CONNET ;
CJNE A,#02H,key_ON_hour ;比较CONNET=0?,是则设置为1s
MOV CONNET,#00H ;置CONNET=00H
CLR MS_ST ;清MS输出标志位为0
CLR DISP ;清显示标志位为0
MOV TL0,#58H ;50MS定时初值(T0计时用)
MOV TH0,#9EH ;50MS定时初值
CLR MS10 ;清10ms标志位为0
CLR MS100 ;清100ms标志位为0
AJMP MS_TEST_OUT ;转判断调百位键Kh按下否
nop
nop
LJMP ERR ;软件陷阱
;**********************************************************************************************
key_ON_hour:
JB Kh,key_OFF_hour ;判断调百位键Kh按下否,否则-转判调十位键Km按下否
DISP_ON_HOUR:
CLR EA ;关CPU中断
ACALL DISP_ON ;是则-调ON时间显示子程序
MOV P0,#11111000B ;开机秒指示灯亮
JNB Kh,DISP_ON_HOUR ;再判断调百位键Kh是否还按下,是则调ON时间显示子程序
SETB EA ;开CPU中断
;**********************************************************************************************
key_OFF_hour:
JB Km,key_MS_hour ;判断调十位键按下否,否则-转判测试键ktest按下否
DISP_OFF_HOUR:
CLR EA ;关CPU中断
ACALL DISP_OFF ;是则-调OFF时间显示子程序
MOV P0,#11000111B ;关机秒指示灯亮
JNB Km,DISP_OFF_HOUR ;再判断调十位键Km是否还按下,是则调OFF时间显示子程序
SETB EA ;开CPU中断
;**********************************************************************************************
key_MS_hour:
JB Ks,key_test ;判断调百位键Kh按下否,否则-转判调十位键Km按下否
DISP_MS_HOUR:
CLR EA ;关CPU中断
ACALL DISP_MS1 ;是则-调ON时间显示子程序
MOV P0,#00111111B ;开机秒指示灯亮
JNB Ks,DISP_MS_HOUR ;再判断调百位键Kh是否还按下,是则调ON时间显示子程序
SETB EA ;开CPU中断
;**********************************************************************************************
key_test:
JB Ktest,key_test_out ;判断测试键ktest按下否,否-则退出
DISP_TEST_HOUR:
CLR EA ;关CPU中断
JB DISP,key_ms_DISP ;
ACALL DISP1 ;调显示子程序
AJMP TEST_NEXT ;转判测试键ktest按下否
nop
nop
LJMP ERR ;软件陷阱
key_ms_DISP:
ACALL DISP_MS ;调MS显示子程序
TEST_NEXT:
JNB Ktest,DISP_TEST_HOUR;再判断测试键ktest是否还按下,是则调显示子程序
SETB EA ;开CPU中断
;*********************************************************************************************
MS_TEST_OUT:
CLR WORK ;清循环开机时间位
CLR STOP ;清关机标志位
JB MS_ST,MS_SET_DATA ;判断mS输出标志位定义是否为1,是则设置ms时间初值
MOV C_SECOND,ON_SECOND ;开机时间个位键放入当前时间
MOV C_MINUTE,ON_MINUTE ;开机时间十位键放入当前时间
MOV C_HOUR,ON_HOUR ;关机时间百位键放入当前时间
AJMP key_test_out ;转测试输出ON时间程序
nop
nop
LJMP ERR ;软件陷阱
MS_SET_DATA:
MOV C_SECOND,MS_SECOND ;MS开机时间个位键放入当前时间
MOV C_MINUTE,MS_MINUTE ;MS开机时间十位键放入当前时间
MOV C_HOUR,MS_HOUR ;MS开机时间百位键放入当前时间
;***********************************************************************************
;* *
;***********************************************************************************
key_test_out:
JB STOP,single_stop ;判断关机标志位STOP=0?(ON_single-OFF时间程序)
JB SING,single_out1 ;判断单次标志位SING=0?(ON_single_ON时间程序)
AJMP cycle_out1 ;转判循环标志位CYCL=0?
nop
nop
LJMP ERR ;软件陷阱
single_out1:
SETB OPEN ;ON/OFF-单位标志位置1,为开机时间
SETB ET0 ;开T0中断
SETB TR0 ;启动timer0计数
MOV P0,#11111000B ;开机指示灯亮
SETB P3.0 ;开输出
SETB P3.1 ;开输出
MOV A,C_HOUR ;
CJNE A,#01,EXIT_TEST ;比较当前显示"百位"时间=01?,否中断返回
MOV A,C_MINUTE ;
CJNE A,#01,EXIT_TEST ;比较当前显示"十位"时间=01?,否中断返回
MOV A,C_SECOND ;
CJNE A,#01,EXIT_TEST ;比较当前显示"个位"时间=01?,否中断返回
MOV C_SECOND,ON_SECOND ;为1-重置开机时间
MOV C_MINUTE,ON_MINUTE ;
MOV C_HOUR,ON_HOUR ;
SETB STOP ;置关机标志位为1
CLR OPEN ;清ON/OFF-单位标志位
CLR ET0 ;禁止T0中断
CLR TR0 ;禁止T0计数
single_stop:
MOV P0,#11000111B ;关机秒指示灯亮
CLR P3.0 ;关输出
CLR P3.1 ;关输出
EXIT_TEST:
AJMP start ;返回键扫描程序
nop
nop
LJMP ERR ;软件陷阱
;***********************************************************************************
;* *
;***********************************************************************************
cycle_out1:
JNB CYCL,EXIT_TEST ;判断循环标志位CYCL=0?
SETB ET0 ;开T0中断
SETB TR0 ;启动timer0计数
JB WORK,OFF_WORK ;开机关机标志位
ON_WORK:
MOV A,C_HOUR ;
CJNE A,#01,ON_OUT ;比较当前显示"百位"时间=01?,否中断返回
MOV A,C_MINUTE ;
CJNE A,#01,ON_OUT ;比较当前显示"十位"时间=01?,否中断返回
MOV A,C_SECOND ;
CJNE A,#01,ON_OUT ;比较当前显示"个位"时间=01?,否中断返回
JB MS_ST,MS_ON_DATA ;判断mS输出标志位定义是否为1,是则设置ms时间初值
MOV C_SECOND,OFF_SECOND ;为1-重置关机时间
MOV C_MINUTE,OFF_MINUTE ;
MOV C_HOUR,OFF_HOUR ;
SETB WORK ;置循环开机时间位为1
AJMP start ;返回键扫描程序
nop
nop
LJMP ERR ;软件陷阱
MS_ON_DATA:
MOV C_SECOND,MS_SECOND ;MS开机时间个位键放入当前时间
MOV C_MINUTE,MS_MINUTE ;MS开机时间十位键放入当前时间
MOV C_HOUR,MS_HOUR ;MS开机时间百位键放入当前时间
SETB WORK ;置循环开机时间位为1
AJMP start ;返回键扫描程序
nop
nop
LJMP ERR ;软件陷阱
OFF_WORK:
MOV A,C_HOUR ;
CJNE A,#01,OFF_OUT ;比较当前显示"百位"时间=01?,否中断返回
MOV A,C_MINUTE ;
CJNE A,#01,OFF_OUT ;比较当前显示"十位"时间=01?,否中断返回
MOV A,C_SECOND ;
CJNE A,#01,OFF_OUT ;比较当前显示"个位"时间=01?,否中断返回
JB MS_ST,MS_OFF_DATA ;判断mS输出标志位定义是否为1,是则设置ms时间初值
MOV C_SECOND,ON_SECOND ;为1-重置开机时间
MOV C_MINUTE,ON_MINUTE ;
MOV C_HOUR,ON_HOUR ;
CLR WORK ;清循环开机时间位
AJMP start ;返回键扫描程序
nop
nop
LJMP ERR ;软件陷阱
MS_OFF_DATA:
MOV C_SECOND,MS_SECOND ;MS开机时间个位键放入当前时间
MOV C_MINUTE,MS_MINUTE ;MS开机时间十位键放入当前时间
MOV C_HOUR,MS_HOUR ;MS开机时间百位键放入当前时间
CLR WORK ;清循环开机时间位
AJMP start ;返回键扫描程序
nop
nop
LJMP ERR ;软件陷阱
ON_OUT:
SETB P3.0 ;开输出
SETB P3.1 ;开输出
SETB OPEN ;ON/OFF-单位标志位置1,为开机时间
MOV P0,#11111000B ;开机秒指示灯亮
AJMP start ;返回键扫描程序
nop
nop
LJMP ERR ;软件陷阱
OFF_OUT:
CLR P3.0 ;关输出
CLR P3.1 ;关输出
CLR OPEN ;清ON/OFF-单位标志位,為关机时间
MOV P0,#11000111B ;关机秒指示灯亮
AJMP start ;返回键扫描程序
nop
nop
LJMP ERR ;软件陷阱
;*****************************************************************************************
;* *
;*****************************************************************************************
KEY_ON_set: ;
SETB ET1 ;开T1中断
SETB TR1 ;启动timer1计数
SETB LD_O ;置ON-开机调时指示标志位为1
CLR LD_F ;清ON-关机调时指示标志位
CLR LD_MS ;清MS调时指示标志位
KEY_ON_SET1: ;
ACALL DISP_ON ;调ON显示子程序
ON_second_set:
JB Ks,ON_minute_set ;判断调个位键按下否,否则判断调十位键按下否
DISP_ON_S:
ACALL DISP_ON ;是则调显示子程序,开机时间个位加1
JNB Ks,DISP_ON_S ;再判断调个位键是否还按下,是则显示子程序
INC ON_SECOND ;开机时间个位加1
MOV A,ON_SECOND ;开机时间个位放入A
CJNE A,#11,KEY_ON_SET1 ;比较开机时间个位是否为11,否-判断开机时间个位键按下否
MOV ON_SECOND,#01 ;是则开机时间个位置初值1
ON_minute_set: ;
JB Km,ON_hour_set ;判断调十位键按下否,否则判断调百位键按下否
DISP_ON_M:
ACALL DISP_ON ;是则调显示子程序,开机时间十位加1
JNB Km,DISP_ON_M ;再判断调十位键是否还按下,是则显示子程序
INC ON_MINUTE ;开机时间十位加1
MOV A,ON_MINUTE ;开机时间十位放入A
CJNE A,#11,KEY_ON_SET1 ;比较开机时间十位是否为11,否-判断开机时间十位键按下否
MOV ON_MINUTE,#01 ;是则开机时间十位置初值1
ON_hour_set: ;
JB Kh,key_set_ON ;判断调百位键按下否,否则判断Kdot键和ksel键是否同时按下
DISP_ON_H:
ACALL DISP_ON ;是则调显示子程序,开机时间个位加1
JNB Kh,DISP_ON_H ;再判断调百位键是否还按下,是则显示子程序
INC ON_HOUR ;开机时间百位加1
MOV A,ON_HOUR ;开机时间百位放入A
CJNE A,#11,KEY_ON_SET1 ;比较开机时间百位是否为11,否-判断开机时间百位键按下否
MOV ON_HOUR,#01 ;是则开机时间百位置初值1
;************************************************
key_set_ON:
JB Ksel,KEY_kdot_set ;判断设置键Ksel按下否,否-则退
DISP_ONSET_HOUR:
ACALL DISP_ON ;
JB Kdot,KEY_Ksel_set ;判断调精度kdot键按下否,否-则退出
ON_SET_EXIT: ACALL DISP_ON ;调显示子程序
JNB Ksel,ON_SET_EXIT ;判断Ksel键和Kdot键是否还同时按下,是调显示子程序
JNB Kdot,ON_SET_EXIT ;
;************************************************
MOV TIME_DISP,#01 ;写数据01H到串行E2PROM-10H寄存器内
MOV R1,#TIME_DISP ;欲写数据存放地址指针TIME_DISP
MOV R3,#0A4H ;器件地址
MOV R4,#10H ;片内字节地址
MOV R7,#0AH ;连续写字节数为6
ACALL Write_DATA ;调写串行E2PROM子程序
CLR ET1 ;禁止T1中断
CLR TR1 ;禁止timer1计数
SETB ET0 ;开T0中断
SETB ET0 ;启动timer0计数
CLR LD_O ;清ON-开机调时指示标志位
CLR LD_F ;清OFF-关机调时指示标志位
CLR LD_MS ;
AJMP start ;返回主程序
nop
nop
LJMP ERR ;软件陷阱
KEY_Ksel_set:
JNB Ksel,DISP_ONSET_HOUR;判断设置ksel键是否还按下,是则调显示子程序
AJMP key_OFF_set ;按下转测试输出ON时间程序
nop
nop
LJMP ERR ;软件陷阱
;************************************************
KEY_kdot_set:
JB Kdot,KEY_ON_SET1 ;断调精度kdot键按下否,否-则退出
DISP_ONDOT_HOUR:
ACALL DISP_ON ;
JB Ksel,KEY_kdot_set1 ;判断设置键Ksel按下否,否-则退
AJMP ON_SET_EXIT ;
nop
nop
LJMP ERR ;软件陷阱
KEY_Kdot_set1: ;
JNB Kdot,DISP_ONDOT_HOUR;判断调精度kdot键是否还按下,是则调显示子程序
AJMP KEY_ON_set1 ;按下转ON输出时间设置程序
nop
nop
LJMP ERR ;软件陷阱
;*****************************************************************************************
;* *
;*****************************************************************************************
key_OFF_set:
SETB ET1 ;开T1中断
SETB TR1 ;启动timer1计数
CLR LD_O ;清ON-开机调时指示标志位
SETB LD_F ;置ON-关机调时指示标志位1
CLR LD_MS ;清MS调时指示标志位
KEY_OFF_SET1:
&nb