18luck网站

18luck网站電子設計 | 18luck网站Rss 2.0 會員中心 會員注冊
搜索: 您現在的位置: 18luck网站 >> 18luck平台 >> 單片機 >> 正文

單片機遙控電子鍾程序

作者:佚名    文章來源:本站原創    點擊數:    更新時間:2011-3-31

;******************************************************
;*標題:      單片機遙控電子鍾程序
;*文件:                           
;*版本:    1.0
;*作者:     東(dong) 哥   
;*郵箱:    picavr@163.com     QQ: 279068079

;******************************************************* 
                K1   BIT  P3.2          ;切換當前時間,開機時間,關(guan) 機時間(P3.2口定義(yi) 為(wei) K1)
                K2   BIT  P3.4          ;調時鍵K2(P3.4 口定義(yi) 為(wei) K2)
                K3   BIT  P3.5          ;調分鍵K3(P3.5 口定義(yi) 為(wei) K3)
                K4   BIT  P3.6          ;啟動鍵K4(P3.6 口定義(yi) 為(wei) K4)
                SI   BIT  P3.3          ;遙控輸入口定義(yi) 為(wei) SI
                C_HOUR     EQU  24H     ;當前時的地址定義(yi)
                C_MINUTE   EQU  25H     ;當前分的地址定義(yi)
                C_SECOND   EQU  26H     ;當前秒的地址定義(yi)
                ON_HOUR    EQU  27H     ;開機時的地址定義(yi)
                ON_MINUTE  EQU  28H     ;開機分的地址定義(yi)
                OFF_HOUR   EQU  29H     ;關(guan) 機時的地址定義(yi)
                OFF_MINUTE EQU  30H     ;關(guan) 機分的地址定義(yi)
                WORK_MODE  EQU  34H     ;當前時間,開機時間,關(guan) 機時間選擇
                USE_CODE   EQU  35H     ;用戶數據代碼地址定義(yi)
                DATA_CODE  EQU  36H     ;數據代碼地址定義(yi)
                COUNT      EQU  50H     ;計數地址定義(yi)
;******************************************************************************
                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              ;清關(guan) 機時間標誌
                CLR    04H              ;遙控用戶識別標誌
                MOV    21H,#0           ;10MS定時中斷計數器初值
                MOV    22H,#0           ;500MS定時中斷計數器初值
                MOV    C_HOUR,#0
                MOV    C_MINUTE,#0
                MOV    C_SECOND,#0      ;置當前時間為(wei) 00:00:00
                MOV    ON_HOUR,#06H
                MOV    ON_MINUTE,#00H   ;置開機時間為(wei) 06:00
                MOV    OFF_HOUR,#12H
                MOV    OFF_MINUTE,#00H  ;置關(guan) 機時間為(wei) 12:00
                MOV    WORK_MODE,#0     ;
                MOV    USE_CODE,#00H    ;用戶數據代碼為(wei) 00
                MOV    DATA_CODE,#00H   ;數據代碼為(wei) 00
                MOV    R6,#8            ;數據為(wei) 8位
                MOV    TH0,#0D8H        ;T0 10ms定時初值
                MOV    TL0,#0F0H        ;T0 10ms定時初值
                MOV    TH1,#00H         ;T1 定時初值為(wei) 00
                MOV    TL1,#00H         ;T1 定時初值為(wei) 00
                MOV    TMOD,#11H        ;T0 方式1設定
                MOV    IE,#00H          ;關(guan) 所有中斷
                CLR    A                ;
                DEC    A                ;A為(wei) #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為(wei) 電平觸發
                SETB   IT1              ;置INT1為(wei) 邊沿觸發
                SETB   PX1              ;置INT1為(wei) 最高級中斷
                SETB   P3.7             ;置開關(guan) 輸出控製端口P3.7為(wei) "1"
