;**************************************************************
;電院 單片機(jī)設(shè)計(jì)
:智能定時(shí)插座
;by LI XIAO JUN
;2009-6-4
;**************************************************************
;功能描述:帶鍵盤(pán)設(shè)置的時(shí)間計(jì)數(shù)器
;功能:實(shí)現(xiàn)1分鐘到99小時(shí)99分鐘內(nèi)的定時(shí)。可定時(shí)關(guān)機(jī)或定時(shí)開(kāi)機(jī)。
;各個(gè)鍵的功能:
;S1:小時(shí)十位調(diào)整
;S2:小時(shí)個(gè)位調(diào)整
;S3;分鐘十位調(diào)整
;S4:分鐘各位調(diào)整
;可擴(kuò)展功能:時(shí)間顯示
;硬件描述:
;P0口顯示字段。P2.0-2.3共陽(yáng)數(shù)碼管控制端。P1.0-P1.3按鍵
;P3.4繼電器控制端
;**************************************************************
STARTRUN BIT 01H;開(kāi)始運(yùn)行標(biāo)志
KEYOK BIT 00H;有鍵按下標(biāo)志
SCOUNT EQU 21H;分計(jì)數(shù)器
SETVAL EQU 22H;預(yù)置分值儲(chǔ)存單元
SCOUNT2 EQU 26H;小時(shí)計(jì)數(shù)器
SETVAL2 EQU 27H;預(yù)置小時(shí)儲(chǔ)存單元
TCOUNT EQU 24H;;秒計(jì)數(shù)器
TCOUNTER EQU 250;軟件計(jì)數(shù)器的計(jì)數(shù)值,X定時(shí)器4MS等于1S
KEYVAL EQU 25H;鍵值儲(chǔ)存單元
DISPBUF EQU 58H;顯示緩沖區(qū)
COUNTER EQU 57H;計(jì)數(shù)器,顯示程序通過(guò)它得知現(xiàn)在正在顯示的數(shù)碼管
TMRVAR EQU 61536;設(shè)定4MS。65536-4000定時(shí)器初值
ORG 0000H
JMP START
ORG 0*8+3;INTO中斷入口
RETI
ORG 1*8+3;定時(shí)器0中斷入口
LJMP INT_T0
ORG 2*8+3
RETI
ORG 3*8+3
RETI
ORG 4*8+3
RETI
;*******************主程序設(shè)定************************************
START:
MOV R7,#60
MOV R4,#60
MOV SP,#5FH
MOV SCOUNT,#0
MOV SCOUNT2,#0
MOV SETVAL,#00;啟動(dòng)程序默認(rèn)值為0
MOV SETVAL2,#00
MOV SCOUNT,SETVAL
MOV SCOUNT2,SETVAL2
CLR KEYOK
CLR STARTRUN
CALL INIT_T0
SETB EA
;********************主程序開(kāi)始***************************************
LOOP:
CALL KEY;調(diào)用鍵盤(pán)程序
JB KEYOK,KEYPROC;如果有鍵按下,轉(zhuǎn)鍵盤(pán)處理程序
NEXT:
MOV A,SCOUNT;獲取分的數(shù)值
MOV B,#10
DIV AB
NEXT1:
MOV DISPBUF+2,A;送顯示緩沖區(qū)
MOV DISPBUF+3,B
NEXT2:
MOV A,SCOUNT2;獲取小時(shí)的數(shù)值
MOV B,#10
DIV AB
NEXT3:
MOV DISPBUF,A
MOV DISPBUF+1,B
JMP LOOP
;*******************鍵值處理程序****************************************
KEYPROC:
MOV A,KEYVAL;取得鍵值
JZ KEY1;如果鍵值是0,轉(zhuǎn)
DEC A
JZ KEY2;如果鍵值是1,轉(zhuǎn)
DEC A
JZ KEY3;如果鍵值是2,轉(zhuǎn)
JMP KEY4;如果鍵值是3,轉(zhuǎn)
KEY1:;對(duì)小時(shí)十位進(jìn)行操作
INC DISPBUF;將顯示緩沖區(qū)的數(shù)加1
MOV A,DISPBUF
CJNE A,#9,EFT01
MOV DISPBUF,#0
SETB STARTRUN
EFT01:;鍵值處理
MOV B,#10
MUL AB
ADD A,DISPBUF+1
MOV SETVAL2,A
MOV SCOUNT2,SETVAL2
SETB STARTRUN
JMP LOOP
KEY2:
INC DISPBUF+1
MOV A,DISPBUF+1
CJNE A,#10,EFT02
MOV DISPBUF+1,#0
SETB STARTRUN
EFT02:
MOV A,DISPBUF
MOV B,#10
MUL AB
ADD A,DISPBUF+1
MOV SETVAL2,A
MOV SCOUNT2,SETVAL2
SETB STARTRUN
JMP LOOP
KEY3:
INC DISPBUF+2
MOV A,DISPBUF+2
CJNE A,#6,LEFT0
MOV A,#0
SETB STARTRUN
LEFT0:
MOV B,#10
MUL AB
ADD A,DISPBUF+3
MOV SETVAL,A
MOV SCOUNT,SETVAL
SETB STARTRUN
JMP LOOP
KEY4:
INC DISPBUF+3
MOV A,DISPBUF+3
CJNE A,#10,REFT0
MOV DISPBUF+3,#0
SETB STARTRUN
REFT0:
MOV A,DISPBUF+2
MOV B,#10
MUL AB
ADD A,DISPBUF+3
MOV SETVAL,A
MOV SCOUNT,SETVAL
SETB STARTRUN
JMP LOOP
;**************鍵盤(pán)程序********************************************************
KEY:
MOV P1,#0FFH
CLR KEYOK
MOV A,P1
ORL A,#11110000B
CPL A
JZ KEY_RET
CALL DELAY
MOV A,P1
ORL A,#11110000B
CPL A
JZ KEY_RET
SETB KEYOK
JNB ACC.0,KEY_1
MOV KEYVAL,#0
JMP KEY_RET
KEY_1:
JNB ACC.1,KEY_2
MOV KEYVAL,#1
JMP KEY_RET
KEY_2:
JNB ACC.2,KEY_3
MOV KEYVAL,#2
JMP KEY_RET
KEY_3:
MOV KEYVAL,#3
KEY_RET:
MOV A,P1
ORL A,#11110000B
CPL A
JNZ KEY_RET
RET
;****************************延時(shí)程序****************************
DELAY:
PUSH PSW
SETB RS0
MOV R7,#50
D1: MOV R6,#10
D2: DJNZ R6,D2
DJNZ R7,D1
POP PSW
RET
;*********************************************************************
INIT_T0:
MOV TMOD,#01H
MOV TH0,#HIGH(TMRVAR)
MOV TL0,#LOW(TMRVAR)
SETB ET0;開(kāi)T0中斷
SETB TR0;定時(shí)器T0開(kāi)始運(yùn)行
RET
;*******************************中斷程序*********************************
INT_T0:
PUSH ACC
PUSH PSW
MOV TH0,#HIGH(TMRVAR);重新裝入初值
MOV TL0,#LOW(TMRVAR)
AAA: INC TCOUNT ;軟件計(jì)數(shù)器加1
MOV A,TCOUNT
CJNE A,#TCOUNTER,INT_N2;判斷是否等于250,即是否計(jì)數(shù)到1秒。
CPL P2.6;P2.6接發(fā)光二極管,實(shí)現(xiàn)每秒閃光
MOV TCOUNT,#0
JNB STARTRUN,INT_N2;若等于0,轉(zhuǎn)移。即是否開(kāi)始運(yùn)行
DJNZ R7,AAA;實(shí)現(xiàn)分計(jì)數(shù),循環(huán)60次。1S乘以60.
MOV R7,#60
MOV A,SCOUNT2
CJNE A,#0,BBB;若小時(shí)計(jì)數(shù)器不為0,轉(zhuǎn)
JMP EEE
BBB:
MOV A,SCOUNT
CJNE A,#0,EEE;若分計(jì)數(shù)器不為0,轉(zhuǎn)
LJMP CCC
EEE: DEC SCOUNT;分計(jì)數(shù)器減1
MOV A,SCOUNT
JNZ INT_N2;若不為0,轉(zhuǎn)到顯示程序
MOV A,SCOUNT2
JNZ CCC
JMP DDD
CCC: DEC SCOUNT2;小時(shí)計(jì)數(shù)器減1
MOV SCOUNT,#59;分計(jì)數(shù)器裝載59
JMP INT_N2;轉(zhuǎn)顯示程序
;**************************報(bào)警,控制繼電器程序**************************************
DDD:
MOV R6,#10
LOOP4: CPL P3.7
CPL P3.6
MOV R5,#200
LOOP3:LCALL DELAY
DJNZ R5,LOOP3
DJNZ R6,LOOP4
LOOP5: CLR P3.4;繼電器工作。輸出低電平。
CLR P3.6
CLR EA
LJMP $
;**************************************顯示程序************************************88
INT_N2:
ORL P2,#00001111B;關(guān)所有顯示器
MOV A,Counter;取計(jì)數(shù)器值
MOV DPTR,#BitTab;將位碼地址送到DPTR
MOVC A,@A+DPTR
ANL P2,A;送位碼
JNB ACC.1,XIAOSHUDIAN;是否顯示第二位。是則轉(zhuǎn),加小數(shù)點(diǎn)處理。
MOV A,#DISPBUF
ADD A,Counter
MOV R0,A
MOV A,@R0
MOV DPTR,#DISPTAB
MOVC A,@A+DPTR
MOV P0,A;送段碼
LJMP SSS
XIAOSHUDIAN:
MOV A,#DISPBUF+1
MOV R0,A
MOV A,@R0
MOV DPTR,#DISPTAB
MOVC A,@A+DPTR
CLR C
SUBB A,#80H
MOV P0,A;送段碼
SSS: INC Counter
MOV A,Counter
CJNE A,#4,DISPEXIT;如果計(jì)數(shù)器為4,讓它回0
MOV Counter,#0
DISPEXIT:
POP PSW
POP ACC
RETI
DISPTAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;0到9的碼字
BitTAb: DB 0FEH,0FDH,0FBH,0F7H;位碼
END
本程序初稿完整版本下載: http://www.zg4o1577.cn/ziliao/file/chazuo1.rar
修改了部分功能后的終稿:http://www.zg4o1577.cn/ziliao/file/chazuo2.txt
效果圖: