久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

電子定時器

 心不留意外塵 2016-06-05

http://blog.163.com/zhaojun_xf/blog/static/30050580200841984233848/

2008

 本電子定時器能定時給電器供電或斷電,最大時間可以長達30h,操作使用方便,采用AT89C2051單片機控制,4位共陽數(shù)碼管顯示時間,,繼電器作電器電源輸出控制,其電路簡單。

     1.系統(tǒng)硬件電路的設計

   (1)芯片的選擇

    硬件電路要求實現(xiàn)對交流大電流電源的控制,、定時時間的設定顯示和到點提醒等功能。若采用40腳單片機有利于設計,,但會增大電路板的體積,。本設計采用ATMEL公司的AT89C2051單片機,芯片為20腳,,體積小,,工作電壓范圍寬(2.7V~6V)。

   (2)交流控制接口電路

    本設計采用繼電器控制,。也可用可控硅控制等,。

   (3)顯示電路

    顯示電路采用4個LED數(shù)碼管。為了在定時精度達到分的時候能顯示出時鐘在計時,,兩個數(shù)碼管之間增加了兩個發(fā)光二極管,,以其閃爍來代表秒走動;為了使硬件顯示電路簡單,,采用單片機直接驅動LED數(shù)碼管(AT89C2051輸出口能吸收20mA電流),,用動態(tài)掃描法實現(xiàn)LED顯示。

   (4)電源電路

    電源電路采用普通三端集成穩(wěn)壓電路,。

   (5)報警電路

    報警電路采用普通5V成品小蜂鳴器,。

     2.系統(tǒng)軟件主程序的設計

    程序采用模塊化,、結構化設計,并采用了軟件抗干擾技術,,其軟件的可靠性較好,,可維護性強。其主要程序模塊有:   

   (1)主程序

    主程序有3個狀態(tài):待命狀態(tài),、計時工作狀態(tài)和到點工作狀態(tài),。

   (2)菜單(設置)程序

    菜單程序完成定時方式和定時時間的設定。

   (3)到點工作程序

    到點工作程序根據(jù)所選定的不同定時方式,,作不同的處理,。

   (4)抗干擾(出錯)程序

    程序跑飛時能被軟件陷阱捕獲,被抗干擾程序處理,,返回復位狀態(tài),,重新啟動系統(tǒng)。

     3.操作說明:

   (1)通電以后,,顯示窗顯示“----”,,表示機器處于待命狀態(tài)。

   (2)按功能鍵(S2),,顯示窗顯示“F-01”,,進入功能設置,此時按修改鍵(S3)選擇不同定時方式:

     方式1:定時關電源,,定時范圍為1s  30 min 59 s ;

     方式2:定時關電源,,定時范圍為1s  30 h 59 min;

    方式3:定時開電源,定時范圍為1s  30 min 59 s ,;

    方式4:定時開電源,,定時范圍為1s  30 h 59 min. 

   (3) 選定定時方式后,再按功能鍵,,進入時間設定,。先設定秒(方式1、方式3)或分(方式2,、方式4),,再設定分(方式1、方式3)或小時(方式2,、方式4),。按修改鍵增加數(shù)字,按功能鍵確定,,按住修改鍵不放可快進,。

   (4)設定時間完畢,按下功能鍵,,定時器長鳴一聲,,開始工作。

   (5)定時時間到了在定時方式1和方式2,,定時器會鳴叫,,此時按任意鍵可停止鳴叫。

   (6)在任何情況下,,按下復位鍵( S2 鍵),,定時器重新回到待命狀態(tài)。

原理圖:

實物圖:

源代碼:

;************* 電子定時器的設計******************;
;*MCU:          AT892051                         ;
;*MCU-crystal:  12M                              ;
;*Version:      01                               ;
;*Last Updata:  2007-6-14                        ;
;*Author:       zhaojun                          ;
;*Description:                                   ;
;定時器T0,、T1溢出周期為50MS,,T0為秒計數(shù)用        ;
;S2為功能鍵、S3為方式選擇鍵                      ;
;P1口為字符輸出口,采用共陽顯示管                 ;
;P3.2~P3.5為位選,P1.7為報警發(fā)音,P3.7為被控繼電器 ;
;************************************************;