M:              MOV    A,C_HOUR
                CJNE   A,ON_HOUR,OFF_TIME
                MOV    A,C_MINUTE       ;判斷當前時間是否等於(yu) 開機時間
                CJNE   A,ON_MINUTE,OFF_TIME
                CLR    P3.7             ;置開關(guan) 輸出控製端口P3.7為(wei) "0"
                AJMP   NEXT                  
OFF_TIME:       MOV    A,C_HOUR
                CJNE   A,OFF_HOUR,NEXT
                MOV    A,C_MINUTE
                CJNE   A,OFF_MINUTE,NEXT;判斷當前時間是否等於(yu) 關(guan) 機時間
                SETB   P3.7             ;置開關(guan) 輸出控製端口P3.7為(wei) "1"  
NEXT:           JNB    01H,ONDISP
                ACALL  DISP1            ;調當前時間顯示子程序 
ONDISP:         JNB    02H,OFFDISP
                ACALL  DISP2            ;調開機時間顯示子程序
OFFDISP:        JNB    03H,M
                ACALL  DISP3            ;調關(guan) 機時間顯示子程序
                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    ;為(wei) 60嗎(是秒清0,否返回)
                MOV    C_SECOND,#0
                MOV    A,#01H
                ADD    A,C_MINUTE
                DA     A
                MOV    C_MINUTE,A       ;當前分加1
                CJNE   A,#60H,TORETI    ;為(wei) 60嗎(是分清0,否返回)
                MOV    C_MINUTE,#0
                MOV    A,#01H
                ADD    A,C_HOUR
                DA     A
                MOV    C_HOUR,A         ;當前時加1
                CJNE   A,#24H,TORETI    ;為(wei) 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                ;送顯時高位
                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,ON_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
                RET
;*************************************************************************************************
;                                      關(guan) 機時間顯示子程序                                        *
;*************************************************************************************************
DISP3:          MOV R0,OFF_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,OFF_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
                RET
;************************************************************************************************************
;                                   延時0.16ms子程序                                                        *
;************************************************************************************************************ 
DL:             MOV  31H,#80
DL2:            DJNZ 31H,DL2
                RET
;****************************************************************************************************
;                                     延時10MS子程序,用於(yu) 消除按鍵抖動而產(chan) 生誤動作                   *
;****************************************************************************************************
DEL:            MOV  32H,#200
DEL1:           MOV  33H,#250
DEL2:           DJNZ 33H,DEL2
                DJNZ 32H,DEL1
                RET
;*************************************************************************************************************
;                                   按鍵中斷處理子程序                                                        *
;*************************************************************************************************************
INTEX0:         PUSH  ACC                 ;保護現場
                PUSH  PSW
                CLR   EX0                 ;關(guan) 外部中斷INT0
                JB    K1,$                ;判斷K1按下否,未按則等待,K1按下
                                          ;LED1亮, LED2熄滅
DISP1_0:        ACALL DISP1               ;
                JNB   K1,DISP1_0          ;等待K1釋放
                ACALL DEL                 ;K1按下開機指示LED1亮,LED2熄滅  
PH4:            CLR   P3.1                ;LED1亮
                SETB  P3.0                ;LED2熄滅  
PH0:            ACALL DISP1               ;調當前時間顯示子程
                JB    K2,PH01             ;判K2按下否,未按則轉到判K3
DISP1_1:        ACALL DISP1               ; 
                JNB   K2,DISP1_1          ;等待K2釋放
                ACALL DEL
                MOV   R0,C_HOUR
                MOV   A,#01H
                ADD   A,R0
                DA    A
                MOV   C_HOUR,A            ;當前時間時加1
                CJNE  A,#24H,PH0          ;超過24嗎(超過清0)
                MOV   C_HOUR,#0
PH01:           JB    K3,PH1              ;判K3按下否,未按則轉判K4
DISP1_2:        ACALL DISP1               ;
                JNB   K3,DISP1_2          ;等待K3釋放          
                ACALL DEL
                MOV   R0,C_MINUTE
                MOV   A,#01H
                ADD   A,R0
                DA    A
                MOV   C_MINUTE,A          ;當前時間分加1
                CJNE  A,#60H,PH0          ;超過60嗎(超過清0)
                MOV   C_MINUTE,#0
