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 ; 程序結束
|