;******************
;      偽定義     ;
;******************
SL      EQU   30H              ; SL存放秒的個位數(shù)
SH EQU   31H              ; SH存放秒的十位數(shù)
ML      EQU   32H              ; ML存放分的個位數(shù)
MH      EQU   33H              ; MH存放分的十位數(shù)
HL      EQU   34H              ; HL存放時的個位數(shù)
HH EQU   35H            ; HH存放時的十位數(shù)
;
L0      EQU   36H              ; L0~L3:顯示數(shù)據(jù)存儲器
L1 EQU   37H
L2      EQU   38H
L3 EQU   39H
DSPLYP  EQU   3AH              ; 顯示數(shù)據(jù)指針(DISPLAY-POINT)
PLYTS   EQU   3BH              ; 顯示次數(shù)計數(shù)器(DISPLAY-TIMES)
;
LPLMOD  BIT   39H              ; 低兩位顯示方式(LOW-PLAY-MOD)
HPLMOD  BIT   3AH              ; 高兩位顯示方式(HIGH-PLAY-MOD)
BRIGHT  BIT   3BH              ; DISPLAY子程序參數(shù):亮滅指示位
;
TCOUNT  EQU   3CH              ; 時間計數(shù)器(TIME-COUNT)
;
ADDRES  EQU   3DH              ; 加1子程序參數(shù)
MAX     EQU   3EH              ; 加1子程序參數(shù)
IFDEC   BIT   20H              ; BCD加法子程序參數(shù)
;
R_MOD   EQU   3FH              ; 響鈴方式參數(shù)
;
LED4    BIT   30H              ; 發(fā)光管狀態(tài)位
BELL    BIT   P1.7             ; 蜂鳴器
SWITCH  BIT   P3.7             ; 繼電器
FKEY    BIT   P3.0             ; 功能鍵 (S1)
MKEY    BIT   P3.1             ; 修改鍵 (S2)
;
WORKIN  BIT   38H              ; 工作狀態(tài)指示位
;

;******************
;     中斷入口    ;
;******************
        ORG   0000H
START:  LJMP  MAIN             ; 0000H  引向主程序
 LJMP  ERR              ; 0003H
 NOP
 NOP
 LJMP  ERR              ; 引向出錯處理程序
 LJMP  PGT0             ; 000BH  引向中斷處理程序PGT0
 NOP
 NOP
 LJMP  ERR              ; 引向出錯處理程序
 LJMP  ERR              ; 0013H  INT1
 NOP
 NOP
 LJMP  ERR
 LJMP  ERR              ; 001BH  T1
 NOP
 NOP
 LJMP  ERR
 LJMP  ERR              ; 0023H
 NOP
 NOP
 LJMP  ERR
 LJMP  ERR              ; 002BH
 NOP
 NOP
;
;************
;   主程序  ;
;************
MAIN:   MOV   IE,#00H          ; 關中斷
 MOV   SP,#57H          ; 設置堆棧指針
 MOV   PSW,#00H         ; 選用寄存器組0
 MOV   TMOD,#11H        ; 設定中斷工作方式為T0和T1
 ;
 MOV   A,56H
 CJNE  A,#0AAH,CSTART   ; 判上電復位標志,,無標志轉冷啟動
 MOV   A,57H
 CJNE  A,#55H,CSTART    ; 無標志轉冷啟動
 AJMP  HSTART           ; 有上電復位標志轉熱啟動
 NOP
 NOP
 LJMP  ERR              ; 軟件陷阱,引向出錯處理程序