PH1:            JB    K4,PH10             ;判K4按下否,未按則轉到判K1   
DISP1_3:        ACALL DISP1               ;
                JNB   K4,$                ;等待K4釋放
                ACALL DEL
                AJMP  TEND                ;K4按下,轉啟動
PH10:           JB    K1,PH0              ;判K1按下否,未按則再
DISP1_4:        ACALL DISP1               ;
                JNB   K1,DISP1_4          ;等待K1釋放
                ACALL DEL                 ;K1按下開機指示LED1熄滅,LED2亮
                SETB  P3.1                ;LED1熄滅
                CLR   P3.0                ;LED2亮

PH2:            ACALL DISP2               ;調開機時間顯示子程序
                JB    K2,PH201            ;判K2按下否,未按則轉到判K3
DISP2_1:        ACALL DISP2               ;
                JNB   K2,DISP2_1          ;等待K2釋放
                MOV   R0,ON_HOUR
                MOV   A,#01H
                ADD   A,R0
                DA    A
                MOV   ON_HOUR,A           ;開機時間時加1
                CJNE  A,#24H,PH2          ;超過24嗎(超過清0)
                MOV   ON_HOUR,#0
PH201:          JB    K3,PH210            ;判K3按下否,未按則轉判K4
DISP2_2:        ACALL DISP2               ;
                JNB   K3,DISP2_2          ;等待K3釋放             
                ACALL DEL
                MOV   R0,ON_MINUTE
                MOV   A,#01H
                ADD   A,R0
                DA    A
                MOV   ON_MINUTE,A         ;開機時間分加1
                CJNE  A,#60H,PH2          ;超過60嗎(超過清0)
                MOV   ON_MINUTE,#0
PH210:          JB    K1,PH2              ;判K1按下否,未按則再
DISP2_3:        ACALL DISP2               ;
                JNB   K1,DISP2_3          ;等待K1釋放
                ACALL DEL                 ;K1按下關(guan) 機指示LED1. LED2亮
                CLR   P3.0                ;LED1亮    
                CLR   P3.1                ;LED2亮

PH3:            ACALL DISP3               ;調關(guan) 機時間顯示子程序
                JB    K2,PH301            ;判K2按下否,未按則轉到判K3
DISP3_1:        ACALL DISP3               ;
                JNB   K2,DISP3_1          ;等待K2釋放
                ACALL DEL
                MOV   R0,OFF_HOUR
                MOV   A,#01H
                ADD   A,R0
                DA    A
                MOV   OFF_HOUR,A          ;關(guan) 機時間時加1
                CJNE  A,#24H,PH3          ;超過24嗎(超過清0) 
                MOV   OFF_HOUR,#0
PH301:          JB    K3,PH310            ;判K3按下否,未按則轉判K4
DISP3_2:        ACALL DISP3               ;
                JNB   K3,DISP3_2          ;等待K3釋放
                ACALL DEL
                MOV   R0,OFF_MINUTE
                MOV   A,#01H
                ADD   A,R0
                DA    A
                MOV   OFF_MINUTE,A        ;關(guan) 機時間分加1
                CJNE  A,#60H,PH3          ;超過60嗎(超過清0)
                MOV   OFF_MINUTE,#0
PH310:          JB    K1,PH3              ;判K1按下否,未按則再
DISP3_3:        ACALL DISP3               ;
                JNB   K1,DISP3_3          ;等待K1釋放
                ACALL DEL
                AJMP  PH4                 ;轉當前時間調整

TEND:           SETB  EX0                 ;開INT0中斷
                SETB  TR0                 ;允許T0計數 
                SETB  01H                 ;置00H為(wei) 1,啟動計數 
                SETB  ET0                 ;允許T0中斷
                SETB  P3.7                ;置P3.7口為(wei) 1
                POP   PSW                 ;恢複現場
                POP   ACC
                RETI                      ;中斷返回
