多功能數(shù)字時(shí)鐘設(shè)計(jì)資料,多功能,數(shù)字,時(shí)鐘,設(shè)計(jì),資料
一 摘要
單片計(jì)算機(jī)即單片微型計(jì)算機(jī)。(Single-Chip Microcomputer ),是 集CPU ,RAM ,ROM ,
定時(shí),計(jì)數(shù)和多種接口于一體的微控制器。他體積小,成本低,功能強(qiáng),廣泛應(yīng)用于智能產(chǎn)
品和工業(yè)自動(dòng)化上。而51 單片機(jī)是各單片機(jī)中最為典型和最有代表性的一種。這次畢業(yè)設(shè)
計(jì)通過(guò)對(duì)它的學(xué)習(xí),應(yīng)用,從而達(dá)到學(xué)習(xí)、設(shè)計(jì)、開(kāi)發(fā)軟、硬的能力。
二 說(shuō)明
系統(tǒng)由AT89C51、LED 數(shù)碼管、按鍵、發(fā)光二極管等部分構(gòu)成,能實(shí)現(xiàn)時(shí)間的調(diào)整、定
時(shí)時(shí)間的設(shè)定,輸出等功能。系統(tǒng)的功能選擇由SB0、SB1、SB2、SB3、SB4 完成。其中SB0
為時(shí)間校對(duì),定時(shí)器調(diào)整功能鍵,按SB 0 進(jìn)入調(diào)整狀態(tài)。SB1 為功能切換鍵。第一輪按動(dòng)
SB1 依次進(jìn)入一路、二路、三路定時(shí)時(shí)間設(shè)置提示程序,按SB3 進(jìn)入各路定時(shí)調(diào)整狀態(tài)。定
時(shí)時(shí)間到,二極管發(fā)亮。到了關(guān)斷時(shí)間后滅掉。如果不進(jìn)入繼續(xù)按SB1 鍵,依次進(jìn)入時(shí)間
? 年? 位校對(duì)、? 月? 位校對(duì)、 ? 日? 位校對(duì)、? 時(shí)? 位校對(duì)、? 分? 位校對(duì)、? 秒? 位
校對(duì)狀態(tài)。不管是進(jìn)入那種狀態(tài),按動(dòng)SB2 皆可以使被調(diào)整位進(jìn)行不進(jìn)位增量加1 變化。各
預(yù)置量設(shè)置完成后,系統(tǒng)將所有的設(shè)置存入RAM 中,按SB1 退出調(diào)整狀態(tài)。上電后,系統(tǒng)自
動(dòng)進(jìn)入計(jì)時(shí)狀態(tài),起始于? 00? 時(shí)? 00? 分。SB4 為年月日顯示轉(zhuǎn)換鍵,可使原來(lái)顯示時(shí)分
秒轉(zhuǎn)換顯示年月日。
三、電路原理分析
1. 顯示原理
電原理圖見(jiàn)附圖1。由6 個(gè)共陰極的數(shù)碼管組成時(shí)、分、秒的顯示。P0 口的8 條數(shù)據(jù)線
P0.0 至P0.7 分別與兩個(gè)CD4511 譯碼的ABCD 口相接,P2 口的 P2.0 至P2.2 分別通過(guò)電阻
R10 至R13 與VT1 至VT3 的基極相連接。這樣通過(guò)P0 口送出一個(gè)存儲(chǔ)單元的高位、低位BCD
顯示代碼,通過(guò)P2 口送出掃描選通代碼輪流點(diǎn)亮LED1 至LED6,就會(huì)將要顯示的數(shù)據(jù)在數(shù)
碼管中顯示出來(lái)。從P0 口輸出的代碼是BCD 碼,從P2 口輸出的就是位選碼。這是掃描顯示
原理。
。
2 鍵盤(pán)及讀數(shù)原理
鍵盤(pán)是人與微機(jī)打交道的主要設(shè)備,按鍵的讀取容易引起誤動(dòng)作??刹捎密浖?
抖動(dòng)的方法處理,軟件的觸點(diǎn)在閉合和斷開(kāi)的時(shí)候會(huì)產(chǎn)生抖動(dòng),這時(shí)觸點(diǎn)的邏輯電
平是不穩(wěn)定的,如不采取妥善處理的話,將引起按鍵命令錯(cuò)誤或重復(fù)執(zhí)行,在這里
采用軟件延時(shí)的方法來(lái)避開(kāi)抖動(dòng),延時(shí)時(shí)間20ms.
3 連擊功能的實(shí)現(xiàn)
按下某鍵時(shí),對(duì)應(yīng)的功能鍵解釋程序得到執(zhí)行,如操作者沒(méi)有釋放按鍵,則對(duì)應(yīng)
的功能會(huì)反復(fù)執(zhí)行,好象連續(xù)執(zhí)行,在這里我們采用軟件延時(shí)250ms,當(dāng)按鍵沒(méi)釋放則
執(zhí)行下一條對(duì)應(yīng)程序。利用連擊功能,能實(shí)現(xiàn)快速調(diào)時(shí)操作。
四、程序設(shè)計(jì)思想和相關(guān)指令介紹
本系統(tǒng)的主程序主要完成時(shí)間顯示和定時(shí)輸出判斷功能。而年月日顯示和各時(shí)間單元進(jìn)
位,時(shí)間設(shè)定時(shí),調(diào)定時(shí)間設(shè)定時(shí)等功能全部在中斷服務(wù)程序中完成。
1.?dāng)?shù)據(jù)與代碼轉(zhuǎn)換。
由前述可知,從P2 口輸出位選碼,從P0 口輸出段選碼,LED 就會(huì)顯示出數(shù)字來(lái)。但P0
口的輸出的數(shù)據(jù)是要BCD 碼,各存儲(chǔ)單元存儲(chǔ)的是二進(jìn)制數(shù),也就是和要顯示出的字符表達(dá)
的含義是不一致的??梢?jiàn),將要顯示的存儲(chǔ)單元的數(shù)據(jù)直接送到P0 口去驅(qū)動(dòng)LED 數(shù)碼管顯
示是不能正確表達(dá)的,必須在系統(tǒng)內(nèi)部將要顯示的數(shù)據(jù)經(jīng)過(guò)BCD 碼行轉(zhuǎn)換后,將各個(gè)單元數(shù)
據(jù)的段選代碼送入P0 口,給CD4511 譯碼后去驅(qū)動(dòng)數(shù)碼管顯示。
具體轉(zhuǎn)換過(guò)程如下:
我們先將要顯示的數(shù)據(jù)裝入累加器A 中,再將A 中的數(shù)據(jù)轉(zhuǎn)換成高低兩位的BCD 碼,
再放回A 中,然后將A 中的值輸出。如:有一個(gè)單元存儲(chǔ)了45 這樣一位數(shù),則需轉(zhuǎn)換成四
位的BCD 碼:(0100)(0101)然后放入A 中。 A 中BCD 碼,高位四位代表?4?低四位代
表?5?同時(shí)送給兩個(gè)譯碼器中,譯碼后? 45? 字就在兩個(gè)LED 中顯示出來(lái)。
2.計(jì)時(shí)功能的實(shí)現(xiàn)與中斷服務(wù)程序
時(shí)間的運(yùn)行依靠定時(shí)中斷子程序?qū)r(shí)鐘單元數(shù)值進(jìn)位調(diào)整來(lái)實(shí)現(xiàn)的。計(jì)數(shù)器T0 打開(kāi)后,
進(jìn)入計(jì)時(shí),滿100 毫秒后,重裝定時(shí)。中斷一次,滿一秒后秒進(jìn)位,滿60 秒后即為1 分鐘,
分鐘單元進(jìn)位,60 分到了后,時(shí)單元進(jìn)位,24 小時(shí)滿后,天單元進(jìn)位。這樣然后根據(jù)進(jìn)率,
得到年、月、日、時(shí)、分、秒存儲(chǔ)單元的值,并經(jīng)譯碼后,通過(guò)掃描程序送LED 中顯示出來(lái),
實(shí)現(xiàn)時(shí)鐘計(jì)時(shí)功能。累加是用指令I(lǐng)NC 來(lái)實(shí)現(xiàn)的。
進(jìn)入中斷服務(wù)程序以后,執(zhí)行PUSH PSW 和PUSH A 將程序狀態(tài)寄存器PSW 的內(nèi)容和累
加器A 中的數(shù)據(jù)保存起來(lái),這便是所謂的? 保護(hù)現(xiàn)場(chǎng)? . 以保護(hù)現(xiàn)場(chǎng)和恢復(fù)現(xiàn)場(chǎng)時(shí)存取關(guān)鍵
數(shù)據(jù)的存儲(chǔ)區(qū)叫做堆棧。在軟件的控制之下,堆??稍谄瑑?nèi)RAM 中的任一區(qū)間設(shè)定,而堆棧
的數(shù)據(jù)存取與一般的RAM 存取又有區(qū)別,對(duì)它的操作,要遵循? 后進(jìn)先出? 的原則。
3 時(shí)間控制功能與比較指令
系統(tǒng)的另一功能就是實(shí)現(xiàn)對(duì)執(zhí)行設(shè)備的定時(shí)開(kāi)關(guān)控制,其主要控制思想是這樣的:先
將執(zhí)行設(shè)備開(kāi)啟的時(shí)間和關(guān)閉時(shí)間置入RAM 某一單元,在計(jì)時(shí)主程序當(dāng)中執(zhí)行幾條比較指
令,如果當(dāng)前計(jì)時(shí)時(shí)間與執(zhí)行設(shè)備的設(shè)定開(kāi)啟時(shí)間相等,就執(zhí)行一條 CLR 指令,將對(duì)應(yīng)的
那路P3 置為高電位,開(kāi)啟;如果當(dāng)前計(jì)時(shí)時(shí)間與執(zhí)行設(shè)備設(shè)定的關(guān)閉時(shí)間相等,就執(zhí)行SETB
對(duì)應(yīng)的P3 置低電位,二極管截止,。實(shí)現(xiàn)此控制功能用到的比較指令為CJNE A,#direct,
rel,其轉(zhuǎn)移條件是累加器A 中的值與立即數(shù)不等則轉(zhuǎn)移。
參考文獻(xiàn)
1、 謝自美,《電子線路設(shè)計(jì)、實(shí)驗(yàn)、測(cè)試 》武漢:華中理工大學(xué)出版社,2000
2、 何書(shū)森、何華斌《實(shí)用數(shù)字電路原理與設(shè)計(jì)速成》福州:福建科學(xué)技術(shù)出版社,2000.6
3、 白駒衍, 《單片計(jì)算機(jī)及應(yīng)用》北京:電子工業(yè)出版社, 1999.2
五:程序
SEC EQU 32H ;秒 即時(shí)時(shí)間 \偽指令
MIN EQU 31H ;分
HOUR EQU 30H ;時(shí)
DAY EQU 35H ;日
MON EQU 34H ;月
YEAR EQU 33H ;年
MIN_1 EQU 41H ;分 定時(shí)器1 路、開(kāi)存儲(chǔ)單元
HOUR_1 EQU 42H ;時(shí)
DAY_1 EQU 43H ;
MON_1 EQU 44H ;
YEAR_1 EQU 45H ;
MIN_11 EQU 40H ;分 定時(shí)器1 路、關(guān)存儲(chǔ)單元
HOUR_11 EQU 46H ;時(shí)
DAY_11 EQU 47H ;日
MON_11 EQU 48H ;月
YEAR_11 EQU 49H ;年
;***********************
ORG 0000H
ljmp MAIN
ORG 0003H ;中斷轉(zhuǎn)換顯示年月日、INT0(SB4 鍵)
LJMP SHOW
ORG 000BH ;計(jì)數(shù)中斷 T0、方式1
LJMP TIME
ORG 0013H
LJMP CHANGE; 調(diào)整時(shí)間、定時(shí)、INT1(SB0 鍵)
;------主程序
ORG 0030H
MAIN:
;--------初始化付值
MOV YEAR , #02
MOV MON , #05
MOV DAY , #01
MOV HOUR , #00
MOV MIN , #00
MOV SEC , #00
CLR 40H ;定時(shí)單元1 路清零
CLR 41H
CLR 42H
CLR 43H
CLR 44H
CLR 45H
CLR 46H
CLR 47H
CLR 48H
CLR 49H
;-------開(kāi)中斷
MOV TMOD , #01H ;計(jì)數(shù)、模式1、T0
MOV TL0, #0B0H ;100SM 計(jì)數(shù)定時(shí)
MOV TH0, #3CH ;
clr p3.0
MOV 20H, #0AH ;10 次*100SM
SETB PT0 ;T0 為最高級(jí)
SETB TR0 ;允許計(jì)數(shù)
SETB ET0 ;允許T0 中斷
SETB EX0 ;允許INT0 中斷
SETB EX1 ;允許INT1 中斷
SETB EA ;開(kāi)總中斷
;------顯示、定時(shí)器啟動(dòng)判斷
LOOP:
MOV R1, #30H; 存儲(chǔ)單元
MOV R4, #01H; 位選通
MOV R3, #03H; 三組顯示
NEXT:
MOV A , @R1 ;
MOV B , #10 ;將存儲(chǔ)單元轉(zhuǎn)換成兩高低兩組的BCD 碼
DIV AB
SWAP A
ORL A, B
MOV P0, A;輸出
MOV P2, R4
INC R1 ;下一單元
MOV A, R4 ;
RL A ;位移
MOV R4, A
LCALL DE5SM ;延時(shí)0.5SM
DJNZ R3, NEXT ;全掃描顯示一偏
;------判斷定時(shí)輸出(只編寫(xiě)了一路)
CJNE R7, #88H,LOOP ;是8 則開(kāi),否則、定時(shí)已關(guān)、轉(zhuǎn)
;---------開(kāi)
MOV A, YEAR
CJNE A, YEAR_1, LOOP_1;年比較,不等轉(zhuǎn)關(guān)
MOV A, MON
CJNE A, MON_1, LOOP_1
MOV A, DAY
CJNE A , DAY_1,LOOP_1
MOV A, HOUR
CJNE A, HOUR_1,LOOP_1
MOV A, MIN
CJNE A, MIN_1, LOOP_1
CPL P3.0
;---------關(guān)
LOOP_1:
MOV A, YEAR
CJNE A, YEAR_11, LOOP;年比較
MOV A, MON
CJNE A, MON_11, LOOP
MOV A, DAY
CJNE A , DAY_11,LOOP
MOV A, HOUR
CJNE A, HOUR_11,LOOP
MOV A, MIN
CJNE A, MIN_11, LOOP
CPL P3.0
LJMP LOOP
;-----年月日顯示中斷子程序
SHOW:
PUSH PSW
push ACC
PUSH B
PUSH 01H
PUSH 02H
PUSH 03H
PUSH 04H
MOV R2, #0FFH ;中斷掃描次數(shù)
TURN: MOV R1 , #33H
MOV R4 , #01H
MOV R3 , #03H
NEXT_1:
MOV A, @R1
MOV B , #10
DIV AB
SWAP A
ORL A, B
MOV P0, A
MOV P2, R4
INC R1
RL A
MOV R4 ,A
LCALL DE5SM
DJNZ R3, NEXT_1
DJNZ R2, TURN ;反復(fù)顯示一定時(shí)間后返回
POP 04H
POP 03H
POP 02H
POP 01H
POP B
POP ACC
POP PSW
RETI
;-----計(jì)數(shù)中斷服務(wù)子程序
TIME:
PUSH PSW
PUSH ACC
PUSH B
PUSH 06H
MOV TH0 , #3CH;重裝計(jì)數(shù)
MOV TL0 , #0BH;
DJNZ 20H, OUT ;轉(zhuǎn)到中斷跳出pop 程序
MOV 20H, #0AH ; 重裝:100*10=1000
;-----進(jìn)位程序
INC SEC
MOV R6, SEC ;
CJNE R6, #60, OUT;比較
MOV SEC , #00 ;
INC MIN
MOV R6, MIN
CJNE R6, #60, OUT
MOV MIN , #00
INC HOUR
MOV R6 , HOUR
CJNE R6 , #25 , OUT
MOV HOUR ,#00
INC DAY
MOV R5, MON
CJNE R5, #1, MON_22;是否1 月、不是轉(zhuǎn)2 月
MOV R5, DAY
CJNE R5, #32, OUT ; 本月是否益出
INC MON
MOV DAY,#1
LJMP OUT
OUT:
POP 06H
POP B
POP ACC
POP PSW
RETI
MON_22:
MOV R5, MON
CJNE R5 , #2 , MON_33;是否2 月、不是轉(zhuǎn)3 月
MOV A, YEAR ;判斷是否瑞年
MOV B, #4
DIV AB
MOV A , B
JNZ OUT_1;不是則轉(zhuǎn)(A 不為零則轉(zhuǎn))
MOV R5 ,DAY
CJNE R5,#30, OUT;如是瑞年、判斷是否到29 天
INC MON
MOV DAY ,#1
LJMP OUT
OUT_1:
MOV R5, DAY
CJNE R5, #29, OUT ;平年二月判斷
INC MON
MOV DAY , #1
LJMP OUT
MON_33:
MOV R5, MON
CJNE R5, #3 , MON_44
MOV R5, DAY
CJNE R5 , #32, OUT
INC MON
MOV DAY , #1
LJMP OUT
MON_44:
MOV R5, MON
CJNE R5,#4, MON_55
MOV R5, DAY
CJNE R5 ,#31,OUT
INC MON
MOV DAY , #1
LJMP OUT
MON_55:
MOV R5,MON
CJNE R5,#5, MON_66
MOV R5,DAY
CJNE R5,#32,OUT
INC MON
MOV DAY,#1
LJMP OUT
MON_66:
MOV R5, MON
CJNE R5,#6, MON_77
MOV R5, DAY
CJNE R5 ,#31,OUT
INC MON
MOV DAY , #1
LJMP OUT
MON_77:
MOV R5, MON
CJNE R5,#7, MON_88
MOV R5, DAY
CJNE R5,#32,L1
INC MON
MOV DAY , #1
L1: LJMP OUT
MON_88:
MOV R5, MON
CJNE R5,#8, MON_99
MOV R5, DAY
CJNE R5 ,#32,L2
INC MON
MOV DAY , #1
L2: LJMP OUT
MON_99:
MOV R5, MON
CJNE R5,#9, MON_00
MOV R5,DAY
CJNE R5 ,#31,L3
INC MON
MOV DAY , #1
L3: LJMP OUT
MON_00:
MOV R5, MON
CJNE R5,#10, MON_AA
MOV R5, DAY
CJNE R5 ,#32,L4
INC MON
MOV DAY , #1
L4: LJMP OUT
MON_AA:
MOV R5, MON
CJNE R5,#11, MON_BB
MOV R5,DAY
CJNE R5,#31,L5
INC MON
MOV DAY , #1
L5: LJMP OUT
MON_BB:
MOV R5, DAY
CJNE R5 ,#32,L6
INC YEAR
MOV MON, #1
MOV DAY , #1
L6:LJMP OUT
;-------按SB2\定時(shí)器年單元加1 子程序
SB3_2: LJMP SHOW_2 ;二路沒(méi)編返回
SB3_3: LJMP SHOW_3 ;三路沒(méi)編返回
SB3_1:
MOV A , YEAR_1 ; 調(diào)時(shí)年單元
MOV B ,#10
DIV AB
SWAP A
ORL A,B
MOV P0, A
MOV P2, #01H
LCALL READ
LCALL DE250SM
CJNE A, 01H, SB3_1
CJNE A, #0FBH, KEY2_7 ;按SB2 轉(zhuǎn)年調(diào)整
LJMP MON_111 ;按SB1 往下調(diào)月單元
KEY2_7:CJNE A, #0FDH, SB3_1
INC YEAR_1 ; 1 路年單元加1
MOV R5,YEAR_1
CJNE R5,#09,SB3_1 ;益出
MOV YEAR_1, #00H
AJMP SB3_1 ;
;-------月單元加1 子程序
MON_111:
MOV A , MON_1 ; 調(diào)時(shí)月單元顯示
MOV B ,#10
DIV AB
SWAP A
ORL A,B
MOV P0, A
MOV P2, #02H
LCALL READ
LCALL DE250SM
CJNE A, 01H, MON_111
CJNE A, #0FBH, KEY2_8 ;按SB2 轉(zhuǎn)月調(diào)整
LJMP DAY_111
KEY2_8:
CJNE A,#0FDH,MON_111
INC MON_1 ;1 路月單元加1
MOV R5,MON_1
CJNE R5,#13,MON_111;益出
MOV MON_1, #01H
AJMP MON_111 ; 轉(zhuǎn)到月顯
;_------日單元加1 子程序
DAY_111:
MOV A , DAY_1 ; 調(diào)時(shí)日單元顯示提示
MOV B ,#10
DIV AB
SWAP A
ORL A,B
MOV P0, A
MOV P2, #04H
LCALL READ
LCALL DE250SM
CJNE A, 01H,DAY_111
CJNE A, #0FBH, KEY2_9 ;按SB2 轉(zhuǎn)日調(diào)整
LJMP HOUR_111
KEY2_9: CJNE A,#0FDH,DAY_111
INC DAY_1 ;1 組日單元加1
MOV R5, DAY_1
CJNE R5,#32,DAY_111;益出
MOV DAY_1, #01H
AJMP DAY_111 ; 轉(zhuǎn)到日顯
;-------按SB2 時(shí)單元加1 子程序
HOUR_111:
MOV A , HOUR_1 ; 調(diào)時(shí)時(shí)單元顯示提示
MOV B ,#10
DIV AB
SWAP A
ORL A,B
MOV P0, A
MOV P2, #01H
LCALL READ
LCALL DE250SM
CJNE A, 01H,HOUR_111
CJNE A, #0FBH, KEY2_10 ; 按SB2 轉(zhuǎn)時(shí)調(diào)整
LJMP MIN_111
KEY2_10:CJNE A,#0FDH,HOUR_111
INC HOUR_1
MOV R5,HOUR_1
CJNE R5,#24,HOUR_111;益出
MOV HOUR_1, #00H
AJMP HOUR_111 ; 轉(zhuǎn)到時(shí)顯
;-------分單元加1 子程序
MIN_111:
MOV A , MIN_1 ; 調(diào)時(shí)分單元、并顯示提示
MOV B ,#10
DIV AB
SWAP A
ORL A,B
MOV P0, A
MOV P2, #02H
LCALL READ
LCALL DE250SM
CJNE A, 01H,MIN_111
CJNE A, #0FBH, KEY2_11 ;按SB2 轉(zhuǎn)分調(diào)整
AJMP OFF_CH ;按SB3 往下調(diào)定時(shí):關(guān)單元
KEY2_11: CJNE A, #0FDH, MIN_111
INC MIN_1 ;1 路分單元加1
MOV R5, MIN_1
CJNE R5,#60,MIN_111;益處
MOV MIN_1, #00H
AJMP MIN_111 ; 轉(zhuǎn)到分顯
年單元調(diào)整
OFF_CH: MOV A , YEAR_11 ; 調(diào)時(shí)年單元
MOV B ,#10
DIV AB
SWAP A
ORL A,B
MOV P0, A
MOV P2, #01H
LCALL READ
LCALL DE250SM
CJNE A, 01H, OFF_CH
CJNE A, #0FBH, KEY2_F7 ;按SB2 轉(zhuǎn)年調(diào)整
LJMP MON_OFF ;按SB1 往下調(diào)月單元
KEY2_F7:CJNE A, #0FDH, OFF_CH
INC YEAR_11 ; 1 路年單元加1
MOV R5,YEAR_11
CJNE R5,#09,OFF_CH ;益出
MOV YEAR_11, #00H
AJMP OFF_CH ;
;-------月單元加1 子程序
MON_OFF:
MOV A , MON_11 ; 調(diào)時(shí)月單元顯示
MOV B ,#10
DIV AB
SWAP A
ORL A,B
MOV P0, A
MOV P2, #02H
LCALL READ
LCALL DE250SM
CJNE A, 01H, MON_OFF
CJNE A, #0FBH, KEY2_F8 ;按SB2 轉(zhuǎn)月調(diào)整
LJMP DAY_OFF
KEY2_F8:
CJNE A,#0FDH,MON_OFF
INC MON_11 ;1 路月單元加1
MOV R5,MON_11
CJNE R5,#13,MON_OFF;益出
MOV MON_11, #01H
AJMP MON_OFF ; 轉(zhuǎn)到月顯
;_------日單元加1 子程序
DAY_OFF:
MOV A , DAY_11 ; 調(diào)時(shí)日單元顯示提示
MOV B ,#10
DIV AB
SWAP A
ORL A,B
MOV P0, A
MOV P2, #04H
LCALL READ
LCALL DE250SM
CJNE A, 01H,DAY_OFF
CJNE A, #0FBH, KEY2_F9 ;按SB2 轉(zhuǎn)日調(diào)整
LJMP HOUR_OFF
KEY2_F9: CJNE A,#0FDH,DAY_OFF
INC DAY_11 ;1 組日單元加1
MOV R5, DAY_11
CJNE R5,#32,DAY_OFF;益出
MOV DAY_11, #01H
AJMP DAY_OFF ; 轉(zhuǎn)到日顯
;-------按SB2 時(shí)單元加1 子程序
HOUR_OFF:
MOV A , HOUR_11 ; 調(diào)時(shí)時(shí)單元顯示提示
MOV B ,#10
DIV AB
SWAP A
ORL A,B
MOV P0, A
MOV P2, #01H
LCALL READ
LCALL DE250SM
CJNE A, 01H,HOUR_OFF
CJNE A, #0FBH, KEY2_F10 ; 按SB2 轉(zhuǎn)時(shí)調(diào)整
LJMP MIN_OFF
KEY2_F10:CJNE A,#0FDH,HOUR_OFF
INC HOUR_11
MOV R5,HOUR_11
CJNE R5,#24,HOUR_OFF;益出
MOV HOUR_11, #00H
AJMP HOUR_OFF ; 轉(zhuǎn)到時(shí)顯
;-------分單元加1 子程序
MIN_OFF:
MOV A , MIN_11 ; 調(diào)時(shí)分單元、并顯示提示
MOV B ,#10
DIV AB
SWAP A
ORL A,B
MOV P0, A
MOV P2, #02H
LCALL READ
LCALL DE250SM
CJNE A, 01H,MIN_OFF
CJNE A, #0FBH, KEY2_F11 ;按SB2 轉(zhuǎn)分調(diào)整
LJMP ON_1 ;按SB3 往下調(diào)定時(shí):開(kāi)與關(guān)
KEY2_F11: CJNE A, #0FDH, MIN_OFF
INC MIN_11 ;1 路分單元加1
MOV R5, MIN_11
CJNE R5,#60,MIN_OFF;益處
MOV MIN_11, #00H
LJMP MIN_OFF ; 轉(zhuǎn)到分顯
;-------開(kāi)、關(guān)定時(shí)
ON_1:CJNE A, #0FBH, MIN_OFF
K1: MOV A, #88H
MOV R7, A
MOV P0, A
MOV P2, #0FFH;三組都顯示開(kāi)
LCALL READ
LCALL DE250SM
CJNE A, 01H, ON_1;去抖后比較
CJNE A, #0FBH,KEY2_12 ;按SB2 轉(zhuǎn)關(guān)
LJMP OUT_A ;按SB3 調(diào)出、處于開(kāi)狀態(tài)
KEY2_12: CJNE A, #0FDH, K1
k2: MOV A, #00H; 顯示0 關(guān)
MOV R7, A
MOV P0, A
MOV P2, #0FFH;
LCALL READ
LCALL DE250SM
CJNE A, 01H, K2;去抖后比較
CJNE A, #0FBH,KEY2_13 ;按SB2 轉(zhuǎn)開(kāi)
LJMP OUT_A ;SB3 調(diào)出、處關(guān)狀態(tài)
KEY2_13:
CJNE A, #0FDH, K2 ; 比較按了沒(méi)
LJMP K1 ; 按了SB2、轉(zhuǎn)開(kāi)
OUT_A:
POP 00H
POP B
POP ACC
POP PSW
RETI
;_------讀取按鍵程序
READ:MOV A , P1;讀取按鍵
MOV R1, A
LCALL DE10MS
MOV A, P1
RET
;_----延時(shí)程序
DE5SM:
PUSH 01H
MOV R1, #0FFH
DJNZ R1,$
POP 01H
RET
DE10MS: PUSH 04H
PUSH 05H
MOV R4, #0AH
Dl1: MOV R5, #0FFH
dl2: DJNZ R5,$
DJNZ R4,dl1
POP 05H
POP 04H
RET
DE250SM:PUSH 02H
PUSH 00H
MOV R0, #0FFH
DEL:MOV R2, #0FFH
DJNZ R2,$
DJNZ R0, DEL
POP 00H
POP 02H
RET
;_---調(diào)整時(shí)間進(jìn)位程序
MIN_AD:
INC MIN
MOV R6, MIN
CJNE R6, #60, OU1
MOV MIN , #00
OU1: RET
HOUR_AD:
INC HOUR
MOV R6 , HOUR
CJNE R6 , #25 , OU2
MOV HOUR ,#00
OU2: RET
DAY_AD:
INC DAY
MOV R6, DAY
CJNE R6 , #32, OU3 ; 是否益出
MOV DAY ,#01H
OU3: RET
MON_AD:
INC MON
MOV R6, MON
CJNE R6, #13, OU4 ; 是否益出
MOV MON ,#01H
OU4: RET
YEAR_AD:
INC YEAR
MOV R6, YEAR
CJNE R6, #09, OU5;是否益出
MOV YEAR ,#00H
OU5: RET
END
六:附錄
實(shí)驗(yàn)設(shè)計(jì)電路圖1
流程圖1:實(shí)驗(yàn)主程序流程圖
流程圖2:定時(shí)中斷程序流程圖
流程圖3:調(diào)時(shí)功能流程圖
七:實(shí)驗(yàn)心得
學(xué)了兩周的課程設(shè)計(jì),有很多的心得體會(huì),有關(guān)于單片機(jī)方面的,更多的是關(guān)于人與人之間關(guān)系方面的。
在這期間,我得到了很多同學(xué)的幫助。我本人對(duì)單片機(jī)也并不是很熟悉,學(xué)的東西好像它是它,我是我似的,理論聯(lián)系不了實(shí)際。以前的匯編語(yǔ)言沒(méi)學(xué)好,一開(kāi)始的程序這塊兒就要令我束手無(wú)策了。后來(lái)請(qǐng)教我們班的一個(gè)男生,每次跟他一起到試驗(yàn)室調(diào)試程序,看他邊做邊給我講解。最后在計(jì)算機(jī)上調(diào)試成功,后來(lái)自己又抽空做了些拓展,完成了本程序。
后來(lái),我發(fā)現(xiàn)自己對(duì)單片機(jī)也有了很大興趣,想暑假回家以后自己去買(mǎi)一些東西來(lái)做,再補(bǔ)一補(bǔ)匯編語(yǔ)言。
最后說(shuō)明自己對(duì)這門(mén)課程的感受,課堂教學(xué)考慮到大多數(shù)同學(xué)的需求,主要強(qiáng)調(diào)“基本”——基本知識(shí)、基本理論、基本方法、基本技能。而這次設(shè)計(jì)正是為我們提供了一個(gè)深入學(xué)習(xí)、探索的機(jī)會(huì),成為課堂教學(xué)的有益補(bǔ)充。
單片機(jī)的設(shè)計(jì)
設(shè)計(jì)名稱 : 電子時(shí)鐘設(shè)計(jì)
班級(jí) :
學(xué)號(hào) :
姓名 :
指導(dǎo)教師 :
一 引言 2
二 硬件系統(tǒng)方案設(shè)計(jì) 2
2.1電話撥號(hào)防盜報(bào)警器硬件系統(tǒng)方案 2
2.1.1 硬件系統(tǒng)方案設(shè)計(jì) 2
2.1.2 脈沖撥號(hào)原理 3
2.1.3 脈沖撥號(hào)實(shí)現(xiàn)過(guò)程 4
2.1.4 AT89S2052單片機(jī)的功能特點(diǎn) 5
2.2 時(shí)鐘計(jì)時(shí)器的硬件設(shè)計(jì)方案論證分析 8
2.2.1 功能要求 8
2.2.2 方案論證 8
2.2.3 系統(tǒng)硬件電路設(shè)計(jì) 8
4.1.2時(shí)鐘計(jì)時(shí)器的硬件電路設(shè)計(jì)描述 9
三 系統(tǒng)的軟件設(shè)計(jì) 10
3.1電話撥號(hào)防盜報(bào)警器程序設(shè)計(jì) 10
3.1.1主程序設(shè)計(jì) 11
3.2 時(shí)鐘顯示程序設(shè)計(jì) 12
3.2.1主函數(shù) 12
3.2.2 LED顯示子函數(shù) 13
3.2.3 定時(shí)器T0中斷函數(shù) 13
3.2.4 中斷函數(shù) 14
3.2.5 功能函數(shù) 14
四 系統(tǒng)的調(diào)試部分 15
4.1 時(shí)鐘系統(tǒng)的調(diào)試 15
4.1.1 時(shí)鐘系統(tǒng)的硬件調(diào)試 15
4.1.2 時(shí)鐘系統(tǒng)的軟件調(diào)試 15
4.1.3 性能分析 15
4.2 撥號(hào)報(bào)警器功能調(diào)試 15
五 總結(jié) 16
參考文獻(xiàn) 17
附錄 18
附錄1 程序清單 18
附錄2 系統(tǒng)使用說(shuō)明 18
附錄3 英文資料 18
附錄4 系統(tǒng)PCB板圖 18
附錄1:程序清單 19
附錄2:系統(tǒng)使用說(shuō)明 36
一 引言
隨著人們生活水平的不斷提高,大家對(duì)住宅和辦公室的安全意識(shí)也日益增加。因此,研究和開(kāi)發(fā)防盜報(bào)警裝置引起了科研單位和生產(chǎn)廠家的重視,特別是面對(duì)普通居民、價(jià)格低、運(yùn)行可靠的自動(dòng)報(bào)警系統(tǒng)。
長(zhǎng)期以來(lái),一些電子雜志介紹的廉價(jià)防盜報(bào)警均無(wú)電話撥號(hào)報(bào)警功能,而市售的可自動(dòng)撥號(hào)報(bào)警的防盜器材又價(jià)格高昂。這里介紹的電話撥號(hào)防盜報(bào)警器可在這兩者之間找到平衡,即兼具高性能和低價(jià)位。為了以低成本實(shí)現(xiàn)高性能,設(shè)計(jì)時(shí)利用了電信局的交換機(jī)支持脈沖撥號(hào)方式來(lái)實(shí)現(xiàn)撥號(hào)報(bào)警,這樣可利用單片機(jī)直接發(fā)出撥號(hào)脈沖,精簡(jiǎn)了電路,降低了成本。
電話撥號(hào)防盜報(bào)警器作為家庭防盜報(bào)警器材的一員,非常經(jīng)濟(jì)實(shí)用。它進(jìn)入工作警戒后,主控CPU不斷檢查觸發(fā)開(kāi)關(guān)的狀態(tài),當(dāng)盜賊入室觸發(fā)開(kāi)關(guān)時(shí),立即啟動(dòng)電話撥號(hào)報(bào)警程序向主人告警(當(dāng)然也可以通過(guò)修改軟件使其在現(xiàn)場(chǎng)發(fā)出高分貝報(bào)警音)。實(shí)踐證明,該系統(tǒng)報(bào)警快速、準(zhǔn)確。由于該系統(tǒng)電路簡(jiǎn)單,而且利用的是公共通信網(wǎng),因此不存在建立的報(bào)警系統(tǒng)網(wǎng)絡(luò)問(wèn)題,具有成本低、體積小、能耗極低、體積小、能耗極低且不影響正常打電話等突出優(yōu)點(diǎn)。平時(shí)可以作為時(shí)鐘計(jì)時(shí)器來(lái)使用,真是一舉兩得。
二 硬件系統(tǒng)方案設(shè)計(jì)
2.1電話撥號(hào)防盜報(bào)警器硬件系統(tǒng)方案
2.1.1 硬件系統(tǒng)方案設(shè)計(jì)
圖2.1為電話撥號(hào)報(bào)警器的系統(tǒng)構(gòu)成方框圖,由單片機(jī)控制器、鍵盤(pán)輸入、數(shù)碼管顯示、觸發(fā)電路、撥號(hào)電路及電源等6部分組成。
單片機(jī)控制器是整個(gè)系統(tǒng)的核心,負(fù)責(zé)控制檢測(cè)輸入/輸出顯示、模擬摘機(jī)、撥號(hào)摘機(jī)、撥號(hào)報(bào)警、掛機(jī)等一系列的程序動(dòng)作。這里使用了小引腳、高性能、低價(jià)位的AT89S2052。
鍵盤(pán)輸入電路負(fù)責(zé)輸入電片機(jī)中一系列工作參數(shù)及功能設(shè)定。
發(fā)光二極管數(shù)碼管顯示器在整個(gè)系統(tǒng)工作過(guò)程中充當(dāng)一個(gè)簡(jiǎn)單的人機(jī)界面,用以顯示工作狀況及輸入/輸出的數(shù)據(jù)等。
電話撥號(hào)防盜報(bào)警器的觸發(fā)電路用磁性開(kāi)關(guān)(門(mén)磁開(kāi)關(guān)),簡(jiǎn)單可靠,也可用紅外探測(cè)器或無(wú)線門(mén)磁,以實(shí)現(xiàn)全方位遠(yuǎn)距離監(jiān)測(cè)。報(bào)警器應(yīng)采用隱蔽安裝,防止小偷發(fā)現(xiàn)。
撥號(hào)及報(bào)警電路用來(lái)完成模擬摘機(jī)、撥號(hào)、發(fā)出報(bào)警音、掛機(jī)等工作過(guò)程,它的工作由單片機(jī)控制。
電源部分負(fù)責(zé)對(duì)整個(gè)系統(tǒng)供電。平時(shí)由電話線上取得工作電流并對(duì)后備電池充電,撥號(hào)報(bào)警時(shí)轉(zhuǎn)由后備電池供電。
鍵盤(pán)
單片機(jī)
控制器
觸發(fā)
開(kāi)關(guān)
電源
撥號(hào)
電路
顯示
模塊
圖2.1 電話撥號(hào)防盜報(bào)警器方框圖
2.1.2 脈沖撥號(hào)原理
脈沖撥號(hào)是目前電話機(jī)兩種撥號(hào)方式中的一種,另一種為雙音多頻撥號(hào)方式。
脈沖撥號(hào)就是指在電話機(jī)上撥入的電話號(hào)碼以脈沖個(gè)數(shù)的形式發(fā)出,也就是說(shuō),在已經(jīng)通以直流電流的回路上,利用撥號(hào)盤(pán)及發(fā)號(hào)電路將回路斷開(kāi)、再接通而形成的脈沖信號(hào),來(lái)完成輸入電話號(hào)碼的發(fā)送。在操作中,若用戶撥1,則送出1個(gè)脈沖,回路中斷一次、接通一次;撥2,則發(fā)出2個(gè)脈沖,回路斷一次、接通一次、再斷一次;……;而撥0時(shí),則發(fā)出10個(gè)脈沖,回路斷、接通輪流10次。圖2.2為電話號(hào)碼“32”的脈沖波形。
時(shí)間
號(hào)碼字間間隔時(shí)間
tID
號(hào)碼2的脈沖
號(hào)碼3
的脈沖
斷
通
圖2.2 電話號(hào)碼“32”的脈沖波形
正常撥號(hào)時(shí),電路電流中斷的時(shí)間一般在58~65ms之間,視斷續(xù)比的不同而不同??焖贀芴?hào)時(shí),只要取一半時(shí)間即可。電路電流接通的時(shí)間(即在同一位號(hào)碼中的2個(gè)斷脈沖之間的接通電流時(shí)間)約在32~42ms之間,視斷續(xù)比的不同而不同??焖贀芴?hào)時(shí),只要取一半時(shí)間即可。顯然脈沖周期等于脈沖中斷時(shí)間和脈沖接通時(shí)間之和,每一個(gè)周期的時(shí)間為100ms左右??焖贀芴?hào)時(shí),在50ms左右。2位號(hào)碼(即2組脈沖串)之間的最小時(shí)間間隔,通常為800ms左右;而快速撥號(hào)時(shí),其值減半,為400ms左右。
我國(guó)目前采用的電話脈沖撥號(hào)的速率是10PPS(每秒的脈沖數(shù)),即每秒發(fā)出10個(gè)脈沖,因此上述各參數(shù)不存在快速撥號(hào)時(shí)的值。
為了提高撥號(hào)的可靠性及穩(wěn)定性,這里設(shè)計(jì)時(shí)選定更低的脈沖撥號(hào)速率:1個(gè)脈沖代表播出1,2個(gè)脈沖代表?yè)艹?,……,10個(gè)脈沖代表?yè)艹?,每個(gè)脈沖的寬度和間隔為100ms。工作時(shí)首先進(jìn)行模擬摘機(jī),然后開(kāi)始脈沖撥號(hào),撥出1位號(hào)碼后停頓500ms(保持接通)再撥下一位,直至全部撥完后再發(fā)報(bào)警音,……,最后掛機(jī)。
2.1.3 脈沖撥號(hào)實(shí)現(xiàn)過(guò)程
圖2.3為脈沖撥號(hào)的實(shí)現(xiàn)電路。平時(shí)電話線上的電壓約為50~60V左右。未撥號(hào)時(shí)電片機(jī)的P3.0、P3.1 均輸出低電平。
撥號(hào)過(guò)程如下:
①單片機(jī)的P3.0輸出高電平,使TR1導(dǎo)通,由于電話線路上接入了負(fù)載R1,這樣電話線的電壓下降,模擬摘機(jī)。
②單片機(jī)的P3.0開(kāi)始輸出撥號(hào)脈沖,使電話線的電壓(電平)也呈高、低變化。1個(gè)脈沖代表?yè)艹?,2個(gè)脈沖代表?yè)艹?,……,10個(gè)脈沖代表?yè)艹?,每個(gè)脈沖的寬度和間隔均為100ms。撥出1位號(hào)碼后停頓500ms(保持P3.0高電平)再撥下一位,直至全部撥完。
③P3.0 保持高電平(保持電話線路接通),P3.1輸出1KHz的報(bào)警音脈沖驅(qū)動(dòng)TR2,以2Hz進(jìn)行調(diào)制(即接通1kHz信號(hào)0.5s、斷開(kāi)1kHz信號(hào)0.5s),這樣從接聽(tīng)方的電話中就會(huì)聽(tīng)到“嘟、嘟……”的報(bào)警聲。報(bào)警音的時(shí)間根據(jù)設(shè)計(jì)為60s。
④60后,P3.1輸出低電平,TR2 截止,停止報(bào)警。隨后P3.0也輸出低電平,模擬掛機(jī)。完成一次報(bào)警過(guò)程。
圖2.3 脈沖撥號(hào)實(shí)現(xiàn)電路
2.1.4 AT89S2052單片機(jī)的功能特點(diǎn)
電話撥號(hào)防盜報(bào)警器的核心控制器是單片機(jī)AT89S2052。AT89S2052 是美國(guó)ATMEL半導(dǎo)體公司生產(chǎn)的一種高性能單片機(jī)。該單片機(jī)以與MCS-51系列單片機(jī)高度兼容、低功耗、可以在接近零頻率下工作等諸多優(yōu)點(diǎn),而廣泛應(yīng)用于各類(lèi)計(jì)算機(jī)系統(tǒng)、工業(yè)控制、電信設(shè)備、消費(fèi)類(lèi)產(chǎn)品中。由于ATMEL是全球最大的FLASH和EEPROM生產(chǎn)制造公司之一,加之以其EEPROM技術(shù)與INTEL的80C51內(nèi)核技術(shù)交換,使ATMEL擁有了80C51內(nèi)核的使用權(quán),其生產(chǎn)的AT89系列電片機(jī)不僅與80C51有極好的兼容性,而且具有極高的性能價(jià)格比。
1. AT89S2051的主要性能特點(diǎn)
指令與MCS-51完全兼容;內(nèi)帶2KB可編程閃速存儲(chǔ)器(FLASH MEMORY)可重復(fù)擦寫(xiě)1000次;數(shù)據(jù)保留10年;工作電壓范圍2.7~6V;工作頻率0~24MHZ;兩極程序加密鎖定;128B內(nèi)部RAM;15條可編程雙向I/O口線;2個(gè)16位定時(shí)器/計(jì)時(shí)器;5個(gè)中斷源;可編程串行UART通道;輸出口可直接驅(qū)動(dòng)LED;片內(nèi)含模擬比較器;低功耗的閑置和掉電模式。
AT89S2052是AT89 系列電片機(jī)種的一種精簡(jiǎn)產(chǎn)品。它是將TA89C52的P0口、P2口、EA/Vpp、ALE/PROG、PSEN口線省去后,形成的一種僅20個(gè)引腳的單片機(jī),相當(dāng)于早期INTEL8031的最小應(yīng)用系統(tǒng)。這對(duì)于一些不太復(fù)雜的控制場(chǎng)合,僅用一片AT89S2052就足夠了,是真正意義上的“單片機(jī)”。
由于將多功能8位CPU和2KB的閃速存儲(chǔ)器集成在單個(gè)芯片中,使其成為一種高效的微控制器。AT89S2052的出現(xiàn)為很多規(guī)模不太大的嵌入式控制系統(tǒng)提供了一種極佳的選擇方案,使傳統(tǒng)的51系列單片機(jī)的體積大、功耗大、可選模式少等諸多困擾設(shè)計(jì)工程師們的致命弱點(diǎn)不復(fù)存在。
2. 引腳功能介紹
AT89S2052引腳外形如圖所示。
Vcc:電源端。
GND:接地。
P1 口(P1.0~P1.7):是一個(gè)8位雙向I/O口,其中P1.2至P1.7提供內(nèi)部上拉電阻,P1.0和P1.1需外接上拉電阻。P1.0和P1.1也可作為片內(nèi)精確模擬比較器的正向輸入(AINO)和反向輸入(AINI)。P1口輸出緩沖器能提供20mA的灌電流,可直接驅(qū)動(dòng)LED。P1口寫(xiě)入“1”后可用作輸入。
P3口:引腳P3.0至P3.7(P3.5除外)是7個(gè)帶內(nèi)部上拉電阻的雙向I/O口線。原P3.6不能使用,已連接片內(nèi)比較器輸出端。與P1口相同,P3口也能提供20mA的灌電流,并可直接驅(qū)動(dòng)LED顯示器。與80C51相同,P3口也有第2功能,P3.0作為串行數(shù)據(jù)接收RXD;P3.1作為串行數(shù)據(jù)發(fā)送TXD;P3.2為外部中斷0申請(qǐng)INT0;P3.3 為外部中斷1申請(qǐng)INT1;P3.4 為定時(shí)器/計(jì)時(shí)器0輸入;P3.5位定時(shí)器/計(jì)數(shù)器1輸入;P3.7無(wú)第2功能RD。
RST:復(fù)制輸入。要使芯片可靠復(fù)位,要保持RST引腳2個(gè)機(jī)器周期的高電平。
XTAL1:反向振蕩放大的輸入及內(nèi)部時(shí)鐘電路的殊榮。
XTAL2:來(lái)自反向振蕩放大器的輸出。
3. 特殊功能寄存器(SFR)與80C51完全相同
4. 程序存儲(chǔ)器鎖定
AT89S2052片內(nèi)有2個(gè)鎖定位,可以不編程(U),也可以編程(P),以獲得一些附加的特性,如表2.1所示。
表2.1 程序存儲(chǔ)器鎖定
編程鎖定位
LB1
LB2
保護(hù)模式
1
U
U
沒(méi)有編程鎖定特性
2
P
U
禁止對(duì)閃速存儲(chǔ)器進(jìn)一步編程
3
P
P
同模式2,同時(shí)禁止校驗(yàn)
5、閑置模式
在閑置模式下,CPU自身處于休眠狀態(tài),而片內(nèi)所有其他外圍設(shè)備保持工作狀態(tài)。該模式是軟件生成的。在該模式期間,片內(nèi)RAM和所有特殊功能寄存器的內(nèi)容保持不變。閑置模式可以允許由中斷或硬件復(fù)位終止。如果不采用外部上拉,P1.0和P1.1應(yīng)置0;如果采用外部上拉,則置1。應(yīng)注意的是,當(dāng)閑置模式被硬件復(fù)位中止時(shí),器件要從閑置處恢復(fù)程序的執(zhí)行,執(zhí)行2個(gè)機(jī)器周期后,內(nèi)部復(fù)位算法才起作用。此時(shí),硬件禁止訪問(wèn)內(nèi)部RAM,但允許訪問(wèn)端口引腳。為了排除閑置被復(fù)位中止時(shí)對(duì)端口意外寫(xiě)入的可能性,跟在生成閑置模式后的指令不應(yīng)是對(duì)端口引腳的讀/寫(xiě)操作。
6.掉電模式
在掉電模式下,振蕩器停止工作,生成掉電狀態(tài)的指令是最后執(zhí)行的一條指令。片內(nèi)RAM和特殊功能寄存器保持其值不變直到掉電模式終止。從掉電模式退出的唯一辦法是硬件復(fù)位。復(fù)位將重新定義特殊功能寄存器(SFR),但不會(huì)影響片內(nèi)RAM。在Vcc沒(méi)有恢復(fù)到其正常工作電壓之前,不應(yīng)進(jìn)行復(fù)位,且復(fù)位的保持時(shí)間應(yīng)足夠長(zhǎng),使振蕩器能重新開(kāi)始工作并穩(wěn)定下來(lái)。同樣,如果不采用外部下拉,P1.0和P1.1應(yīng)置0,如果采用外部上拉,則置1。
2.2 時(shí)鐘計(jì)時(shí)器的硬件設(shè)計(jì)方案論證分析
2.2.1 功能要求
時(shí)鐘計(jì)時(shí)器要求用六位LED數(shù)碼管顯示時(shí)、分、秒、以二十四小時(shí)方式運(yùn)行,使用按鍵開(kāi)關(guān)實(shí)現(xiàn)時(shí),分調(diào)整功能。
2.2.2 方案論證
為實(shí)現(xiàn)LED顯示器的數(shù)字顯示,可以采用靜態(tài)顯示法和動(dòng)態(tài)顯示法。由于靜態(tài)顯示法需要數(shù)據(jù)鎖存器等硬件,接口復(fù)雜一些,考慮到時(shí)鐘顯示只有六位,且系統(tǒng)沒(méi)有其它復(fù)雜的處理任務(wù),所以決定用動(dòng)態(tài)掃描實(shí)現(xiàn)LED顯示。單片機(jī)采用易購(gòu)的AT89S52系列,這種單片機(jī)可具有足夠的空余硬件資源,以實(shí)現(xiàn)其它的擴(kuò)充功能。若使用電池供電,可采用低電壓的LV系列單片機(jī)時(shí)鐘計(jì)時(shí)器電路系統(tǒng)的總體設(shè)計(jì)框架如圖3.1所示。
單片機(jī)控制器
AT89S52
6位LED顯示器
列驅(qū)動(dòng)
圖3.1 硬件系統(tǒng)的總體設(shè)計(jì)框架
2.2.3 系統(tǒng)硬件電路設(shè)計(jì)
電話撥號(hào)防盜報(bào)警器的硬件電路設(shè)計(jì)描述
為了發(fā)揮電片機(jī)強(qiáng)大的計(jì)算、控制能力,充分發(fā)揮軟件的優(yōu)勢(shì),這里極大地簡(jiǎn)化了電路,但可實(shí)現(xiàn)以前需要幾片甚至十幾片小規(guī)模數(shù)字電路才能完成的任務(wù)。
電路原理如圖所示,共有4個(gè)按鍵,即rst、ok、up、set。
rst:系統(tǒng)復(fù)位鍵。
ok:輸入數(shù)據(jù)確認(rèn)鍵。
up:顯示的數(shù)字增加鍵。
set:工作模式設(shè)定鍵,可設(shè)定管機(jī)、工作、輸入時(shí)間t1、輸入時(shí)間t2及輸入電話號(hào)碼5種模式。
磁性開(kāi)關(guān)即為裝于門(mén)或窗口的防盜感應(yīng)開(kāi)關(guān),門(mén)關(guān)閉時(shí)常開(kāi),門(mén)打開(kāi)時(shí)閉合接通。當(dāng)然也可改用其他的感應(yīng)器件,如激光探測(cè)、超聲波感應(yīng)、熱釋電感應(yīng)、主動(dòng)紅外線探測(cè)或無(wú)線門(mén)磁等,以實(shí)現(xiàn)全方位遠(yuǎn)距離檢測(cè)。為了防止磁性開(kāi)關(guān)離控制器較遠(yuǎn)而產(chǎn)生引入干擾,使用了光耦作信號(hào)傳遞,效果良好。LED數(shù)碼管用于工作狀態(tài)指示或輸入數(shù)據(jù)指示。L1、L2接電話線,ZND為擊穿電壓120V的壓敏二極管,防止電路受雷電干擾。平時(shí)系統(tǒng)處于低功耗待機(jī)狀態(tài)(此時(shí)耗電僅2mA左右),由電話線上取電工作,并對(duì)3.6V/60mA鎳鉻電池充電,當(dāng)輸入數(shù)據(jù)進(jìn)行設(shè)定或進(jìn)行撥號(hào)報(bào)警時(shí),耗電會(huì)達(dá)到10mA,這時(shí)主要由鎳鉻電池供電。由于有鎳鉻電池后備供電,即使電話線斷電也不會(huì)使已輸入的數(shù)據(jù)丟失。該機(jī)除用于防盜報(bào)警外,若對(duì)軟件進(jìn)行一些修改,也可通過(guò)電話線進(jìn)行遠(yuǎn)程數(shù)據(jù)傳遞。三極管T1、T2及電阻R1、R2構(gòu)成撥號(hào)及報(bào)警電路,其工作原理前面已作詳細(xì)介紹。
4.1.2時(shí)鐘計(jì)時(shí)器的硬件電路設(shè)計(jì)描述
時(shí)鐘計(jì)時(shí)器的硬件電路,采用AT89S52單片機(jī)最小化應(yīng)用設(shè)計(jì),顯示采用共陽(yáng)七段LED顯示器,P0口輸出段數(shù)碼數(shù)據(jù),P2.0~P2.5口作列掃描輸出,P1.0,P1.1和P1.2口接三個(gè)按鈕開(kāi)關(guān)用以實(shí)現(xiàn)調(diào)時(shí),調(diào)分功能.為了提供共陽(yáng)LED數(shù)碼管的驅(qū)動(dòng)電壓,用三極管8550作電源驅(qū)動(dòng)輸出。采用12MHZ晶振有利于提高秒計(jì)時(shí)的精確性。硬件電路圖如圖3.2示。
圖3.2 具有時(shí)鐘功能的電話報(bào)警器原理圖
三 系統(tǒng)的軟件設(shè)計(jì)
3.1電話撥號(hào)防盜報(bào)警器程序設(shè)計(jì)
3.1.1主程序設(shè)計(jì)
主程序的工作過(guò)程為:先進(jìn)行初始化工作,隨后根據(jù)輸入的鍵值分別散轉(zhuǎn)輸入的鍵值分別散轉(zhuǎn)至對(duì)應(yīng)的子程序(管機(jī)、警戒工作、輸入時(shí)間t1、輸入時(shí)間t2、輸入電話號(hào)碼)循環(huán)工作。T0為100ms定時(shí)中斷服務(wù)子程序,它實(shí)現(xiàn)精確的撥號(hào)脈沖時(shí)序。INT0外中斷服務(wù)子函數(shù)用于實(shí)現(xiàn)功能選擇;而INT1外中斷服務(wù)子函數(shù)則檢測(cè)防盜觸發(fā)開(kāi)關(guān)的狀態(tài)。
主程序狀態(tài)流程圖如圖3.6所示。INT0外中斷服務(wù)子函數(shù)狀態(tài)流程圖及INT1外中斷服務(wù)子函數(shù)的狀態(tài)流程圖分別如圖3.7、圖3.8所示。
開(kāi)始
定時(shí)器T0初始化
關(guān)閉撥號(hào)、報(bào)警線路
輸入號(hào)碼
輸入t2
輸入t1
工作
根據(jù)set鍵值散轉(zhuǎn)
關(guān) 機(jī)
圖3.6 主程序狀態(tài)流程
- 40 -
INT0外中斷服務(wù)子函數(shù)開(kāi)始
如set鍵按下,則set鍵值加1
如鍵值大于5,則鍵值回0
系統(tǒng)進(jìn)入低功耗待機(jī)狀態(tài)
INT0外中斷服務(wù)子函數(shù)結(jié)束
圖3.7 INT0外中斷服務(wù)子函數(shù)狀態(tài)流程
INT1外中斷服務(wù)子函數(shù)結(jié)束
查詢門(mén)控開(kāi)關(guān)共10次
INT1外中斷服務(wù)子函數(shù)開(kāi)始
圖3.8 INT1外中斷服務(wù)子函數(shù)結(jié)束
3.2 時(shí)鐘顯示程序設(shè)計(jì)
3.2.1主函數(shù)
本設(shè)計(jì)中計(jì)時(shí)采用定時(shí)器T0中斷完成,其余狀態(tài)循環(huán)調(diào)用顯示子函數(shù)及鍵掃描子函數(shù),當(dāng)端口開(kāi)關(guān)按下時(shí),轉(zhuǎn)入相應(yīng)調(diào)時(shí)功能。其主函數(shù)執(zhí)行流程如圖3.3所示。
開(kāi) 始
顯示單元清0
T0、T1設(shè)為16位計(jì)數(shù)器模式
允許T0中斷
N
調(diào)用顯示子函數(shù)
鍵按下?
進(jìn)入調(diào)時(shí)功能
圖3.3 主函數(shù)流程圖
3.2.2 LED顯示子函數(shù)
數(shù)碼管顯示的數(shù)據(jù)存放在內(nèi)存單元dis[0]~dis[5]中,其中dis[0]~dis[1]存放秒數(shù)據(jù),dis[2]~dis[3]存放分?jǐn)?shù)據(jù),dis[4]~dis[5]存放時(shí)數(shù)據(jù),每一單元內(nèi)均為十進(jìn)制BCD碼。由于采用軟件動(dòng)態(tài)掃描實(shí)現(xiàn)數(shù)據(jù)顯示功能,顯示用的十進(jìn)制BCD碼數(shù)據(jù)的對(duì)應(yīng)段碼存放在ROM表(dis7[11])中,顯示時(shí),先取出dis[0]~dis[5]中的某一數(shù)據(jù),然后查得對(duì)應(yīng)得顯示段碼從P0口輸出,P2口將對(duì)應(yīng)得數(shù)碼管選中供電,就能顯示該地址單元的數(shù)據(jù)值。
3.2.3 定時(shí)器T0中斷函數(shù)
定時(shí)器T0用于時(shí)間計(jì)時(shí)。定時(shí)溢出中斷周期可設(shè)為50ms,中斷進(jìn)入后先判斷,中斷計(jì)時(shí)累計(jì)20次(即1ms)時(shí)對(duì)妙計(jì)數(shù)單元進(jìn)行加1操作。時(shí)鐘計(jì)數(shù)單元在 義的6個(gè)單元(timedata[6])中。timedata[0]~timedata[1]存放秒數(shù)據(jù),timedata[2]~timedata[3]存放分?jǐn)?shù)據(jù),timedata[4]~timedata[5]存放時(shí)數(shù)據(jù)。最大計(jì)時(shí)值為23小時(shí)59分59秒。在計(jì)數(shù)單元中采用十進(jìn)制BCD碼計(jì)數(shù),秒,分、時(shí)之間滿60進(jìn)位。T0中斷服務(wù)程序執(zhí)行流程如圖3.4所示。
T0中斷
保護(hù)現(xiàn)場(chǎng)
1s到?
加1處理
恢復(fù)現(xiàn)場(chǎng),中斷返回
圖3.4 T0 中斷函數(shù)
3.2.4 中斷函數(shù)
T1中斷服務(wù)程序用于指示調(diào)整數(shù)字單元的亮閃,在時(shí)間調(diào)整狀態(tài)下,每過(guò)0.4s,將對(duì)應(yīng)單元的顯示數(shù)據(jù)換成“熄滅符”數(shù)據(jù)(0x0a)。這樣,在調(diào)整時(shí)間時(shí),對(duì)應(yīng)調(diào)整單元的顯示數(shù)據(jù)會(huì)間隔閃亮。
3.2.5 功能函數(shù)
調(diào)時(shí)功能函數(shù)的設(shè)計(jì)方法是:按下T0鍵,進(jìn)入調(diào)分狀態(tài),時(shí)鐘停止走動(dòng);按T1或T2鍵可進(jìn)行加1或減1操作 ;繼續(xù)按T0鍵可分別進(jìn)行分十位、時(shí)個(gè)位和時(shí)十位調(diào)整;最后按T0建將退出調(diào)整狀態(tài),時(shí)鐘開(kāi)始計(jì)時(shí)運(yùn)行。
四 系統(tǒng)的調(diào)試部分
4.1 時(shí)鐘系統(tǒng)的調(diào)試
4.1.1 時(shí)鐘系統(tǒng)的硬件調(diào)試
硬件調(diào)試時(shí)可先檢查印制板及焊接的質(zhì)量情況,在檢查無(wú)誤后可通電檢查L(zhǎng)ED顯示器的點(diǎn)亮狀況。若亮度不理想,可以調(diào)整P0口的電阻大小,一般情況下取200歐姆電阻即可獲得滿意的亮度效果。
4.1.2 時(shí)鐘系統(tǒng)的軟件調(diào)試
軟件調(diào)試Keil C51編譯器,源程序編譯及仿真調(diào)試應(yīng)分段或以子函數(shù)為單位一個(gè)個(gè)地進(jìn)行,最后可結(jié)合硬件實(shí)時(shí)運(yùn)行調(diào)試。
4.1.3 性能分析
按照設(shè)計(jì)程序分析,LED顯示器動(dòng)態(tài)掃描頻率約為167Hz,實(shí)際使用觀察時(shí)完全沒(méi)有閃爍,實(shí)際計(jì)時(shí)時(shí)精度較高,可滿足一般場(chǎng)合的應(yīng)用需要。
4.2 撥號(hào)報(bào)警器功能調(diào)試
通電前應(yīng)檢查焊接質(zhì)量,確認(rèn)無(wú)短路、虛焊等故障。將撥碼開(kāi)關(guān)J2指向下側(cè),即斷開(kāi)3.6V鎳鉻電池與系統(tǒng)的連接。將外部直流可調(diào)穩(wěn)壓電源調(diào)整為3.6V。接入系統(tǒng)的Vcc與地。如果系統(tǒng)耗電小于15mA為正常,否則應(yīng)檢查是否有短路、元器件不良或錯(cuò)焊現(xiàn)象存在。隨后取下外接直流穩(wěn)壓電源,恢復(fù)3.6V鎳鉻電池與系統(tǒng)的連接,進(jìn)行軟、硬件統(tǒng)調(diào)測(cè)試。
由于AT89S52的I/O引腳有限,故數(shù)碼管只設(shè)一位,因此輸入數(shù)字時(shí)只能分階段一位一位輸入。
假設(shè)需輸入t1=061,t2=025,電話號(hào)碼=12345678,在此詳述如下:
地1步:接上電話線(也即接上電源)后,數(shù)碼管顯示“E”,意為數(shù)據(jù)錯(cuò)誤,因?yàn)榇藭r(shí)我們尚未輸入任何數(shù)據(jù)。
第2步:
①點(diǎn)按一下set鍵,鍵值加1,即此時(shí)set=1.這時(shí)數(shù)碼管最下的一橫點(diǎn)亮,顯示“_”,意為可輸入時(shí)間t1,點(diǎn)按ok鍵確認(rèn)(小數(shù)點(diǎn)被同時(shí)點(diǎn)亮)。然后數(shù)碼管顯示數(shù)字“0”。
②按下up鍵后,數(shù)字開(kāi)始從0~9循環(huán)遞增,調(diào)至0后松開(kāi)up鍵,點(diǎn)按ok鍵確認(rèn)(小數(shù)點(diǎn)被同時(shí)點(diǎn)亮)。此時(shí)百位數(shù)字“0”存入內(nèi)存。
③按下up鍵后,數(shù)字開(kāi)始循環(huán)遞增,調(diào)至1后松開(kāi)up鍵,點(diǎn)按ok鍵確認(rèn)(小數(shù)點(diǎn)被同時(shí)點(diǎn)亮)。此時(shí)十位數(shù)字“6”存入內(nèi)存。
④按下up鍵后,數(shù)字開(kāi)始循環(huán)遞增,調(diào)至1后松開(kāi)up鍵,點(diǎn)按ok鍵確認(rèn)(小數(shù)點(diǎn)被同時(shí)點(diǎn)亮)。此時(shí)個(gè)位數(shù)字“6”存入內(nèi)存。
這樣就完成了將061(代表t1=61s)存入內(nèi)存的過(guò)程。同時(shí)數(shù)碼管又恢復(fù)顯示“_”
。
第3步:
①點(diǎn)按一下set鍵,鍵值加1,即此時(shí)set=2。這時(shí)數(shù)碼管下面的二橫點(diǎn)亮,顯示“二”,意為可輸入時(shí)間t2,點(diǎn)按ok鍵確認(rèn)(小數(shù)點(diǎn)被同時(shí)點(diǎn)亮)。然后數(shù)碼管顯示數(shù)字“0”。
②按下up鍵后,數(shù)字開(kāi)始從從0~9循環(huán)遞增,調(diào)至0后松開(kāi)up鍵,點(diǎn)按ok鍵確認(rèn)(小數(shù)點(diǎn)被同時(shí)點(diǎn)亮)。此時(shí)百位數(shù)字“0”存入內(nèi)存。
③按下up鍵后,數(shù)字開(kāi)始循環(huán)遞增,調(diào)至2后松開(kāi)up鍵,點(diǎn)按ok鍵確認(rèn)(小數(shù)點(diǎn)被同時(shí)點(diǎn)亮)。此時(shí)十位數(shù)字“2”存入內(nèi)存。
④按下up鍵后,數(shù)字開(kāi)始循環(huán)遞增,調(diào)至5后松開(kāi)up鍵,點(diǎn)按ok鍵確認(rèn)(小數(shù)點(diǎn)被同時(shí)點(diǎn)亮)。此時(shí)個(gè)位數(shù)字“5”存入內(nèi)存。
這樣就完成了將025(代表t1=25s)存入內(nèi)存的過(guò)程。同時(shí)數(shù)碼管又恢復(fù)顯示“二”
以后的調(diào)試同前面的方法相同。
五 總結(jié)
本系統(tǒng)以單片機(jī)89S52作為核心部件,利用單片機(jī)實(shí)現(xiàn)了電話撥號(hào)報(bào)警、時(shí)鐘顯示等功能,最終使系統(tǒng)完成設(shè)計(jì)要求的各項(xiàng)任務(wù)。在系統(tǒng)設(shè)計(jì)過(guò)程中,力求硬件線路簡(jiǎn)單,并綜合運(yùn)用了C語(yǔ)言、單片機(jī)等各種知識(shí),采用了一些特別的方法使磁電檢測(cè)達(dá)到最佳的效果 ,充分發(fā)揮軟件編程方便靈活的特點(diǎn),來(lái)滿足系統(tǒng)設(shè)計(jì)的要求。
在設(shè)計(jì)過(guò)程中主要遇到幾個(gè)關(guān)鍵性問(wèn)題。如檢測(cè)部分信號(hào)不穩(wěn)定,經(jīng)檢查該問(wèn)題與周?chē)母蓴_有密切相關(guān),將檢測(cè)部分的外圍進(jìn)行了合理,使檢測(cè)信號(hào)很準(zhǔn)確地檢測(cè)到。還有撥號(hào)電路模塊起初方案采用電橋和三極管進(jìn)行控制,此設(shè)計(jì)采用單片機(jī)I/O口直接控制指示燈以及開(kāi)關(guān)來(lái)進(jìn)行控制。不僅節(jié)省了硬件資源,還提高了系統(tǒng)的穩(wěn)定性。
變量定義及初始化模塊
參考文獻(xiàn)
[1]楊長(zhǎng)春.電子報(bào)合訂本 2002年上:261
[2]電子產(chǎn)品世界,2004,9(167):81-82
[3]耿德根,詹衛(wèi)前,李青.單片機(jī)創(chuàng)新開(kāi)發(fā)與機(jī)器人制作.北京 :北京航空航天大學(xué)出版社,2005.3:85-120
[4]吳祖峰,葛麗,李剛.傳感器個(gè)數(shù)及距離對(duì)盲分離影響的分析.電子科技大學(xué)學(xué)報(bào),2006,4,35(2):186-188
[5]韋敏,寧方立,韋娟.基于智能功率模塊的無(wú)刷直流電機(jī)控制器.西北工業(yè)大學(xué)學(xué)報(bào),2006,4,24(2):161-164
[6]熊磊,黃玉水.一種改進(jìn)型PDM調(diào)動(dòng)控制方式.南昌大學(xué)學(xué)報(bào),2006,3,28(1):99-102
[7]黃智偉.全國(guó)大學(xué)生電子設(shè)計(jì)競(jìng)賽訓(xùn)練教程. 北京:電子工業(yè)出版社,2005.1
[8]閆志峰,劉立君,崔立彪.管道弧焊機(jī)器人控制系統(tǒng)設(shè)計(jì).哈爾濱理工大學(xué)學(xué)報(bào),
[9] 萬(wàn)光毅,嚴(yán)義.單片機(jī)實(shí)驗(yàn)與實(shí)踐教程(一).北京:北京航空航天大學(xué)出版社,2003.12:123-131
[10]黃河,鮑宏亞.Protel DXP 培訓(xùn)教程.北京:清華大學(xué)出版社,2004.9
致 謝
How time flies!馬上就要畢業(yè)了。在院、系領(lǐng)導(dǎo)和老師的關(guān)心、教育和幫助下,經(jīng)過(guò)五年的努力,已經(jīng)使自己變成一個(gè)動(dòng)手動(dòng)腦的復(fù)合型人才。我將利用在校學(xué)習(xí)的專(zhuān)業(yè)知識(shí)投身職業(yè)教育事業(yè),為我國(guó)的職業(yè)教育發(fā)展做出自己的貢獻(xiàn)。
五年來(lái)我學(xué)習(xí)到了大量的專(zhuān)業(yè)理論知識(shí)和動(dòng)手實(shí)踐技能,畢業(yè)設(shè)計(jì)是對(duì)我這五年來(lái)學(xué)習(xí)的最好總結(jié)。在畢業(yè)設(shè)計(jì)過(guò)程中我遇到了很多困難,正是因?yàn)檫@些困難使我學(xué)習(xí)到了很多有用的實(shí)用知識(shí),加深了書(shū)本理論知識(shí)和實(shí)踐的結(jié)合,這對(duì)我以后從事專(zhuān)業(yè)課教學(xué)工作是很有益處的。在大學(xué)的學(xué)習(xí)期間,我意識(shí)到了——大學(xué)更重要的是教給我分析和解決問(wèn)題的方法,這些必將對(duì)我以后的工作和生活產(chǎn)生深遠(yuǎn)的影響。
在畢業(yè)設(shè)計(jì)過(guò)程中,得到了曲老師的大力支持和幫助,請(qǐng)?jiān)试S我向曲老師表示誠(chéng)摯的感謝!五年來(lái)我見(jiàn)證了母校的發(fā)展壯大,希望母校再接再厲,健全體制,走向更加輝煌的明天。最后祝愿?jìng)ゴ蟮哪感G俺趟棋\!祝愿所有的老師身體健康,工作順利!
附錄
附錄1 程序清單
附錄2 系統(tǒng)使用說(shuō)明
附錄3 英文資料
附錄4 系統(tǒng)PCB板圖
附錄1:程序清單
(1) 電話撥號(hào)報(bào)警程序
程序設(shè)計(jì)時(shí)需要設(shè)立3個(gè)數(shù)組DATA[20]、X[3]、Y[3]。DATA[20]用于存放電話號(hào)碼(最長(zhǎng)20位),X[3]用于存放時(shí)間t1(000~999s),Y[3]用于存放時(shí)間t2(000~999s)。
另外還要設(shè)立3個(gè)軟件計(jì)數(shù)器data_flag、t1_flag、t2_flag。Data_flag用于統(tǒng)計(jì)輸入的電話號(hào)碼位長(zhǎng),t1_flag用于統(tǒng)計(jì)輸入的時(shí)間t1位長(zhǎng),t2位長(zhǎng)。
uchar DATA[20]; /*存放電話號(hào)碼的數(shù)組*/
uchar X[3]; /*存放時(shí)間t1數(shù)組*/
uchar Y[3]; /*存放時(shí)間t2數(shù)組*/
uchar flag; /*RAM區(qū)防干擾標(biāo)志*/
uchar data_flag=0; /*輸入電話號(hào)碼計(jì)數(shù)器(最長(zhǎng)20位)*/
uchar set=0; /*功能鍵值*/
uchar m=0; //全局變量
uchar n=0;
uint f;
uchar t1_flag=0; /*輸入時(shí)間t1計(jì)數(shù)器(最長(zhǎng)3位)*/
uchar t2_flag=0; /*輸入時(shí)間t2計(jì)數(shù)器(最長(zhǎng)3位)*/
uchar cnt_1=0; /*時(shí)間t1單元數(shù)學(xué)運(yùn)算后暫存單元*/
uchar cnt_2=0; /*時(shí)間t2單元數(shù)學(xué)運(yùn)算后暫存單元*/
/*定時(shí)器T0初始化*/
viod init_timer()
{
TMOD=0x01; //定時(shí)器T0方式1
TH0=-(50000/256); //裝載100ms定時(shí)初值
TL0=-(50000%256);
IE=0x82; //開(kāi)中斷
}
啟動(dòng)報(bào)警器子程序模塊
/*---啟動(dòng)報(bào)警器進(jìn)入警戒---*/
void work()
{uchar h;
p1=0xdf; /*數(shù)碼管左上角顯示“1”*/
delay(1);
if(set==1) /*進(jìn)入時(shí)間1循環(huán)*/
{while(cnt<=x[0]*100+X[1]*10+X[2])
{
delay(1000);
cnt_1++; /*計(jì)數(shù)器cnt_1累加*/
if(set!=1){EX1=0;cnt_1=0;break;}
} /*如按下Set鍵,則推出此循環(huán)*/
}
else {EX1=1;PCON=0x00;}
if(set==1)
{if(cnt_1>=X[0]*100+X[1]*10+X[2])
{EX1=1;cnt_1=0;} /*時(shí)間1到,打開(kāi)外中斷1,計(jì)數(shù)器歸零*/
/*進(jìn)入待機(jī)。若有1s以上開(kāi)關(guān)動(dòng)作,退出待機(jī)*/
while(1)
{PCON=0x01;if(f>=5{PCON=0x00;break;})
}
/*-----------------------------------------------------------*/
EX1=0; /*關(guān)閉外中斷1*/
if(set==1) /*進(jìn)入時(shí)間2循環(huán)*/
{while(cnt_2<=Y[0]*100+Y[1]*10+Y[2])
{
delay(1000);
cnt_2++; /*計(jì)時(shí)器cnt_2累加*/
if(set!=1){cnt_2=0;break;}
} /*如按下Set鍵,則退出此循環(huán)*/
}
if(set==1)
{
bh(); /*時(shí)間2到,調(diào)用撥號(hào)子程序*/
delay(3000);
p3_7=0; //控制輸出端為低,可驅(qū)動(dòng)蜂鳴器等
for(h=0;h<60;h++) /*發(fā)出60s警音*/
{ for(f=0;f<500;f++)
{f++;
P3_1=! P3_1;P1=0x5f;
delay(1);
}
P3_1=0;P1=0x7f;delay(500);
}
P3_7=1;//控制輸出端恢復(fù)高
cnt_1=0;cnt_2=0; /*有關(guān)計(jì)數(shù)器、端口回到初始狀態(tài)*/
P3_0=0;P3_1=0;P1_7=1;
for(f=0;f<3;f++)delay(60000); /*關(guān)閉3min,讓接警人進(jìn)行手機(jī)或電話座機(jī)報(bào)警*/
}
}
撥號(hào)脈沖子程序模塊
/*---撥號(hào)---*/
void bh()
{data_flag=0; /*電話號(hào)碼計(jì)數(shù)器(20位)歸零*/
P3_0=1; /*接通線路*/
p1_7=0; /*數(shù)碼管小數(shù)點(diǎn)亮*/
delay(1000);
while (DATA[data_flag]<10) /*號(hào)碼小于10進(jìn)入循環(huán)撥號(hào)狀態(tài)*/
{
if(DATA[data_flag]==0) /*若號(hào)碼為0*/
{TR0=1; /*啟動(dòng)T0定時(shí)器*/
if(n==20){data_flag++; /*進(jìn)行20次中斷,產(chǎn)生10個(gè)脈沖*/
n=0;TR0=0;
P3_0=1;P1_7=0;
delay(500);
}
}
if(DATA[data_flag]>0) /*若號(hào)碼〉0但<10*/
{TR=1; /*啟動(dòng)T0定時(shí)器*/
if(n==((DATA[data_flag]*2)) /*進(jìn)行號(hào)碼x2次中斷,產(chǎn)生號(hào)碼個(gè)脈沖*/
{data_flag++;
n=0;TR0=0;
P3_0=1;P1_7=0;
delay(500);
}
}
}
TR0=0;
}
關(guān)機(jī)子程序模塊
void stop() //*關(guān)機(jī)子程序
{if(flag==0x55)P1=0xfb; //*若標(biāo)志為55H,說(shuō)明內(nèi)存區(qū)未受干擾,數(shù)碼
//管右下角顯示“1”
else P1=0x86; //否則數(shù)碼管顯示“E”
delay(1); //延時(shí)1ms再判
if(flag==0x55)PCON=0x01; //進(jìn)入低耗節(jié)電待機(jī)狀態(tài)
delay(1); //延時(shí)1ms
}
完整代碼
#include
//器件配置文件
#define uchar unsigned char //變量類(lèi)型的宏定義
#define uint unsigned int
uchar code DATA_7SEG[10]={0xC0,0xF9,0xA4,0xB0,0x99
0x92,0x82,0xF8,0x80,0x90,}; /*0~9數(shù)碼管段碼*/
uchar DATA[20]; /*存放電話號(hào)碼的數(shù)組*/
uchar x[3]; /*存放時(shí)間t2數(shù)組*/
uchar flag; /*RAM區(qū)防干擾標(biāo)志*/
uchar data_flag=0; /*輸入電話號(hào)碼計(jì)數(shù)器(最長(zhǎng)20位)*/
uchar set=0; /* 功能鍵值*/
uchar m=0; //全局變量
uchar n=0;
uint f;
uchar t1_flag=0; /*輸入時(shí)間1計(jì)數(shù)器(最長(zhǎng)3位)*/
uchar t2_flag=0; /*輸入時(shí)間2 計(jì)數(shù)器(最長(zhǎng)3位)*/
uchar cnt_1=0; /*時(shí)間t1單元數(shù)學(xué)運(yùn)算后暫存單元*/
uchar cnt_2=0; /*時(shí)間t2單元數(shù)學(xué)運(yùn)算后暫存單元*/
/*************************************************/
void delay(uint k); /*延時(shí)子函數(shù)聲明*/
void stop(); /*關(guān)機(jī)子函數(shù)聲明*/
void bh(); /*撥號(hào)子函數(shù)聲明*/
/*************************************************/
/*定時(shí)器T0初始化*/
void init_timer()
{
TMOD=0x01;
TH0=-(50000/256);
TL0=-(50000%256);
IE=0x82;
}
/***********************************************************/
/*100ms定時(shí)中斷服務(wù)子函數(shù)*/
void zd0()interrupt 1
{
P3_0=! P3_0; //P3.0每100ms取反一次,送出脈沖
P1_7=! P1_7; //數(shù)碼管小數(shù)點(diǎn)同步閃爍
n++;
TH0=-(50000/256);
TL0=-(50000%256);
}
/********************************************************/
/*100ms定時(shí)中斷服務(wù)子函數(shù)*/
void zd0()interrupt 1
{
p3_0=!P3_0; //P3.0每100ms取反一次,送出脈沖
P1_7=!P1_7; //數(shù)碼管小數(shù)點(diǎn)同步閃爍
n++;
TH0=-(50000/256);
TL0=-(50000%256);
}
/*********************************************/
/*INT0中斷服務(wù)子函數(shù)*/
viod zd_int0()interrupt 0
{
delay(10);
if(P3_2==0)set++; //功能鍵值遞增
if(set>=5)set=0; //鍵值的范圍0~4
if(set==1)flag=0x55; //向RAM區(qū)的標(biāo)志flag寫(xiě)入55H
PCON=0x00;f=8;
again:if(P3_2==0)goto again; //若按鍵未釋放,則等待
}
/*****************************************/
/*INT1中斷服務(wù)子函數(shù)*/
void zd_int1()interrupt 2
{uchar h;
f=0;
for(h=0;h<10;h++) /*檢查磁性開(kāi)關(guān)(P3_3狀態(tài))10次,共1s*/
{
delay(100)
if(P3_3==0)f++;
}
}
/********************************************************************/
/*---關(guān)機(jī)---*/
void stop()
{if(flag==0x55)P1=0xfb;
elsep1=0x86; //數(shù)碼管右下角顯示“1”。
delay(1);
if(flag==0x55)PCON=0x01; /*進(jìn)入節(jié)電待機(jī)狀態(tài)*/
delay(1);
}
/*********************************************************************/
/*延時(shí)1ms*K子函數(shù)*/
void delay(uint k)
{
uint i,j;
for(i=1;j=3)t1_flag=0; /*時(shí)間1計(jì)數(shù)器>=3時(shí)歸零*/
}
/**********************************************************************
/
/*-----輸入時(shí)間t2-----*/
viod in_time2()
{
P1=0xb7;delay(1); /*數(shù)碼管顯示“二”*/
if(P3_5==0)
{
delay(10); /*按下OK鍵確認(rèn)并點(diǎn)亮小數(shù)點(diǎn)*/
if(P3_5==0){P1=0X7f;m=0;t2_flag=0;delay(500);}
while(t2_flag<3)
{
if(P3_4==0)
{delay(10);if(P3_4==0) /*按下UP鍵數(shù)碼管作0~9遞增顯示*/
{m++;if(m==10)m=0;P1=DATA_7SEG[m];delay(300);}
}
P1=DATA_7SEG[m];delay(1); /*若不按UP鍵數(shù)碼管也作0~9顯示*/
if(P3_5==0)
{delay(10);if(P3_5==0) /*按下OK鍵顯示的數(shù)據(jù)存入數(shù)組Y中*/
{Y[t2_flag=m;t2_flag++;P1=0x7f;delay(500);}
}
}
}
if(t2_flag>=3)t2_flag=0; /*時(shí)間2計(jì)數(shù)器>=3時(shí)歸零*/
}
/***********************************************************************
/
/*----輸入電話號(hào)碼----*/
vioa in_data()
{uchar g;
P1=0xb6;delay(1); /*數(shù)碼管顯示三*/
if(P3_5==0)
{delay(10);if(P3_5==0)
{p1=0x7f;m=0;data_flag=0; /*按下OK鍵確認(rèn)并點(diǎn)亮小數(shù)點(diǎn)*/
for(g=0;g<20;g++){DATA[g]=10;}
delay(500); /*同時(shí)DATA數(shù)組中全部寫(xiě)入10*/
while(1)
{
if(P3_4==0){delay(10); /*按下UP鍵數(shù)碼管作0~9遞增顯示*/
if(P3_4==0);{m++;if(m==10)m=0;P1=DATA_7SEG[m];delay(300);}
}
P1=DATA_7SEG[m];delay(1); /*若不按UP鍵數(shù)碼管也作0~9顯示*/
if(P3_5==0)
{delay(10);
if(P3_5==0) /*按下OK鍵顯示的數(shù)據(jù)(號(hào)碼)存入數(shù)組DATA中*/
{DATA[data_flag]=m;data_flag++;P1=0x7f;delay(500);}
} /按下OK鍵超過(guò)2s則退出向數(shù)組DATA送入號(hào)碼*/
if(P3_5==0){delay(2000);if(P3_5==0)break;}
}
}
}
F1:if(P3_5==0){delay(10);if(P3_5==0){P1=0xb6;delay(1);goto F1;}}
/********************************************************************/
/*--主函數(shù)--*/
void main()
{
int_timer(); /*定時(shí)器T0初始化*/
EA=1;EX0=1; /*開(kāi)總中斷,開(kāi)外中斷0*/
p3_0=0; /*關(guān)閉線路(掛機(jī))*/
p3_1=0;
while(1) /*無(wú)限循環(huán)*/
{
switch(set) /*根據(jù)Set標(biāo)志散轉(zhuǎn)*/
{
case 0:stop();break; /*關(guān)機(jī)*/
case 1:work();break; /*警戒工作*/
case 3:in_time2();break; /*輸入時(shí)間t1*/
case 4:in_data();break;
}
if(flag!=0x55)
{p1=0x86;delay(1);}
}
}
(2) 時(shí)鐘計(jì)時(shí)器程序
/**************************************************************/
// 采用6位LED動(dòng)態(tài)掃描時(shí)鐘演示程序
// 使用Keil C51
// 2004.03.31
/*************************************************************/
/*使用AT89S52單片機(jī),12MHZ晶振,P0口輸出段碼,P2口作列掃描,用共陽(yáng)LED數(shù)碼管*/
//key0為調(diào)時(shí)位選用,key1為加1鍵,key2為減1鍵
#include "reg51.h"
#define char unsigned char
//
char code dis_7[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};
/*共陽(yáng)LED段碼表"0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮"*/
char code scan_con[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //列掃描控制字
char data timedata[6]={0x00,0x00,0x00,0x00,0x00,0x00}; //計(jì)時(shí)單元數(shù)據(jù)初值,共6個(gè)
char data dis[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,}; //顯示單元數(shù)據(jù),共6個(gè)數(shù)據(jù)
char data con1s=0x00,con04s=0x00,con=0x00; //秒定時(shí)用
sbit key0=P1^0;
sbit key1=P1^1;
sbit key2=P1^2;
//
/************/
//1ms延時(shí)函數(shù)//
/***********/
dalaylms(int t)
{
int i,j;
for(i=0;i
收藏