CSTART: MOV   P1,#0FFH         ; 冷啟動,全面初始化
 MOV   P3,#0FFH
 MOV   TCON,#00H        ; 計時停止
 MOV   TL0,#0B0H        ; 賦中斷T0初值
 MOV   TH0,#3CH
 MOV   TCOUNT,#0AH      ; 賦定時器初值
 MOV   R5,#00H          ; R5為一空單元(備用)
 MOV   R4,#00H          ; R4 為工作模式選擇寄存器
 MOV   SL,#00H          ; 定時單元清零
 MOV   SH,#00H          ; 秒
 MOV   ML,#00H          ;
 MOV   MH,#00H          ; 分
 MOV   HL,#00H          ;
 MOV   HH,#00H          ; 時
 MOV   PLYTS,#64H       ; 賦顯示次數(shù)初值為100次
 MOV   DSPLYP,#L0       ; 顯示指針指向顯存單元
 MOV   L0,#0AH          ; 送顯示數(shù)據(jù)"-----"
 MOV   L1,#0AH
 MOV   L2,#0AH
 MOV   L3,#04H
 SETB  LED4             ; LED4為數(shù)碼管之間的發(fā)光二極管
 SETB  LPLMOD           ; 設定顯示方式為閃爍
 SETB  HPLMOD           ;
 SETB  BRIGHT           ; 允許顯示
 CLR   WORKIN        ; 清工作標志 , 待命
 AJMP  SETUP            ; 轉開始工作
 NOP
 NOP
 LJMP  ERR              ; 軟件陷阱
HSTART: MOV   SCON,#00H        ; 有上電標志,熱啟動,清串行口控制寄存器
 MOV   IP,#00H          ; 清中斷優(yōu)先控制寄存器
 SETB  FKEY             ; 重設按鍵
 SETB  MKEY
 SETB  EA               ; 開中斷
 AJMP  BEGIN            ; 轉向繼續(xù)工作
 NOP
 NOP
 LJMP  ERR              ; 軟件陷阱
SETUP:  SETB  EA               ; 開中斷
;
MAIN1:  ACALL DISPLY           ; 調用顯示
 JB    FKEY,JUDGE       ; 按鍵掃描
 ACALL KEYDLY           ; 延時消抖動
 JB    FKEY,JUDGE       ; 無鍵按下轉向判斷是否到點
 CLR   ET0              ; 功能鍵被按下,則
 CLR   TR0        ; 暫停計時
 ACALL MENU             ; 調用菜單設置程序
BEGIN:  SETB  WORKIN           ; 置工作標志位,開始工作
 SETB  ET0              ; 開中斷
 SETB  TR0              ; 開始計時
 MOV   A,R4             ; 移入工作模式選擇
 RL    A         ; 指針放大
 MOV   DPTR,#M_TAB
 JMP   @A+DPTR          ; 根據(jù)工作模式跳轉到相應程序段
M_TAB:  AJMP  WORK1
 AJMP  WORK2
 AJMP  WORK3
 AJMP  WORK4
 NOP
 NOP
 LJMP  ERR              ; 軟件陷阱
WORK1:  ;
WORK2:  CLR   SWITCH           ; 工作方式1和2:開繼電器
 AJMP  MAIN2
 NOP
 NOP
 LJMP  ERR              ; 軟件陷阱
WORK3:  ;
WORK4:  SETB  SWITCH           ; 工作方式3和4:不開繼電器
MAIN2:  CLR   BELL             ; 蜂鳴器短鳴一聲,以示開始工作
 ACALL DL05S
 SETB  BELL
JUDGE:  JNB   WORKIN,MAIN1     ; 判斷是否在定時之中
 MOV   A,SL             ; 判斷秒是否為零
 JNZ   MAIN1
 MOV   A,SH             ; 判斷秒是否為零
 JNZ   MAIN1
 MOV   A,ML             ; 判斷分是否為零
 JNZ   MAIN1
 MOV   A,MH             ; 判斷分是否為零
 JNZ   MAIN1
 MOV   A,HL             ; 判斷時是否為零
 JNZ   MAIN1
 MOV   A,HH             ; 判斷時是否為零
 JNZ   MAIN1            ; 若時分秒全為零則
 CLR   ET0              ; 停止計時
 CLR   TR0              ;
 ACALL ACTION           ; 調用到點工作子程序
 AJMP  MAIN             ; 返回
 NOP
 NOP
 LJMP  ERR              ; 軟件陷阱
 ;