;**********************************************************************
;;;;;;;;;;;;;;;;;;;;;;;;;     遙控接收程序      ;;;;;;;;;;;;;;;;;;;;;;;
;**********************************************************************
;采用中斷接收
INTEX1:        
                CLR      EA             ;
                CLR      TR1            ;
                JNB      SI,$           ;
                NOP
                NOP
                JNB      SI,$
                SETB     TR1            ;
                MOV      R2,TH1         ;取T0計數次數
                MOV      R3,TL1
                MOV      R4,#00H        ;0096H~03B6H為(wei) 數據窗口0
                MOV      R5,#96H        ;窗口0的下限
                LCALL    SUB0           ;計數值小於(yu) 00FAH嗎?
                JC       ERROUT         ;<0096H,作廢
                MOV      R4,#03H        ;窗口0的上限
                MOV      R5,#0B6H
                MOV      R2,TH1         ;取T0計數次數
                MOV      R3,TL1
                LCALL    SUB0           ;計數值大於(yu) 03B6H嗎?
                JNC      X1_01          ;>03B6,去看是否在1的窗口
                CLR      C              ;在窗口0中,清C,移位時移入0
                LJMP     SET_CODE_0     ;去移位處理
X1_01:          MOV      R4,#04H        ;窗口1的下限
                MOV      R5,#4CH        ;044CH~073AH為(wei) 窗口1
                MOV      R2,TH1         ;取T0計數次數
                MOV      R3,TL1
                LCALL    SUB0           ;計數值小於(yu) 044CH嗎?
                JC       ERROUT          ;<044CH,作廢
                MOV      R4,#07H        ;窗口1的上限
                MOV      R5,#3AH        ;#073A
                MOV      R2,TH1         ;取T1計數次數
                MOV      R3,TL1
                LCALL    SUB0           ;計數值大於(yu) #073AH嗎?
                JNC      ERROUT         ;>073AH,作廢
                SETB     C              ;在窗口1中,將C置1
SET_CODE_0:
                JB       04H,NEXT       ;
                MOV      A,USE_CODE     ;
                RLC      A              ;
                MOV      USE_CODE,A     ;
                DJNZ     COUNT,ERROUT   ;
                MOV      COUNT,#8       ;
                MOV      A,USE_CODE     ;
                CJNE     A,#0E2H,ERROUT ;
                SETB     04H            ;
;**********************************************
ERROUT:      
                MOV      TH1,#00H       ;
                MOV      TL1,#00H       ;
                SETB     TR1            ;
                SETB     EA             ;
                RETI                    ;
;*********************************************
NEXT:     
                MOV      A,DATA_CODE    ;
                RLC      A              ;
                MOV      DATA_CODE,A    ;
                DJNZ     R6,ERROUT      ;
                MOV      R6,#8          ;
                CLR      04H            ;
;*********************************************
                MOV      A,DATA_CODE    ;
                CJNE     A,#00H,CH1     ;
                AJMP     FUN1           ;
           
CH1:            CJNE     A,#10H,CH2     ;
                AJMP     FUN2           ;

CH2:            CJNE     A,#08H,CH3     ;
                AJMP     FUN3           ;
          
CH3:            CJNE     A,#80H,CH4     ;
                AJMP     FUN4           ;

CH4:            CJNE     A,#90H,CH5     ;
                AJMP     ERROUT         ;
CH5:            CJNE     A,#88H,CH6     ;
                AJMP     ERROUT         ;
CH6:            CJNE     A,#4H,CH7      ;
                AJMP     ERROUT         ;
CH7:            CJNE     A,#50H,CH8     ;
CH8:            AJMP     ERROUT         ;
;********************************************************

