您的位置:首页版主原创51示例程序
内容搜索: 标题内容作者
     
阅读内容
背景:#EDF0F5 #FAFBE6 #FFF2E2 #FDE6E0 #F3FFE1 #DAFAF3 #EAEAEF 默认  

基于89C51的通用定时器带存储24WC01(已调试OK)

[日期:2008-01-11 ] [来源:www.picavr.com 作者:本站原创] [字体: (投递新闻)

;*****************************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