;******************
;    倒計時程序   ;
;******************
PGT0:   CLR   EA               ; 關中斷
 PUSH  ACC        ; 保護現(xiàn)場
 PUSH  PSW
 PUSH  DPL
 PUSH  DPH
 MOV   PSW,#08H        ; 選用寄存器組1
 CLR   TR0              ; 暫停計時
 MOV   A,#0B7H          ; 中斷同步修正
 ADD   A,TL0
 MOV   TL0,A
 MOV   A,#3CH
 ADD   A,TH0
 MOV   TH0,A
 SETB  TR0              ; 恢復計時
 DEC   TCOUNT           ; 定時器T0每50 000毫秒溢出一次,則
 MOV   A,TCOUNT         ; 溢出10次為0.5秒
 JNZ   OUTT0        ; 判斷是否到半秒
 MOV   TCOUNT,#0AH      ;
 CPL   LED4        ; 若到半秒LED取反
 JNB   LED4,OUTT0       ; LED每閃爍一次是一秒
 MOV   R0,#SH           ; 移入秒位的地址
 SETB  IFDEC            ; BCD子程序參數(shù),使其做減法
 ACALL ADDBCD           ; 調用BCD子程序, 秒減1
 CJNE  R3,#99H,OUTT0    ; 判斷秒要否借位
 MOV   SH,#05H          ; 要借位則
 MOV   SL,#09H          ; 送數(shù)據(jù)59(否則顯示99)
 MOV   R0,#MH           ; 移入分位的地址
 ACALL ADDBCD        ; 分減1
 CJNE  R3,#99H,OUTT0    ; 判斷分要否借位
 MOV   MH,#05H
 MOV   ML,#09H
 MOV   R0,#HH
 ACALL ADDBCD
OUTT0:  POP   DPH        ; 恢復現(xiàn)場
 POP   DPL
 POP   PSW
 POP   ACC
 SETB  EA
 RETI                   ; 中斷返回
 NOP
 NOP
 LJMP ERR               ; 軟件陷阱
 ;
;
;**************************
;   BCD子程序(加1或減1 )  ;
;**************************
ADDBCD: MOV   A,@R0            ; 移入被操作數(shù)的高位
 DEC   R0               ; 指針減一
 SWAP  A
 ORL   A,@R0            ; 移入被操作數(shù)的低位
 MOV   B,#01H           ; B寄存器送立即數(shù)#01H
 MOV   C,IFDEC          ; 若減法標志位為1,則
 MOV   B.3,C            ;
 MOV   B.4,C            ; B寄存器的值被改為#99H
 MOV   B.7,C            ;
 ADD   A,B              ; 對一個壓縮的BCD碼加#99H等于對其減一
 DA    A                ; BCD碼調整
 MOV   R3,A             ; 暫存結果
 ANL   A,#0FH           ; 取低位碼
 MOV   @R0,A            ; 存數(shù)
 MOV   A,R3             ; 取回結果
 INC   R0               ; 指針加一
 SWAP  A                ; 交換
 ANL   A,#0FH           ; 取結果數(shù)的高位
 MOV   @R0,A            ; 存數(shù)
 RET
 NOP
 NOP
 LJMP  ERR              ; 軟件陷阱
;
;**************
;   加1程序   ;
;**************
ADDONE: MOV   R0,ADDRES        ; 移入被加數(shù)單元的地址
 CLR   IFDEC            ; 設定BCD子程序做加法
 ACALL ADDBCD           ; 調用BCD子程序
 CLR   C                ; 判斷被加數(shù)是否大于
 MOV   A,R3             ; 最大值"MAX"
 CJNE  A,MAX,JGOVER
JGOVER: JC    ENDADO
 CLR   A                ; 若大于"MAX",則清零
 MOV   @R0,A
 DEC   R0
 MOV   @R0,A
ENDADO: RET
 NOP
 NOP
 LJMP  ERR              ; 軟件陷阱
;
;******************
;   調時快進程序  ;
;******************
QUICK:  CLR   LPLMOD        ; 設定顯示方式不閃爍
 CLR   HPLMOD
 ACALL ADDONE           ; 調用加1子程序
 MOV   L0,R4            ; 將工作模式選擇數(shù)移入顯存
 INC   L0               ; 加1轉化成顯示值
 ACALL KEYDLY           ; 延時
 ACALL DL100
 JNB   MKEY,QUICK       ; 判斷鍵是否松開
 SETB  LPLMOD           ; 若松開則恢復閃爍顯示方式
 CJNE  R6,#02H,ENDQUK
 SETB  HPLMOD
 CLR   LPLMOD