SUB0:           CLR      C              ;減法子程序
                MOV      A,R3           ;被減數低位送A
                SUBB     A,R5           ;低位減
                JNC      X1_S1          ;沒進位,去處理高位減法
                DEC      R2             ;有進位,被減數高位減1
X1_S1:          CLR      C              ;清C
                MOV      A,R2           ;被減數高位
                SUBB     A,R4           ;減被減數高位
                RET                     ;返回
;*********************************************************************
;*             遙控切換當前時間,開機時間,關(guan) 機時間調整程序          *
;*********************************************************************                                    
FUN1:           CLR     TR0             ;禁止T0計數
                CLR     ET0             ;禁止T0中斷
                INC     WORK_MODE       ;時間選擇寄存器加"1"
                MOV     A,WORK_MODE
                CJNE    A,#01H,ONHOUR   ;選擇寄存器為(wei) "1",轉開機調整標誌
                SETB    00H             ;置開始調整標誌為(wei) "1"
                SETB    01H             ;置當前時間標誌為(wei) "1"
                CLR     02H             ;清開機時間標誌
                CLR     03H             ;清關(guan) 機時間標誌
                CLR     P3.0            ;LED1亮
                SETB    P3.1            ;LED2滅
                AJMP    EXIT            ;轉中斷退出     
ONHOUR:         CJNE    A,#02H,OFFHOUR  ;選擇寄存器為(wei) "2",轉關(guan) 機調整標誌
                CLR     01H             ;清當前時間標誌
                SETB    02H             ;置開機時間標誌為(wei) "1"
                CLR     03H             ;清關(guan) 機時間標誌
                CLR     P3.1            ;LED2亮
                SETB    P3.0            ;LED1滅
                AJMP    EXIT            ;轉中斷退出
OFFHOUR:        CJNE    A,#03H,EXIT     ;選擇寄存器為(wei) "3",不為(wei) 3轉中斷退出
                MOV     WORK_MODE,#0    ;時間選擇寄存器清0
                CLR     01H             ;清當前時間標誌
                CLR     02H             ;清開機時間標誌
                SETB    03H             ;置關(guan) 機時間標誌為(wei) "1"
                CLR     P3.0            ;LED1亮
                CLR     P3.1            ;LED2亮
;*******************************************************************               
EXIT:           LJMP    ERROUT          ;轉中斷退出
;*******************************************************************
; *                         遙控調時程序                           *
;*******************************************************************
FUN2:           JNB     00H,EXIT        ;(00H)等於(yu) 0,轉中斷退出
                                        ;(00H)等於(yu) 1,轉判(01)
                JNB     01H,ONHOURADJ   ;(01H)等於(yu) 0,轉開機 "時" 調整;
                                        ;(01H)等於(yu) 1,當前   "時" 調整
                MOV     R0,C_HOUR
                MOV     A,#01H
                ADD     A,R0
                DA      A
                MOV     C_HOUR,A        ;當前時間"時"加1
                CJNE    A,#24H,EXIT     ;超過24嗎(超過清0),不為(wei) 0中斷退出
                MOV     C_HOUR,#0
                AJMP    EXIT            ;轉中斷退出

ONHOURADJ:      JNB     02H,OFFHOURADJ  ;(02H)等於(yu) 0,轉關(guan) 機 "時" 調整;
                                        ;(02H)等於(yu) 1,開機   "時" 調整
                MOV     R0,ON_HOUR
                MOV     A,#01H
                ADD     A,R0
                DA      A
                MOV     ON_HOUR,A       ;開機時間"時"加1
                CJNE    A,#24H,EXIT     ;超過24嗎(超過清0),不為(wei) 0中斷退出
                MOV     ON_HOUR,#0
                AJMP    EXIT            ;轉中斷退出

OFFHOURADJ:     JNB     03H,EXIT        ;(03H)等於(yu) 0,轉中斷退出
                                        ;(03H)等於(yu) 1,關(guan) 機 "時" 調整
                MOV     R0,OFF_HOUR
                MOV     A,#01H
                ADD     A,R0
                DA      A
                MOV     OFF_HOUR,A      ;關(guan) 機時間"時"加1
                CJNE    A,#24H,EXIT     ;超過24嗎(超過清0),不為(wei) 0中斷退出
                MOV     OFF_HOUR,#0
                AJMP    EXIT            ;轉中斷退出      

;*******************************************************************
; *                         遙控調分程序                           *
;*******************************************************************
FUN3:           JNB     00H,EXIT        ;(00H)等於(yu) 0,轉中斷退出
                                        ;(00H)等於(yu) 1,轉判(01)
                JNB     01H,ONMINUTEADJ ;(01H)等於(yu) 0,轉開機 "分" 調整;
                                        ;(01H)等於(yu) 1,當前   "分" 調整
                MOV     R0,C_MINUTE
                MOV     A,#01H
                ADD     A,R0
                DA      A
                MOV     C_MINUTE,A      ;當前時間"分"加1
                CJNE    A,#60H,EXIT     ;超過60嗎(超過清0),不為(wei) 0中斷退出
                MOV     C_MINUTE,#0
                AJMP    EXIT            ;轉中斷退出
ONMINUTEADJ:    JNB     02H,OFFMINUTEADJ;(02H)等於(yu) 0,轉關(guan) 機 "分" 調整;
                                        ;(02H)等於(yu) 1,開機   "分" 調整
                MOV     R0,ON_MINUTE
                MOV     A,#01H
                ADD     A,R0
                DA      A
                MOV     ON_MINUTE,A     ;開機時間"分"加1
                CJNE    A,#60H,EXIT     ;超過60嗎(超過清0),不為(wei) 0中斷退出
                MOV     ON_MINUTE,#0
                AJMP    EXIT            ;轉中斷退出
OFFMINUTEADJ:   JNB     03H,EXIT        ;(03H)等於(yu) 0,轉中斷退出
                                        ;(03H)等於(yu) 1,關(guan) 機 "分" 調整   
                MOV     R0,OFF_MINUTE
                MOV     A,#01H
                ADD     A,R0
                DA      A
                MOV     OFF_MINUTE,A    ;關(guan) 機時間"分"加1
                CJNE    A,#60H,EXIT     ;超過60嗎(超過清0),不為(wei) 0中斷退出
                MOV     OFF_MINUTE,#0
                AJMP    EXIT            ;轉中斷退出

;*******************************************************************
; *                         遙控啟動程序                           *
;*******************************************************************
FUN4:           SETB    EX0             ;開INT0中斷
                SETB    TR0             ;允許T0計數 
                SETB    ET0             ;允許T0中斷
                SETB    P3.7            ;置P3.7口為(wei) "1"
                CLR     00H             ;清開始調整標誌
                SETB    01H             ;置當前時間標誌為(wei) "1"
                CLR     02H             ;清開機時間標誌
                CLR     03H             ;清關(guan) 機時間標誌
                MOV     C_SECOND,#00H   ;秒清0
                MOV     WORK_MODE,#00H  ;時間選擇寄存器清0
                LJMP    EXIT            ;轉中斷退出
;*******************************************************************
DELAY:          MOV     R0,#0FFH
DELAY1:         DJNZ    R0,DELAY1
                RET                     ;返回
                END                     ;程序結束

Tags:單片機,遙控電子鍾,設計,程序  
責任編輯:admin
  • 上一篇文章:
  • 下一篇文章:
  • 請文明參與討論,禁止漫罵攻擊,不要惡意評論、違禁詞語。 昵稱:
    1分 2分 3分 4分 5分

    還可以輸入 200 個字
    [ 查看全部 ] 網友評論
    關於我們 - 聯係我們 - 廣告服務 - 友情鏈接 - 網站地圖 - 版權聲明 - 在線幫助 - 文章列表
    返回頂部
    刷新頁麵
    下到頁底
    晶體管查詢