|
電路特點(diǎn) 以一片AT89C2051單片機(jī)為主體,其顯示數(shù)據(jù)從P3.0-P3.7口輸出,P1口輸出對(duì)應(yīng)的六位位選信號(hào)。電子鐘程序設(shè)計(jì)時(shí)使用了T0作為計(jì)時(shí),T1為調(diào)整時(shí)顯示用。只要對(duì)程序稍加更改,可以很容易的實(shí)現(xiàn)8路定時(shí)功能。 電子鐘只用一個(gè)輕觸式按鍵來完成所有的設(shè)置。為了使鬧鐘音量足夠大,采用了PNP型三極管8550來驅(qū)動(dòng)蜂鳴器,驅(qū)動(dòng)電阻用1K的,蜂鳴器為5V小型蜂鳴器。若用NPN來驅(qū)動(dòng)蜂鳴器音量要小一點(diǎn)。LED數(shù)碼管位驅(qū)動(dòng)用8850,電子鐘采用自制的3A開關(guān)電源供電。如圖1。供電效率高,可和7-24V的直流電源直接連接,電子鐘工作電流20MA左右。 圖1 LM2576做的3A電源 電子鐘功能 一、時(shí)間顯示:六位LED數(shù)碼管顯示時(shí)間,按24小時(shí)制分別顯示“時(shí)時(shí):分分:秒秒”,最小單位為秒。精確度5秒/月(與晶振有關(guān),可加電容調(diào)整)。 二.走時(shí)調(diào)整: 長按按鍵0。5秒鐘以上,可以進(jìn)入鬧鐘和時(shí)間設(shè)置狀態(tài),按“鬧鐘分”、“鬧鐘時(shí)”、“走時(shí)分”、“走時(shí)時(shí)”的順序進(jìn)行設(shè)置。 設(shè)置方法為: 1、 走時(shí)和鬧鐘調(diào)整: 走時(shí)狀態(tài),長按按鍵0。5秒鐘以上后松開按鍵,“鬧鐘分”以0。3秒的速度閃爍顯示,再次按下按鍵不要松開,“鬧鐘分”會(huì)快速的從00到59之間變化,從而達(dá)到快速設(shè)定時(shí)間的目的。當(dāng)顯示到需要的時(shí)間時(shí)松開按鍵,會(huì)自動(dòng)進(jìn)入到設(shè)置“鬧鐘時(shí)”的狀態(tài),可以同樣的方法設(shè)置“鬧鐘時(shí)”。當(dāng)松開按鍵后此時(shí)有兩種選擇,一是長按按鍵退出鬧鐘設(shè)置狀態(tài),返回到正常走時(shí);二是短按一下按鍵進(jìn)入繼續(xù)設(shè)置時(shí)間的狀態(tài)。 設(shè)置方法相同。 注意:為了對(duì)只要設(shè)置鬧鐘時(shí)不影響電子鐘的走時(shí)精確度,在設(shè)置鬧鐘的時(shí)候,秒鐘位走時(shí)不停止,正常顯示,但對(duì)鬧鐘設(shè)置無任何影響。在進(jìn)入走時(shí)設(shè)置后自動(dòng)把秒設(shè)置為00秒,以確保可以在設(shè)置后從00秒開始走時(shí),有利于提高我們調(diào)時(shí)的準(zhǔn)確性。 2、 鬧鐘開關(guān)設(shè)置:只要短按一下按鍵即可開啟或關(guān)閉鬧鐘。 走時(shí)狀態(tài),短按一下按鍵可以查詢鬧鐘時(shí)間,約顯示兩秒鐘后,自動(dòng)設(shè)置鬧鐘開關(guān)。其中00為鬧鐘關(guān)閉狀態(tài)、01為鬧鐘開啟狀態(tài)。設(shè)置完畢自動(dòng)退出。 注意:如果原來鬧鐘為開啟狀態(tài)則關(guān)閉鬧鐘,反之,開啟鬧鐘。第一次通電工作時(shí)默認(rèn)為鬧鐘開啟。 硬件電路實(shí)現(xiàn) 電路如圖2所示,因有秒鐘位,末設(shè)置秒點(diǎn)閃爍,如果要秒位可在VCC與數(shù)碼管的DP之間接一個(gè)1K電阻即可達(dá)到12:00顯示的效果。 圖2 電子鐘原理圖 電路所用的元件較少,根據(jù)實(shí)際情況可以調(diào)整R8的阻值來改變數(shù)碼管亮度。 本人所做的實(shí)物如圖3、圖4所示。圖3 實(shí)物圖圖4 實(shí)物圖源程序 源程序如下: ORG 0000H ;程序開始入口 LJMP START ORG 0003H ;外中斷0中斷程序入口 RETI ORG 000BH ;定時(shí)器T0中斷程序入口 LJMP INTT0 ;跳至INTTO執(zhí)行 ORG 0013H ;外中斷1中斷程序入口 RETI ORG 001BH ;定時(shí)器T1中斷程序入口 LJMP INTT1 ORG 0023H ;串行中斷程序入口地址 RETI ;---------------主程序----------------------; START:MOV R0,#70H ;70給R0,清70-7FH顯示內(nèi)存 MOV R7,#0FH CLEARDISP:MOV @R0,#00H ;0給R0中的數(shù)為地址的內(nèi)存中存放(70H) INC R0 DJNZ R7,CLEARDISP MOV 78H,#2 ;默認(rèn)時(shí)間為12:00,鬧鐘5:00 MOV 79H,#1 MOV 74H,#2 ;防止上電時(shí)數(shù)碼管顯示00小時(shí) MOV 75H,#1 MOV 66H,#1 ;中斷退出時(shí)66H為1時(shí),分、時(shí)計(jì)時(shí)單元數(shù)據(jù)移入顯存標(biāo)志 MOV 68H,#1 ;上電默認(rèn)鬧鐘開狀態(tài) MOV 7DH,#6 ;鬧鐘時(shí)十位 MOV 7CH,#3 MOV 69H,#0 MOV 7AH,#0AH ;放入"熄滅符"數(shù)據(jù) MOV TMOD,#11H ;設(shè)T0、T1為16位定時(shí)器 MOV TL0,#0B0H ;50MS定時(shí)初值(T0計(jì)時(shí)用) MOV TH0,#3CH SETB EA ;總中斷開放 SETB ET0 ;允許T0中斷 SETB TR0 ;T0定時(shí)器開始計(jì)時(shí) MOV R4,#14H ;1秒定時(shí)用初值(50MS×20) START1:LCALL DISPLAY ;顯示子程序 LCALL BEEP ;鬧鐘查詢 JNB P1.7,SETTIME ;P1.7口為0時(shí)轉(zhuǎn)時(shí)間調(diào)整程序 JMP START1 ;P1.7口為1時(shí)跳回START1 ;-----------------------時(shí)間鬧鐘調(diào)整系統(tǒng)--------------------------; NFLAG:MOV A,68H ;設(shè)置鬧鐘開關(guān)狀態(tài) CJNE A,#1,BEE68 MOV 68H,#0 JMP E6 BEE68:MOV 68H,#1 E6:MOV 66H,#8 ;中斷退出66H不為1時(shí)分、時(shí)計(jì)時(shí)單元數(shù)據(jù)移入顯存標(biāo)志 MOV 72H,7BH MOV 73H,7CH MOV 74H,7DH MOV 75H,7EH LCALL DDL LCALL DDL MOV 72H,68H MOV 73H,69H MOV 74H,7AH MOV 75H,7AH LCALL DDL LCALL DDL MOV 66H,#1 LJMP START1 SETTIME:LCALL DDL JB P1.7,NFLAG ;鍵按下時(shí)間小于1秒,設(shè)置鬧鐘開關(guān)狀態(tài)并查看鬧鐘時(shí)間,不關(guān)走時(shí),確保準(zhǔn)確,大于1秒調(diào)時(shí) MOV TL1,#0B0H ;T1閃爍定時(shí)初值 MOV TH1,#3CH MOV R2,#06H ;進(jìn)入調(diào)時(shí)狀態(tài),賦閃爍定時(shí)初值 MOV 66H,#8 ;調(diào)鬧鐘時(shí)保持走時(shí),關(guān)閉時(shí)鐘顯示數(shù)據(jù) SETB ET1 ;允許T1中斷 SETB TR1 ;開啟定時(shí)器T1 SET1:LCALL DISPLAY ;調(diào)用顯示,防止鍵按下無顯示 JNB P1.7,SET1 ;P1.7口為0等待鍵釋放 MOV R5,#00H ;清設(shè)置類型閃爍標(biāo)志 SETN1:INC R5 ;鬧鐘分調(diào)整 SET5:LCALL DISPLAY JB P1.7,SET5 SEETN1:LCALL DDL ;有鍵按下大于1秒分時(shí)間連續(xù)加(0.5秒加1),小于1秒轉(zhuǎn)調(diào)時(shí)狀態(tài) JB P1.7,SET6 ;鍵釋放查詢,鍵釋放自動(dòng)轉(zhuǎn)調(diào)時(shí) MOV R0,#7CH LCALL ADD1 MOV A,R3 CLR C CJNE A,#60H,HHN1 HHN1:JC SEETN1 LCALL CLR0 JMP SEETN1 SET6:INC R5 ;鬧鐘時(shí)調(diào)整 SEET6:LCALL DISPLAY JB P1.7,SEET6 SEETNH1:LCALL DDL JB P1.7,SETF MOV R0,#7EH LCALL ADD1 MOV A,R3 CLR C CJNE A,#24H,HOUU1 HOUU1:JC SEETNH1 LCALL CLR0 JMP SEETNH1 SETF:LCALL DISPLAY JB P1.7,SETF LCALL DDL JNB P1.7,SETOUT ;短按調(diào)時(shí),長按退出 CLR ET0 CLR TR0 MOV 70H,#00H ;設(shè)定后的時(shí)間從00秒開始走時(shí) MOV 71H,#00H INC R5 SET3:LCALL DISPLAY JB P1.7,SET3 SETMM:LCALL DDL JB P1.7,SET4 MOV R0,#77H LCALL ADD1 MOV A,R3 CLR C CJNE A,#60H,MMH MMH:JC SETMM LCALL CLR0 AJMP SETMM SET4:INC R5 SEET4:LCALL DISPLAY JB P1.7,SEET4 SETHH:LCALL DDL JB P1.7,SETOUT1 MOV R0,#79H LCALL ADD1 MOV A,R3 CLR C CJNE A,#24H,HOUU HOUU:JC SETHH LCALL CLR0 AJMP SETHH SETOUT1:SETB ET0 SETB TR0 ;計(jì)時(shí)開始 SETOUT:MOV R5,#00H ;清設(shè)置類型閃爍標(biāo)志 CLR TR1 ;關(guān)閉T1 CLR ET1 ;關(guān)T1中斷 MOV 66H,#1 SETOUT2:LCALL DISPLAY JNB P1.7,SETOUT2 LJMP START1 ;--------------------------延時(shí)1秒鐘-----------------------; DDL:MOV 18H,#36 DDL0:MOV 17H,#239 DDL1:LCALL DISPLAY DJNZ 17H,DDL1 DJNZ 18H,DDL0 RET ;----------------------------T0中斷程序------------------------; INTT0: PUSH ACC ;打包 PUSH PSW CLR ET0 CLR TR0 MOV A,#0B7H ADD A,TL0 MOV TL0,A MOV A,#3CH ADDC A,TH0 MOV TH0,A SETB TR0 DJNZ R4, OUTT0 ;20次中斷未到中斷退出 ADDSS: MOV R4,#14H ;20次中斷到(1秒)重賦初值 MOV R0,#71H ;指向秒計(jì)時(shí)單元(70-71H) ACALL ADD1 ;調(diào)用加1程序(加1秒操作) MOV A,R3 ;秒數(shù)據(jù)放入A(R3為2位十進(jìn)制數(shù)組合) CLR C ;清進(jìn)位標(biāo)志 CJNE A,#60H,ADDMM ADDMM: JC OUTT01 ;小于60秒退出 ACALL CLR0 ;等于或大于60秒清0 MOV R0,#77H ;指向分計(jì)時(shí)單元(76H-77H) ACALL ADD1 MOV A,R3 CLR C CJNE A,#60H,ADDHH ADDHH: JC OUTT0 ACALL CLR0 MOV R0,#79H ;指向小時(shí)計(jì)時(shí)單元(78H-79H) ACALL ADD1 MOV A,R3 CLR C CJNE A,#24H,HOUR HOUR: JC OUTT0 ACALL CLR0 OUTT0: MOV A,66H ;查詢標(biāo)志 CJNE A,#1,OUTT01 MOV 72H,76H ;中斷退出時(shí)將分、時(shí)計(jì)時(shí)單元數(shù)據(jù)移入對(duì)應(yīng)顯示單元 MOV 73H,77H MOV 74H,78H MOV 75H,79H OUTT01:POP PSW ;出棧 POP ACC SETB ET0 ;開放T0 RETI ;中斷返回 ;---------------------------加1程序--------------------------; ADD1: MOV A,@R0 ;取當(dāng)前計(jì)時(shí)單元數(shù)據(jù)到A DEC R0 ;指向前一地址 SWAP A ;A中數(shù)據(jù)高四位與低四位交換 ORL A,@R0 ;前一地址中數(shù)據(jù)放入A中低四位 ADD A,#01H ;A加1操作 DA A ;十進(jìn)制調(diào)整 MOV R3,A ;移入R3寄存器 ANL A,#0FH ;高四位變0 MOV @R0,A ;放回前一地址單元 MOV A,R3 ;取回R3中暫存數(shù)據(jù) INC R0 ;指向當(dāng)前地址單元 SWAP A ;A中數(shù)據(jù)高四位與低四位交換 ANL A,#0FH ;高四位變0 MOV @R0,A ;數(shù)據(jù)放入當(dāng)削地址單元中 RET CLR0: CLR C CLR A ;清累加器 MOV @R0,A ;清當(dāng)前地址單元 DEC R0 ;指向前一地址 MOV @R0,A ;前一地址單元清0 RET ;子程序返回 ;-------------------------調(diào)時(shí)閃爍程序----------------------; INTT1: PUSH ACC PUSH PSW MOV TL1,#0B0H MOV TH1,#3CH DJNZ R2,INTT1OUT ;0.3秒未到退出中斷(50MS中斷6次) MOV R2,#06H ;重裝0.3秒定時(shí)用初值 CPL 02H ;0.3秒定時(shí)到對(duì)閃爍標(biāo)志取反 JB 02H,FLASH1 ;02H位為1時(shí)顯示單元"熄滅" MOV A,R5 CJNE A,#01H,NL JMP NNN1 NL:CJNE A,#02H,NL1 LJMP NNN1 NL1:CJNE A,#03H,NL2 LJMP NLL NL2:CJNE A,#04H,INTT1OUT LJMP NLL NLL:MOV 72H,76H MOV 73H,77H MOV 74H,78H MOV 75H,79H AJMP INTT1OUT NNN1:MOV 72H,7BH MOV 73H,7CH MOV 74H,7DH MOV 75H,7EH INTT1OUT:POP PSW ;恢復(fù)現(xiàn)場 POP ACC RETI ;中斷退出 FLASH1:MOV A,R5 CJNE A,#01H,ML LJMP MNN1 ML:CJNE A,#02H,ML1 LJMP MNN2 ML1:CJNE A,#03H,MN LJMP MLL MN:CJNE A,#04H,INTT1OUT LJMP MHL MLL:MOV 72H,7AH MOV 73H,7AH ;顯示單元(72-73H),將不顯示分?jǐn)?shù)據(jù) MOV 74H,78H MOV 75H,79H AJMP INTT1OUT MHL:MOV 72H,76H MOV 73H,77H MOV 74H,7AH ;顯示單元(74-75H),小時(shí)數(shù)據(jù)將不顯示 MOV 75H,7AH AJMP INTT1OUT MNN1:MOV 72H,7AH MOV 73H,7AH ;顯示單元(72-73H),將不顯示鬧鐘分?jǐn)?shù)據(jù) MOV 74H,7DH MOV 75H,7EH AJMP INTT1OUT MNN2:MOV 72H,7BH MOV 73H,7CH MOV 74H,7AH MOV 75H,7AH ;顯示單元(74-75H),鬧鐘小時(shí)數(shù)據(jù)將不顯示 AJMP INTT1OUT ;-------------------------顯示-------------------------------; DISPLAY:MOV DPTR,#DISDATA MOV A,70H MOVC A,@A+DPTR MOV P3,A CLR P1.0 NOP NOP NOP SETB P1.0 MOV A,71H MOVC A,@A+DPTR MOV P3,A CLR P1.1 NOP NOP NOP SETB P1.1 MOV A,72H MOVC A,@A+DPTR MOV P3,A CLR P1.2 NOP NOP NOP SETB P1.2 MOV A,73H MOVC A,@A+DPTR MOV P3,A CLR P1.3 NOP NOP NOP SETB P1.3 MOV A,74H MOVC A,@A+DPTR MOV P3,A CLR P1.4 NOP NOP NOP SETB P1.4 MOV A,75H MOVC A,@A+DPTR MOV P3,A CLR P1.5 NOP NOP NOP SETB P1.5 RET BEEP:MOV A,68H ;查詢標(biāo)志 CJNE A,#1,BEERE MOV A,78H ;查詢鬧鐘時(shí)個(gè)位 CJNE A,7DH,BEERE MOV A,79H ;查詢鬧鐘時(shí)十位 CJNE A,7EH,BEERE MOV A,76H ;查詢鬧鐘分個(gè)位 CJNE A,7BH,BEERE MOV A,77H ;查詢鬧鐘分十位 CJNE A,7CH,BEERE BB:CLR P1.6 LCALL DDL SETB P1.6 LCALL DDL JNB P1.7,BEERR BEERE:RET BEERR:SETB P1.6 MOV 68H,#0 LCALL DISPLAY JNB P1.7,BEERR JMP BEERE DISDATA:DB 0C0H,0F9H,64H,70H,59H,52H,42H,0F8H,40H,50H,0FFH ;0123456789空白 END |
|