ENDQUK: RET
 NOP
 NOP
 LJMP  ERR              ; 軟件陷阱
;
;
;******************
;   功能菜單程序  ;
;******************
MENU:   MOV   R6,#00H        ; 初始化;  R6 計功能鍵按鍵次數(shù)
 MOV   ADDRES,#05H      ; 將 R5 的地址送入,,以便于改變 R4 的值
 MOV   MAX, #04H        ; 定義工作模式選擇寄存器R4 的最大值
 MOV   DSPLYP,#L0       ; 定義顯示指針指向顯存
 SETB  LPLMOD        ; 設定低兩位數(shù)閃爍
 CLR   HPLMOD
 MOV   L0,R4            ; 送顯示數(shù)據(jù)"F-0X"
 INC   L0
 MOV   L1,#00H
 MOV   L2,#0BH
 MOV   L3,#00H
 SETB  LED4
;
WAITFK: ACALL DISPLY           ; 等待F鍵釋放
        JNB   FKEY,WAITFK
MENU1:  ACALL DISPLY
 JB    MKEY,JGFKEY      ; M鍵掃描
 ACALL KEYDLY           ; 延時消抖動
 JB    MKEY,JGFKEY      ; 未按下則轉F鍵掃描
 CJNE  R6,#00H,NEXT1    ;
 MOV   SL,#00H          ; 若中途改變定時方式,則清除原計時數(shù)據(jù)
 MOV   SH,#00H
 MOV   ML,#00H
 MOV   MH,#00H
 MOV   HL,#00H
 MOV   HH,#00H
NEXT1:  MOV   R2,#00H          ; R2用于判斷按鍵時間是否超過0.5秒
NEXT2:  ACALL ADDONE           ; 調用加1程序
 MOV   L0,R4            ; 移入工作方式選擇數(shù)
 INC    L0
 ;
WAITMK: ACALL DISPLY        ; 等待M鍵釋放
 INC   R2               ; R2自增一
 CLR   C
 CJNE  R2,#0C8H,JGQUIC  ; 若R2大于等于200則調用快進子程序
JGQUIC: JC    WATMK1
        ACALL QUICK
WATMK1: JNB   MKEY,WAITMK      ; R2小于200則等待M鍵釋放
;
JGFKEY: JB    FKEY,MENU1       ; 功能(F)鍵掃描
 ACALL KEYDLY           ; 延時消抖動
 JB    FKEY,MENU1       ; 鍵未按下則轉修改(M)鍵掃描
 INC   R6               ; F鍵按鍵次數(shù)加1
 MOV   A,R6             ; 移入按鍵次數(shù)
 RL    A         ; 指針放大
 MOV   DPTR,#FUNTAB
 JMP   @A+DPTR          ; 根據(jù)按鍵次數(shù)跳轉到相應的程序段
FUNTAB: AJMP  WAITFK
 AJMP  SETLOW
 AJMP  SETHI
 AJMP  ENDMEN
 NOP
 NOP
 AJMP  ENDMEN
;STWKMD:                       ; 工作模式設定,不需另外改變菜單
;
SETLOW: MOV   MAX,#60H         ; 設置低位(秒位或分位)
 MOV   A,R4             ; 移入工作模式選擇數(shù)
 RL    A         ; 指針放大
 MOV   DPTR,#FTAB1
 JMP   @A+DPTR          ; 根據(jù)工作模式選擇數(shù)跳轉到相應的程序段
FTAB1:  AJMP  SETSS
 AJMP  SETM60
 AJMP  SETSS
 AJMP  SETM60
 NOP
 NOP
 AJMP  WAITFK
SETSS:  MOV   DSPLYP,#SL       ; 設定顯示區(qū)域為MM:SS
 MOV   ADDRES,#SH
 AJMP  WAITFK
SETM60: MOV   DSPLYP,#ML       ; 設定顯示區(qū)域為HH:MM
 MOV   ADDRES,#MH
 AJMP  WAITFK
;
SETHI:  CLR   LPLMOD           ; 設置高位(分位或時位)
 SETB  HPLMOD           ; 高兩位數(shù)碼管閃爍
 MOV   MAX,#31H         ; 最大數(shù)為30
 MOV   A,R4             ; 移入工作模式選擇數(shù)
 RL    A                ; 指針放大
 MOV   DPTR,#FTAB2      ; 移入表首地址
 JMP   @A+DPTR          ; 根據(jù)工作模式選擇數(shù)跳轉到相應的程序段
FTAB2:  AJMP  SETM30
 AJMP  SETHH
 AJMP  SETM30
 AJMP  SETHH
 NOP
 NOP
 AJMP  WAITFK           ; 返回等待鍵釋放
SETM30: MOV   ADDRES,#MH       ; 移入分位的地址
        AJMP  WAITFK           ; 轉向等待鍵釋放
SETHH:  MOV   ADDRES,#HH       ; 移入時位的地址
 AJMP  WAITFK           ; 轉向等待鍵釋放
;
ENDMEN: CLR   HPLMOD           ; 恢復不閃爍顯示方式
 RET
 NOP
 NOP
 LJMP  ERR              ; 軟件陷阱
;
;****************
;  到點工作程序 ;
;****************
ACTION: MOV   L0,R4            ; 移入工作模式選擇數(shù)
 INC   L0               ; 送顯示數(shù)"F-0X"
 MOV   L1,#00H
 MOV   L2,#0BH
 MOV   L3,#00H
 SETB  LED4
 MOV   DSPLYP,#L0       ; 指針指向顯存
 SETB  LPLMOD           ; 設定顯示方式不閃爍
 SETB  HPLMOD
 MOV   A,R4             ; 移入工作模式選擇數(shù)
 RL    A                ;
 MOV   DPTR,#A_TAB
 JMP   @A+DPTR          ; 根據(jù)工作模式選擇數(shù)跳轉
A_TAB:  AJMP  ACTF1            ; 工作模式一
 AJMP  ACTF1            ; 工作模式二
 AJMP  ACTF3            ; 工作模式三
 AJMP  ACTF3            ; 工作模式四
 NOP
 NOP
 LJMP  ERR              ; 軟件陷阱
ACTF1:  SETB  SWITCH           ; 工作模式一(或二): 關繼電器
 MOV   R_MOD,#82H       ; 響鈴模式參數(shù)#82H
 MOV   R2,#96H          ; 響鈴次數(shù)參數(shù)#96H
ACTF11: ACALL RING           ; 調用響鈴子程序
 JNB   MKEY,ENDACT      ; 等待鍵按下
 JNB   FKEY,ENDACT      ; 有鍵按下則結束響鈴
 DJNZ  R2, ACTF11       ; 次數(shù)未滿繼續(xù)響鈴
 MOV   R_MOD,#0FFH      ; 參數(shù)#0FF使響鈴無效
 AJMP  ACTF11           ; 無鍵按下返回
 NOP
 NOP
 LJMP  ERR              ; 軟件陷阱
ACTF3:  CLR   SWITCH           ; 工作模式三(或四): 開繼電器
 CLR   BELL             ; 蜂鳴器短鳴一聲
 ACALL DL1S
 SETB  BELL
 MOV   R_MOD,#0FFH      ; 響鈴模式參數(shù)#0FFH
 MOV   R2,#96H          ; 響鈴時間參數(shù)#96H
ACTF31: ACALL RING        ; 調用響鈴子程序
 JNB   MKEY,ENDACT      ; 等待鍵按下
 JNB   FKEY,ENDACT      ; 有鍵按下則結束
 DJNZ  R2,ACTF31        ; 次數(shù)未滿繼續(xù)
 MOV   R2,#96H          ; 重新賦值
 CLR   BELL             ; 短鳴一聲(說明: 響鈴模式參數(shù)#0FFH使
 ACALL DL100            ; 響鈴程序無效,僅起延時作用,
 SETB  BELL             ; 每延時一段時間短鳴一聲,以
 AJMP  ACTF31           ; 提醒使用者繼電器仍在工作)
 NOP
 NOP
 LJMP  ERR              ; 軟件陷阱
ENDACT: SETB  SWITCH           ; 關繼電器
AWAITF: ACALL DISPLY           ; 調用顯示
        JNB   FKEY,AWAITF      ; 等待鍵釋放
AWAITM: ACALL DISPLY           ; 調用顯示
 JNB   MKEY,AWAITM      ; 等待鍵釋放
 RET
 NOP
 NOP
 LJMP  ERR              ; 軟件陷阱
 ;
;**************
;   響鈴程序  ;
;**************
RING:   MOV   R5,#18H          ; R5為循環(huán)控制變量
RING1:  JNB   MKEY,R_EXIT      ; 鍵掃描
 JNB   FKEY,R_EXIT      ; 有鍵按下則退出
 MOV   A,R_MOD          ; 移入響鈴模式參數(shù)
 MOV   C,ACC.7          ; 根據(jù)響鈴模式參數(shù)改變響鈴
 MOV   BELL,C
 RL    A
 MOV   R_MOD,A
 ACALL DL100            ; 延時
 DJNZ  R5,RING1         ; 循環(huán)次數(shù)控制
R_EXIT: SETB  BELL             ; 關閉響鈴
 RET
 NOP
 NOP
 LJMP ERR               ; 軟件陷阱
;
;**************
;   顯示程序  ;
;**************
DISPLY: PUSH  ACC              ; 數(shù)據(jù)壓棧保護
 PUSH  PSW
 MOV   PSW,#10H         ; 選用寄存器組2
 MOV   R0,DSPLYP        ; 移入顯示指針
 MOV   R2,#0FDH         ; R2寄存的是數(shù)碼管選通數(shù)
 MOV   A,PLYTS          ; 移入顯示循環(huán)控制量
 JNZ   PLAY             ; 不為0則轉PLAY
 MOV   PLYTS,#64H       ; 否則從新賦值
 CPL   BRIGHT           ; 亮滅指示位取反
PLAY:   DEC   PLYTS            ; 顯示循環(huán)控制量減1
 JNB   LPLMOD,PLAYL     ; 低兩位數(shù)碼管不閃則"PLAYL"
 JB    BRIGHT,PLAYL     ; 亮滅指示為1也"PLAYL"
 ACALL NOPLAY           ; 否則滅燈延時
 AJMP  PLAY1            ; 轉顯示高位數(shù)碼管
 NOP
 NOP
 LJMP ERR               ; 軟件陷阱
;用來顯示低位
PLAYL:  ORL   P1,#7FH          ; 清原顯示數(shù)據(jù)
 ORL   P3,#3CH          ; 清原選通數(shù)據(jù)
 MOV   A,R2             ; 移入數(shù)碼管位選數(shù)
 RL    A                ; 換一位
 ANL   P3,A             ; 選通低位的個位數(shù)碼管
 MOV   R2,A             ; 暫存位選數(shù)
 MOV   A,@R0            ; 移入顯示數(shù)值
 MOV   DPTR,#TABLE1     ; 移入表首地址
 MOVC  A,@A+DPTR        ; 查表
 ANL   P1,A             ; 送顯示數(shù)據(jù)
 ACALL DL1MS            ; 延時
 INC   R0               ; 指向低位的十位數(shù)
 JB    P3.3,PLAYL       ; 顯示低位的十位數(shù)
;
PLAY1:  JNB   HPLMOD,PLAYH     ; 高兩位數(shù)碼管不閃則"PLAYH"
 JB    BRIGHT,PLAYH     ; 亮滅指示為1也"PLAYH"
 ACALL NOPLAY           ; 否則滅燈延時
 AJMP  OUTPLY           ; 轉結束
 NOP
 NOP
 LJMP ERR               ; 軟件陷阱
;
;用來顯示高位
PLAYH:  ORL   P1,#7FH          ; 清原顯示數(shù)據(jù)
 ORL   P3,#3CH          ; 清原選通數(shù)據(jù)
 ANL   P3,#0EFH         ; 選通高位的個位數(shù)數(shù)碼管
 MOV   A,@R0            ; 移入顯示數(shù)值
 MOV   DPTR,#TABLE1     ; 移入表首地址
 MOVC  A,@A+DPTR        ; 查表
 ANL   P1,A             ; 送顯示數(shù)據(jù)
 ACALL DL1MS            ; 延時
 INC   R0               ; 指向高位的十位數(shù)
 ;                      ; 顯示高位的十位數(shù)
 ORL   P1,#7FH          ; 清原顯示數(shù)據(jù)
 ORL   P3,#3CH          ; 清原選通數(shù)據(jù)
 ANL   P3,#0DFH         ; 選通高位的十位數(shù)
 MOV   A,@R0            ; 移入顯示數(shù)值
 MOV   C,LED4        ; 指針放大+小燈狀態(tài)
 RLC   A                ;
 MOV   DPTR,#TABLE2     ; 移入表首地址
 MOVC  A,@A+DPTR        ; 查表
 ANL   P1,A             ; 送顯示數(shù)據(jù)
 ACALL DL1MS            ; 延時
;
OUTPLY: POP   PSW              ; 恢復數(shù)據(jù)
 POP   ACC
 RET
 NOP
 NOP
 LJMP ERR               ; 軟件陷阱
;
TABLE1: DB  0C0H,0F9H,0A4H,0B0H, 99H, 92H, 82H,0F8H, 80H, 90H,0BFH, 8EH,0FFH
;         "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "-", "F", " "
;
TABLE2: DB  0FFH, 0DFH, 0F9H, 0D9H, 0A4H,  84H, 0B0H,  90H, 0BFH, 09FH
;  "  ",  " :",   "1 ",  "1:",  "2 ",    "2:",  "3 ",  "3:",  "- ",  "-:"
;
;
;
;**********************
;    無顯示(滅燈)程序   ;
;**********************
NOPLAY: ORL   P1,#7FH          ; 清顯示數(shù)據(jù)
 ORL   P3,#3CH          ; 清選通數(shù)據(jù)
 INC   R0               ; 指針自增2
 INC   R0
 ACALL DL1MS            ; 延時
 RET
 NOP
 NOP
 LJMP  ERR              ; 軟件陷阱
 ;
;******************
;     延時程序    ;
;******************
DL1MS:  MOV   R3,#0F9H         ; 延時 1250US  只為DISPLY所調用
DL1MS1: NOP
 NOP
 NOP
 DJNZ  R3,DL1MS1
 RET
 NOP
 NOP
 LJMP  ERR              ; 軟件陷阱
 ;
KEYDLY: CLR   BELL        ; 按鍵消抖動專用延時程序,
 ACALL DISPLY           ; 在消除抖動的同時發(fā)出按鍵提示音
 SETB  BELL
 RET
 NOP
 NOP
 LJMP ERR               ; 軟件陷阱
;
DL50MS: MOV   R7,#0AH          ; 50毫秒延時程序
DL50M1: ACALL DISPLY        ; 每調用一次顯示程序5MS
 DJNZ  R7,DL50M1        ; 調用10次
 RET
 NOP
 NOP
 LJMP  ERR              ; 軟件陷阱
;
DL100:  ACALL DL50MS           ; 延時100毫秒
 ACALL DL50MS
 RET
 NOP
 NOP
 LJMP  ERR              ; 軟件陷阱
;
DL05S:  ACALL DL100            ; 延時0.5秒
 ACALL DL100
 ACALL DL100
 ACALL DL100
 ACALL DL100
 RET
 NOP
 NOP
 LJMP  ERR              ; 軟件陷阱
 ;
DL1S:   ACALL DL05S            ; 延時1秒
 ACALL DL05S
 RET
 NOP
 NOP
 LJMP  ERR              ; 軟件陷阱
 ;
;****************************
;     ERR(出錯處理) 程序    ;
;****************************
ERR:    CLR   EA               ; 關中斷
 MOV   DPTR,#ERR1       ; 準備返回地址
 PUSH  DPL              ; 壓棧
 PUSH  DPH              ;
 RETI                   ; 中斷返回
ERR1:   MOV   56H,#0AAH        ; 建立上電標志(出錯標志)
 MOV   57H,#55H
 MOV   A,#00H           ; 準備返回地址
 PUSH  ACC              ; 壓棧
 PUSH  ACC         
 RETI                   ; 中斷返回
 NOP
 NOP
 LJMP  ERR              ; 軟件陷阱
;
 ORG   07FAH
 NOP
 NOP
 NOP
 LJMP  ERR              ; 軟件陷阱
 
 END                    ; 程序結束

 

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,,不代表本站觀點,。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,,謹防詐騙,。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報,。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多