多功能數字時鐘設計資料
多功能數字時鐘設計資料,多功能,數字,時鐘,設計,資料
一 摘要單片計算機即單片微型計算機。(Single-Chip Microcomputer ),是 集CPU ,RAM ,ROM ,定時,計數和多種接口于一體的微控制器。他體積小,成本低,功能強,廣泛應用于智能產品和工業(yè)自動化上。而51 單片機是各單片機中最為典型和最有代表性的一種。這次畢業(yè)設計通過對它的學習,應用,從而達到學習、設計、開發(fā)軟、硬的能力。二 說明系統(tǒng)由AT89C51、LED 數碼管、按鍵、發(fā)光二極管等部分構成,能實現時間的調整、定時時間的設定,輸出等功能。系統(tǒng)的功能選擇由SB0、SB1、SB2、SB3、SB4 完成。其中SB0為時間校對,定時器調整功能鍵,按SB 0 進入調整狀態(tài)。SB1 為功能切換鍵。第一輪按動SB1 依次進入一路、二路、三路定時時間設置提示程序,按SB3 進入各路定時調整狀態(tài)。定時時間到,二極管發(fā)亮。到了關斷時間后滅掉。如果不進入繼續(xù)按SB1 鍵,依次進入時間 年 位校對、 月 位校對、 日 位校對、 時 位校對、 分 位校對、 秒 位校對狀態(tài)。不管是進入那種狀態(tài),按動SB2 皆可以使被調整位進行不進位增量加1 變化。各預置量設置完成后,系統(tǒng)將所有的設置存入RAM 中,按SB1 退出調整狀態(tài)。上電后,系統(tǒng)自動進入計時狀態(tài),起始于 00 時 00 分。SB4 為年月日顯示轉換鍵,可使原來顯示時分秒轉換顯示年月日。三、電路原理分析1. 顯示原理電原理圖見附圖1。由6 個共陰極的數碼管組成時、分、秒的顯示。P0 口的8 條數據線P0.0 至P0.7 分別與兩個CD4511 譯碼的ABCD 口相接,P2 口的 P2.0 至P2.2 分別通過電阻R10 至R13 與VT1 至VT3 的基極相連接。這樣通過P0 口送出一個存儲單元的高位、低位BCD顯示代碼,通過P2 口送出掃描選通代碼輪流點亮LED1 至LED6,就會將要顯示的數據在數碼管中顯示出來。從P0 口輸出的代碼是BCD 碼,從P2 口輸出的就是位選碼。這是掃描顯示原理。2 鍵盤及讀數原理鍵盤是人與微機打交道的主要設備,按鍵的讀取容易引起誤動作??刹捎密浖ザ秳拥姆椒ㄌ幚?,軟件的觸點在閉合和斷開的時候會產生抖動,這時觸點的邏輯電平是不穩(wěn)定的,如不采取妥善處理的話,將引起按鍵命令錯誤或重復執(zhí)行,在這里采用軟件延時的方法來避開抖動,延時時間20ms.3 連擊功能的實現按下某鍵時,對應的功能鍵解釋程序得到執(zhí)行,如操作者沒有釋放按鍵,則對應的功能會反復執(zhí)行,好象連續(xù)執(zhí)行,在這里我們采用軟件延時250ms,當按鍵沒釋放則執(zhí)行下一條對應程序。利用連擊功能,能實現快速調時操作。四、程序設計思想和相關指令介紹本系統(tǒng)的主程序主要完成時間顯示和定時輸出判斷功能。而年月日顯示和各時間單元進位,時間設定時,調定時間設定時等功能全部在中斷服務程序中完成。1數據與代碼轉換。由前述可知,從P2 口輸出位選碼,從P0 口輸出段選碼,LED 就會顯示出數字來。但P0口的輸出的數據是要BCD 碼,各存儲單元存儲的是二進制數,也就是和要顯示出的字符表達的含義是不一致的??梢?,將要顯示的存儲單元的數據直接送到P0 口去驅動LED 數碼管顯示是不能正確表達的,必須在系統(tǒng)內部將要顯示的數據經過BCD 碼行轉換后,將各個單元數據的段選代碼送入P0 口,給CD4511 譯碼后去驅動數碼管顯示。具體轉換過程如下:我們先將要顯示的數據裝入累加器A 中,再將A 中的數據轉換成高低兩位的BCD 碼,再放回A 中,然后將A 中的值輸出。如:有一個單元存儲了45 這樣一位數,則需轉換成四位的BCD 碼:(0100)(0101)然后放入A 中。 A 中BCD 碼,高位四位代表4低四位代表5同時送給兩個譯碼器中,譯碼后 45 字就在兩個LED 中顯示出來。2計時功能的實現與中斷服務程序時間的運行依靠定時中斷子程序對時鐘單元數值進位調整來實現的。計數器T0 打開后,進入計時,滿100 毫秒后,重裝定時。中斷一次,滿一秒后秒進位,滿60 秒后即為1 分鐘,分鐘單元進位,60 分到了后,時單元進位,24 小時滿后,天單元進位。這樣然后根據進率,得到年、月、日、時、分、秒存儲單元的值,并經譯碼后,通過掃描程序送LED 中顯示出來,實現時鐘計時功能。累加是用指令INC 來實現的。進入中斷服務程序以后,執(zhí)行PUSH PSW 和PUSH A 將程序狀態(tài)寄存器PSW 的內容和累加器A 中的數據保存起來,這便是所謂的 保護現場 . 以保護現場和恢復現場時存取關鍵數據的存儲區(qū)叫做堆棧。在軟件的控制之下,堆??稍谄瑑萊AM 中的任一區(qū)間設定,而堆棧的數據存取與一般的RAM 存取又有區(qū)別,對它的操作,要遵循 后進先出 的原則。3 時間控制功能與比較指令系統(tǒng)的另一功能就是實現對執(zhí)行設備的定時開關控制,其主要控制思想是這樣的:先將執(zhí)行設備開啟的時間和關閉時間置入RAM 某一單元,在計時主程序當中執(zhí)行幾條比較指令,如果當前計時時間與執(zhí)行設備的設定開啟時間相等,就執(zhí)行一條 CLR 指令,將對應的那路P3 置為高電位,開啟;如果當前計時時間與執(zhí)行設備設定的關閉時間相等,就執(zhí)行SETB對應的P3 置低電位,二極管截止,。實現此控制功能用到的比較指令為CJNE A,#direct,rel,其轉移條件是累加器A 中的值與立即數不等則轉移。參考文獻1、 謝自美,電子線路設計、實驗、測試 武漢:華中理工大學出版社,20002、 何書森、何華斌實用數字電路原理與設計速成福州:福建科學技術出版社,2000.63、 白駒衍, 單片計算機及應用北京:電子工業(yè)出版社, 1999.2五:程序SEC EQU 32H ;秒 即時時間 偽指令MIN EQU 31H ;分HOUR EQU 30H ;時DAY EQU 35H ;日MON EQU 34H ;月YEAR EQU 33H ;年MIN_1 EQU 41H ;分 定時器1 路、開存儲單元HOUR_1 EQU 42H ;時DAY_1 EQU 43H ;MON_1 EQU 44H ;YEAR_1 EQU 45H ;MIN_11 EQU 40H ;分 定時器1 路、關存儲單元HOUR_11 EQU 46H ;時DAY_11 EQU 47H ;日MON_11 EQU 48H ;月YEAR_11 EQU 49H ;年;*ORG 0000Hljmp MAINORG 0003H ;中斷轉換顯示年月日、INT0(SB4 鍵)LJMP SHOWORG 000BH ;計數中斷 T0、方式1LJMP TIMEORG 0013HLJMP CHANGE; 調整時間、定時、INT1(SB0 鍵);-主程序ORG 0030HMAIN:;-初始化付值MOV YEAR , #02MOV MON , #05MOV DAY , #01MOV HOUR , #00MOV MIN , #00MOV SEC , #00CLR 40H ;定時單元1 路清零CLR 41HCLR 42HCLR 43HCLR 44HCLR 45HCLR 46HCLR 47HCLR 48HCLR 49H;-開中斷MOV TMOD , #01H ;計數、模式1、T0MOV TL0, #0B0H ;100SM 計數定時MOV TH0, #3CH ;clr p3.0MOV 20H, #0AH ;10 次*100SMSETB PT0 ;T0 為最高級SETB TR0 ;允許計數SETB ET0 ;允許T0 中斷SETB EX0 ;允許INT0 中斷SETB EX1 ;允許INT1 中斷SETB EA ;開總中斷;-顯示、定時器啟動判斷LOOP:MOV R1, #30H; 存儲單元MOV R4, #01H; 位選通MOV R3, #03H; 三組顯示NEXT:MOV A , R1 ;MOV B , #10 ;將存儲單元轉換成兩高低兩組的BCD 碼DIV ABSWAP AORL A, BMOV P0, A;輸出MOV P2, R4INC R1 ;下一單元MOV A, R4 ;RL A ;位移MOV R4, ALCALL DE5SM ;延時0.5SMDJNZ R3, NEXT ;全掃描顯示一偏;-判斷定時輸出(只編寫了一路)CJNE R7, #88H,LOOP ;是8 則開,否則、定時已關、轉;-開MOV A, YEARCJNE A, YEAR_1, LOOP_1;年比較,不等轉關MOV A, MONCJNE A, MON_1, LOOP_1MOV A, DAYCJNE A , DAY_1,LOOP_1MOV A, HOURCJNE A, HOUR_1,LOOP_1MOV A, MINCJNE A, MIN_1, LOOP_1CPL P3.0;-關LOOP_1:MOV A, YEARCJNE A, YEAR_11, LOOP;年比較MOV A, MONCJNE A, MON_11, LOOPMOV A, DAYCJNE A , DAY_11,LOOPMOV A, HOURCJNE A, HOUR_11,LOOPMOV A, MINCJNE A, MIN_11, LOOPCPL P3.0LJMP LOOP;-年月日顯示中斷子程序SHOW:PUSH PSWpush ACCPUSH BPUSH 01HPUSH 02HPUSH 03HPUSH 04HMOV R2, #0FFH ;中斷掃描次數TURN: MOV R1 , #33HMOV R4 , #01HMOV R3 , #03HNEXT_1:MOV A, R1MOV B , #10DIV ABSWAP AORL A, BMOV P0, AMOV P2, R4INC R1RL AMOV R4 ,ALCALL DE5SMDJNZ R3, NEXT_1DJNZ R2, TURN ;反復顯示一定時間后返回POP 04HPOP 03HPOP 02HPOP 01HPOP BPOP ACCPOP PSWRETI;-計數中斷服務子程序TIME:PUSH PSWPUSH ACCPUSH BPUSH 06HMOV TH0 , #3CH;重裝計數MOV TL0 , #0BH;DJNZ 20H, OUT ;轉到中斷跳出pop 程序MOV 20H, #0AH ; 重裝:100*10=1000;-進位程序INC SECMOV R6, SEC ;CJNE R6, #60, OUT;比較MOV SEC , #00 ;INC MINMOV R6, MINCJNE R6, #60, OUTMOV MIN , #00INC HOURMOV R6 , HOURCJNE R6 , #25 , OUTMOV HOUR ,#00INC DAYMOV R5, MONCJNE R5, #1, MON_22;是否1 月、不是轉2 月MOV R5, DAYCJNE R5, #32, OUT ; 本月是否益出INC MONMOV DAY,#1LJMP OUTOUT:POP 06HPOP BPOP ACCPOP PSWRETIMON_22:MOV R5, MONCJNE R5 , #2 , MON_33;是否2 月、不是轉3 月MOV A, YEAR ;判斷是否瑞年MOV B, #4DIV ABMOV A , BJNZ OUT_1;不是則轉(A 不為零則轉)MOV R5 ,DAYCJNE R5,#30, OUT;如是瑞年、判斷是否到29 天INC MONMOV DAY ,#1LJMP OUTOUT_1:MOV R5, DAYCJNE R5, #29, OUT ;平年二月判斷INC MONMOV DAY , #1LJMP OUTMON_33:MOV R5, MONCJNE R5, #3 , MON_44MOV R5, DAYCJNE R5 , #32, OUTINC MONMOV DAY , #1LJMP OUTMON_44:MOV R5, MONCJNE R5,#4, MON_55MOV R5, DAYCJNE R5 ,#31,OUTINC MONMOV DAY , #1LJMP OUTMON_55:MOV R5,MONCJNE R5,#5, MON_66MOV R5,DAYCJNE R5,#32,OUTINC MONMOV DAY,#1LJMP OUTMON_66:MOV R5, MONCJNE R5,#6, MON_77MOV R5, DAYCJNE R5 ,#31,OUTINC MONMOV DAY , #1LJMP OUTMON_77:MOV R5, MONCJNE R5,#7, MON_88MOV R5, DAYCJNE R5,#32,L1INC MONMOV DAY , #1L1: LJMP OUTMON_88:MOV R5, MONCJNE R5,#8, MON_99MOV R5, DAYCJNE R5 ,#32,L2INC MONMOV DAY , #1L2: LJMP OUTMON_99:MOV R5, MONCJNE R5,#9, MON_00MOV R5,DAYCJNE R5 ,#31,L3INC MONMOV DAY , #1L3: LJMP OUTMON_00:MOV R5, MONCJNE R5,#10, MON_AAMOV R5, DAYCJNE R5 ,#32,L4INC MONMOV DAY , #1L4: LJMP OUTMON_AA:MOV R5, MONCJNE R5,#11, MON_BBMOV R5,DAYCJNE R5,#31,L5INC MONMOV DAY , #1L5: LJMP OUTMON_BB:MOV R5, DAYCJNE R5 ,#32,L6INC YEARMOV MON, #1MOV DAY , #1L6:LJMP OUT;-按SB2定時器年單元加1 子程序SB3_2: LJMP SHOW_2 ;二路沒編返回SB3_3: LJMP SHOW_3 ;三路沒編返回SB3_1:MOV A , YEAR_1 ; 調時年單元MOV B ,#10DIV ABSWAP AORL A,BMOV P0, AMOV P2, #01HLCALL READLCALL DE250SMCJNE A, 01H, SB3_1CJNE A, #0FBH, KEY2_7 ;按SB2 轉年調整LJMP MON_111 ;按SB1 往下調月單元KEY2_7:CJNE A, #0FDH, SB3_1INC YEAR_1 ; 1 路年單元加1MOV R5,YEAR_1CJNE R5,#09,SB3_1 ;益出MOV YEAR_1, #00HAJMP SB3_1 ;-月單元加1 子程序MON_111:MOV A , MON_1 ; 調時月單元顯示MOV B ,#10DIV ABSWAP AORL A,BMOV P0, AMOV P2, #02HLCALL READLCALL DE250SMCJNE A, 01H, MON_111CJNE A, #0FBH, KEY2_8 ;按SB2 轉月調整LJMP DAY_111KEY2_8:CJNE A,#0FDH,MON_111INC MON_1 ;1 路月單元加1MOV R5,MON_1CJNE R5,#13,MON_111;益出MOV MON_1, #01HAJMP MON_111 ; 轉到月顯;_-日單元加1 子程序DAY_111:MOV A , DAY_1 ; 調時日單元顯示提示MOV B ,#10DIV ABSWAP AORL A,BMOV P0, AMOV P2, #04HLCALL READLCALL DE250SMCJNE A, 01H,DAY_111CJNE A, #0FBH, KEY2_9 ;按SB2 轉日調整LJMP HOUR_111KEY2_9: CJNE A,#0FDH,DAY_111INC DAY_1 ;1 組日單元加1MOV R5, DAY_1CJNE R5,#32,DAY_111;益出MOV DAY_1, #01HAJMP DAY_111 ; 轉到日顯;-按SB2 時單元加1 子程序HOUR_111:MOV A , HOUR_1 ; 調時時單元顯示提示MOV B ,#10DIV ABSWAP AORL A,BMOV P0, AMOV P2, #01HLCALL READLCALL DE250SMCJNE A, 01H,HOUR_111CJNE A, #0FBH, KEY2_10 ; 按SB2 轉時調整LJMP MIN_111KEY2_10:CJNE A,#0FDH,HOUR_111INC HOUR_1MOV R5,HOUR_1CJNE R5,#24,HOUR_111;益出MOV HOUR_1, #00HAJMP HOUR_111 ; 轉到時顯;-分單元加1 子程序MIN_111:MOV A , MIN_1 ; 調時分單元、并顯示提示MOV B ,#10DIV ABSWAP AORL A,BMOV P0, AMOV P2, #02HLCALL READLCALL DE250SMCJNE A, 01H,MIN_111CJNE A, #0FBH, KEY2_11 ;按SB2 轉分調整AJMP OFF_CH ;按SB3 往下調定時:關單元KEY2_11: CJNE A, #0FDH, MIN_111INC MIN_1 ;1 路分單元加1MOV R5, MIN_1CJNE R5,#60,MIN_111;益處MOV MIN_1, #00HAJMP MIN_111 ; 轉到分顯年單元調整OFF_CH: MOV A , YEAR_11 ; 調時年單元MOV B ,#10DIV ABSWAP AORL A,BMOV P0, AMOV P2, #01HLCALL READLCALL DE250SMCJNE A, 01H, OFF_CHCJNE A, #0FBH, KEY2_F7 ;按SB2 轉年調整LJMP MON_OFF ;按SB1 往下調月單元KEY2_F7:CJNE A, #0FDH, OFF_CHINC YEAR_11 ; 1 路年單元加1MOV R5,YEAR_11CJNE R5,#09,OFF_CH ;益出MOV YEAR_11, #00HAJMP OFF_CH ;-月單元加1 子程序MON_OFF:MOV A , MON_11 ; 調時月單元顯示MOV B ,#10DIV ABSWAP AORL A,BMOV P0, AMOV P2, #02HLCALL READLCALL DE250SMCJNE A, 01H, MON_OFFCJNE A, #0FBH, KEY2_F8 ;按SB2 轉月調整LJMP DAY_OFFKEY2_F8:CJNE A,#0FDH,MON_OFFINC MON_11 ;1 路月單元加1MOV R5,MON_11CJNE R5,#13,MON_OFF;益出MOV MON_11, #01HAJMP MON_OFF ; 轉到月顯;_-日單元加1 子程序DAY_OFF:MOV A , DAY_11 ; 調時日單元顯示提示MOV B ,#10DIV ABSWAP AORL A,BMOV P0, AMOV P2, #04HLCALL READLCALL DE250SMCJNE A, 01H,DAY_OFFCJNE A, #0FBH, KEY2_F9 ;按SB2 轉日調整LJMP HOUR_OFFKEY2_F9: CJNE A,#0FDH,DAY_OFFINC DAY_11 ;1 組日單元加1MOV R5, DAY_11CJNE R5,#32,DAY_OFF;益出MOV DAY_11, #01HAJMP DAY_OFF ; 轉到日顯;-按SB2 時單元加1 子程序HOUR_OFF:MOV A , HOUR_11 ; 調時時單元顯示提示MOV B ,#10DIV ABSWAP AORL A,BMOV P0, AMOV P2, #01HLCALL READLCALL DE250SMCJNE A, 01H,HOUR_OFFCJNE A, #0FBH, KEY2_F10 ; 按SB2 轉時調整LJMP MIN_OFFKEY2_F10:CJNE A,#0FDH,HOUR_OFFINC HOUR_11MOV R5,HOUR_11CJNE R5,#24,HOUR_OFF;益出MOV HOUR_11, #00HAJMP HOUR_OFF ; 轉到時顯;-分單元加1 子程序MIN_OFF:MOV A , MIN_11 ; 調時分單元、并顯示提示MOV B ,#10DIV ABSWAP AORL A,BMOV P0, AMOV P2, #02HLCALL READLCALL DE250SMCJNE A, 01H,MIN_OFFCJNE A, #0FBH, KEY2_F11 ;按SB2 轉分調整LJMP ON_1 ;按SB3 往下調定時:開與關KEY2_F11: CJNE A, #0FDH, MIN_OFFINC MIN_11 ;1 路分單元加1MOV R5, MIN_11CJNE R5,#60,MIN_OFF;益處MOV MIN_11, #00HLJMP MIN_OFF ; 轉到分顯;-開、關定時ON_1:CJNE A, #0FBH, MIN_OFFK1: MOV A, #88HMOV R7, AMOV P0, AMOV P2, #0FFH;三組都顯示開LCALL READLCALL DE250SMCJNE A, 01H, ON_1;去抖后比較CJNE A, #0FBH,KEY2_12 ;按SB2 轉關LJMP OUT_A ;按SB3 調出、處于開狀態(tài)KEY2_12: CJNE A, #0FDH, K1k2: MOV A, #00H; 顯示0 關MOV R7, AMOV P0, AMOV P2, #0FFH;LCALL READLCALL DE250SMCJNE A, 01H, K2;去抖后比較CJNE A, #0FBH,KEY2_13 ;按SB2 轉開LJMP OUT_A ;SB3 調出、處關狀態(tài)KEY2_13:CJNE A, #0FDH, K2 ; 比較按了沒LJMP K1 ; 按了SB2、轉開OUT_A:POP 00HPOP BPOP ACCPOP PSWRETI;_-讀取按鍵程序READ:MOV A , P1;讀取按鍵MOV R1, ALCALL DE10MSMOV A, P1RET;_-延時程序DE5SM:PUSH 01HMOV R1, #0FFHDJNZ R1,$POP 01HRETDE10MS: PUSH 04HPUSH 05HMOV R4, #0AHDl1: MOV R5, #0FFHdl2: DJNZ R5,$DJNZ R4,dl1POP 05HPOP 04HRETDE250SM:PUSH 02HPUSH 00HMOV R0, #0FFHDEL:MOV R2, #0FFHDJNZ R2,$DJNZ R0, DELPOP 00HPOP 02HRET;_-調整時間進位程序MIN_AD:INC MINMOV R6, MINCJNE R6, #60, OU1MOV MIN , #00OU1: RETHOUR_AD:INC HOURMOV R6 , HOURCJNE R6 , #25 , OU2MOV HOUR ,#00OU2: RETDAY_AD:INC DAYMOV R6, DAYCJNE R6 , #32, OU3 ; 是否益出MOV DAY ,#01HOU3: RETMON_AD:INC MONMOV R6, MONCJNE R6, #13, OU4 ; 是否益出MOV MON ,#01HOU4: RETYEAR_AD:INC YEARMOV R6, YEARCJNE R6, #09, OU5;是否益出MOV YEAR ,#00HOU5: RETEND 六:附錄實驗設計電路圖1流程圖1:實驗主程序流程圖流程圖2:定時中斷程序流程圖流程圖3:調時功能流程圖七:實驗心得學了兩周的課程設計,有很多的心得體會,有關于單片機方面的,更多的是關于人與人之間關系方面的。在這期間,我得到了很多同學的幫助。我本人對單片機也并不是很熟悉,學的東西好像它是它,我是我似的,理論聯系不了實際。以前的匯編語言沒學好,一開始的程序這塊兒就要令我束手無策了。后來請教我們班的一個男生,每次跟他一起到試驗室調試程序,看他邊做邊給我講解。最后在計算機上調試成功,后來自己又抽空做了些拓展,完成了本程序。后來,我發(fā)現自己對單片機也有了很大興趣,想暑假回家以后自己去買一些東西來做,再補一補匯編語言。最后說明自己對這門課程的感受,課堂教學考慮到大多數同學的需求,主要強調“基本”基本知識、基本理論、基本方法、基本技能。而這次設計正是為我們提供了一個深入學習、探索的機會,成為課堂教學的有益補充。單片機的設計 設計名稱 : 電子時鐘設計班級 : 學號 : 姓名 : 指導教師 : 一 引言2二 硬件系統(tǒng)方案設計22.1電話撥號防盜報警器硬件系統(tǒng)方案22.1.1 硬件系統(tǒng)方案設計22.1.2 脈沖撥號原理32.1.3 脈沖撥號實現過程42.1.4 AT89S2052單片機的功能特點52.2 時鐘計時器的硬件設計方案論證分析82.2.1 功能要求82.2.2 方案論證82.2.3 系統(tǒng)硬件電路設計84.1.2時鐘計時器的硬件電路設計描述9三 系統(tǒng)的軟件設計103.1電話撥號防盜報警器程序設計103.1.1主程序設計113.2 時鐘顯示程序設計123.2.1主函數123.2.2 LED顯示子函數133.2.3 定時器T0中斷函數133.2.4 中斷函數143.2.5 功能函數14四 系統(tǒng)的調試部分154.1 時鐘系統(tǒng)的調試154.1.1 時鐘系統(tǒng)的硬件調試154.1.2 時鐘系統(tǒng)的軟件調試154.1.3 性能分析154.2 撥號報警器功能調試15五 總結16參考文獻17附錄18附錄1 程序清單18附錄2 系統(tǒng)使用說明18附錄3 英文資料18附錄4 系統(tǒng)PCB板圖18附錄1:程序清單19附錄2:系統(tǒng)使用說明36一 引言隨著人們生活水平的不斷提高,大家對住宅和辦公室的安全意識也日益增加。因此,研究和開發(fā)防盜報警裝置引起了科研單位和生產廠家的重視,特別是面對普通居民、價格低、運行可靠的自動報警系統(tǒng)。 長期以來,一些電子雜志介紹的廉價防盜報警均無電話撥號報警功能,而市售的可自動撥號報警的防盜器材又價格高昂。這里介紹的電話撥號防盜報警器可在這兩者之間找到平衡,即兼具高性能和低價位。為了以低成本實現高性能,設計時利用了電信局的交換機支持脈沖撥號方式來實現撥號報警,這樣可利用單片機直接發(fā)出撥號脈沖,精簡了電路,降低了成本。 電話撥號防盜報警器作為家庭防盜報警器材的一員,非常經濟實用。它進入工作警戒后,主控CPU不斷檢查觸發(fā)開關的狀態(tài),當盜賊入室觸發(fā)開關時,立即啟動電話撥號報警程序向主人告警(當然也可以通過修改軟件使其在現場發(fā)出高分貝報警音)。實踐證明,該系統(tǒng)報警快速、準確。由于該系統(tǒng)電路簡單,而且利用的是公共通信網,因此不存在建立的報警系統(tǒng)網絡問題,具有成本低、體積小、能耗極低、體積小、能耗極低且不影響正常打電話等突出優(yōu)點。平時可以作為時鐘計時器來使用,真是一舉兩得。 二 硬件系統(tǒng)方案設計 2.1電話撥號防盜報警器硬件系統(tǒng)方案2.1.1 硬件系統(tǒng)方案設計圖2.1為電話撥號報警器的系統(tǒng)構成方框圖,由單片機控制器、鍵盤輸入、數碼管顯示、觸發(fā)電路、撥號電路及電源等6部分組成。單片機控制器是整個系統(tǒng)的核心,負責控制檢測輸入/輸出顯示、模擬摘機、撥號摘機、撥號報警、掛機等一系列的程序動作。這里使用了小引腳、高性能、低價位的AT89S2052。 鍵盤輸入電路負責輸入電片機中一系列工作參數及功能設定。 發(fā)光二極管數碼管顯示器在整個系統(tǒng)工作過程中充當一個簡單的人機界面,用以顯示工作狀況及輸入/輸出的數據等。 電話撥號防盜報警器的觸發(fā)電路用磁性開關(門磁開關),簡單可靠,也可用紅外探測器或無線門磁,以實現全方位遠距離監(jiān)測。報警器應采用隱蔽安裝,防止小偷發(fā)現。 撥號及報警電路用來完成模擬摘機、撥號、發(fā)出報警音、掛機等工作過程,它的工作由單片機控制。 電源部分負責對整個系統(tǒng)供電。平時由電話線上取得工作電流并對后備電池充電,撥號報警時轉由后備電池供電。鍵盤單片機控制器觸發(fā)開關電源撥號電路顯示模塊 圖2.1 電話撥號防盜報警器方框圖2.1.2 脈沖撥號原理脈沖撥號是目前電話機兩種撥號方式中的一種,另一種為雙音多頻撥號方式。脈沖撥號就是指在電話機上撥入的電話號碼以脈沖個數的形式發(fā)出,也就是說,在已經通以直流電流的回路上,利用撥號盤及發(fā)號電路將回路斷開、再接通而形成的脈沖信號,來完成輸入電話號碼的發(fā)送。在操作中,若用戶撥1,則送出1個脈沖,回路中斷一次、接通一次;撥2,則發(fā)出2個脈沖,回路斷一次、接通一次、再斷一次;而撥0時,則發(fā)出10個脈沖,回路斷、接通輪流10次。圖2.2為電話號碼“32”的脈沖波形。時間號碼字間間隔時間tID號碼2的脈沖號碼3的脈沖斷通 圖2.2 電話號碼“32”的脈沖波形 正常撥號時,電路電流中斷的時間一般在5865ms之間,視斷續(xù)比的不同而不同??焖贀芴枙r,只要取一半時間即可。電路電流接通的時間(即在同一位號碼中的2個斷脈沖之間的接通電流時間)約在3242ms之間,視斷續(xù)比的不同而不同??焖贀芴枙r,只要取一半時間即可。顯然脈沖周期等于脈沖中斷時間和脈沖接通時間之和,每一個周期的時間為100ms左右??焖贀芴枙r,在50ms左右。2位號碼(即2組脈沖串)之間的最小時間間隔,通常為800ms左右;而快速撥號時,其值減半,為400ms左右。我國目前采用的電話脈沖撥號的速率是10PPS(每秒的脈沖數),即每秒發(fā)出10個脈沖,因此上述各參數不存在快速撥號時的值。 為了提高撥號的可靠性及穩(wěn)定性,這里設計時選定更低的脈沖撥號速率:1個脈沖代表播出1,2個脈沖代表撥出2,10個脈沖代表撥出0,每個脈沖的寬度和間隔為100ms。工作時首先進行模擬摘機,然后開始脈沖撥號,撥出1位號碼后停頓500ms(保持接通)再撥下一位,直至全部撥完后再發(fā)報警音,最后掛機。2.1.3 脈沖撥號實現過程圖2.3為脈沖撥號的實現電路。平時電話線上的電壓約為5060V左右。未撥號時電片機的P3.0、P3.1 均輸出低電平。撥號過程如下:單片機的P3.0輸出高電平,使TR1導通,由于電話線路上接入了負載R1,這樣電話線的電壓下降,模擬摘機。單片機的P3.0開始輸出撥號脈沖,使電話線的電壓(電平)也呈高、低變化。1個脈沖代表撥出1,2個脈沖代表撥出2,10個脈沖代表撥出0,每個脈沖的寬度和間隔均為100ms。撥出1位號碼后停頓500ms(保持P3.0高電平)再撥下一位,直至全部撥完。P3.0 保持高電平(保持電話線路接通),P3.1輸出1KHz的報警音脈沖驅動TR2,以2Hz進行調制(即接通1kHz信號0.5s、斷開1kHz信號0.5s),這樣從接聽方的電話中就會聽到“嘟、嘟”的報警聲。報警音的時間根據設計為60s。60后,P3.1輸出低電平,TR2 截止,停止報警。隨后P3.0也輸出低電平,模擬掛機。完成一次報警過程。圖2.3 脈沖撥號實現電路2.1.4 AT89S2052單片機的功能特點電話撥號防盜報警器的核心控制器是單片機AT89S2052。AT89S2052 是美國ATMEL半導體公司生產的一種高性能單片機。該單片機以與MCS-51系列單片機高度兼容、低功耗、可以在接近零頻率下工作等諸多優(yōu)點,而廣泛應用于各類計算機系統(tǒng)、工業(yè)控制、電信設備、消費類產品中。由于ATMEL是全球最大的FLASH和EEPROM生產制造公司之一,加之以其EEPROM技術與INTEL的80C51內核技術交換,使ATMEL擁有了80C51內核的使用權,其生產的AT89系列電片機不僅與80C51有極好的兼容性,而且具有極高的性能價格比。1. AT89S2051的主要性能特點指令與MCS-51完全兼容;內帶2KB可編程閃速存儲器(FLASH MEMORY)可重復擦寫1000次;數據保留10年;工作電壓范圍2.76V;工作頻率024MHZ;兩極程序加密鎖定;128B內部RAM;15條可編程雙向I/O口線;2個16位定時器/計時器;5個中斷源;可編程串行UART通道;輸出口可直接驅動LED;片內含模擬比較器;低功耗的閑置和掉電模式。AT89S2052是AT89 系列電片機種的一種精簡產品。它是將TA89C52的P0口、P2口、EA/Vpp、ALE/PROG、PSEN口線省去后,形成的一種僅20個引腳的單片機,相當于早期INTEL8031的最小應用系統(tǒng)。這對于一些不太復雜的控制場合,僅用一片AT89S2052就足夠了,是真正意義上的“單片機”。 由于將多功能8位CPU和2KB的閃速存儲器集成在單個芯片中,使其成為一種高效的微控制器。AT89S2052的出現為很多規(guī)模不太大的嵌入式控制系統(tǒng)提供了一種極佳的選擇方案,使傳統(tǒng)的51系列單片機的體積大、功耗大、可選模式少等諸多困擾設計工程師們的致命弱點不復存在。2. 引腳功能介紹AT89S2052引腳外形如圖所示。Vcc:電源端。GND:接地。P1 口(P1.0P1.7):是一個8位雙向I/O口,其中P1.2至P1.7提供內部上拉電阻,P1.0和P1.1需外接上拉電阻。P1.0和P1.1也可作為片內精確模擬比較器的正向輸入(AINO)和反向輸入(AINI)。P1口輸出緩沖器能提供20mA的灌電流,可直接驅動LED。P1口寫入“1”后可用作輸入。P3口:引腳P3.0至P3.7(P3.5除外)是7個帶內部上拉電阻的雙向I/O口線。原P3.6不能使用,已連接片內比較器輸出端。與P1口相同,P3口也能提供20mA的灌電流,并可直接驅動LED顯示器。與80C51相同,P3口也有第2功能,P3.0作為串行數據接收RXD;P3.1作為串行數據發(fā)送TXD;P3.2為外部中斷0申請INT0;P3.3 為外部中斷1申請INT1;P3.4 為定時器/計時器0輸入;P3.5位定時器/計數器1輸入;P3.7無第2功能RD。RST:復制輸入。要使芯片可靠復位,要保持RST引腳2個機器周期的高電平。XTAL1:反向振蕩放大的輸入及內部時鐘電路的殊榮。XTAL2:來自反向振蕩放大器的輸出。3. 特殊功能寄存器(SFR)與80C51完全相同4. 程序存儲器鎖定AT89S2052片內有2個鎖定位,可以不編程(U),也可以編程(P),以獲得一些附加的特性,如表2.1所示。 表2.1 程序存儲器鎖定編程鎖定位LB1LB2保護模式1UU沒有編程鎖定特性2PU禁止對閃速存儲器進一步編程3PP同模式2,同時禁止校驗 5、閑置模式 在閑置模式下,CPU自身處于休眠狀態(tài),而片內所有其他外圍設備保持工作狀態(tài)。該模式是軟件生成的。在該模式期間,片內RAM和所有特殊功能寄存器的內容保持不變。閑置模式可以允許由中斷或硬件復位終止。如果不采用外部上拉,P1.0和P1.1應置0;如果采用外部上拉,則置1。應注意的是,當閑置模式被硬件復位中止時,器件要從閑置處恢復程序的執(zhí)行,執(zhí)行2個機器周期后,內部復位算法才起作用。此時,硬件禁止訪問內部RAM,但允許訪問端口引腳。為了排除閑置被復位中止時對端口意外寫入的可能性,跟在生成閑置模式后的指令不應是對端口引腳的讀/寫操作。6.掉電模式 在掉電模式下,振蕩器停止工作,生成掉電狀態(tài)的指令是最后執(zhí)行的一條指令。片內RAM和特殊功能寄存器保持其值不變直到掉電模式終止。從掉電模式退出的唯一辦法是硬件復位。復位將重新定義特殊功能寄存器(SFR),但不會影響片內RAM。在Vcc沒有恢復到其正常工作電壓之前,不應進行復位,且復位的保持時間應足夠長,使振蕩器能重新開始工作并穩(wěn)定下來。同樣,如果不采用外部下拉,P1.0和P1.1應置0,如果采用外部上拉,則置1。2.2 時鐘計時器的硬件設計方案論證分析2.2.1 功能要求時鐘計時器要求用六位LED數碼管顯示時、分、秒、以二十四小時方式運行,使用按鍵開關實現時,分調整功能。2.2.2 方案論證為實現LED顯示器的數字顯示,可以采用靜態(tài)顯示法和動態(tài)顯示法。由于靜態(tài)顯示法需要數據鎖存器等硬件,接口復雜一些,考慮到時鐘顯示只有六位,且系統(tǒng)沒有其它復雜的處理任務,所以決定用動態(tài)掃描實現LED顯示。單片機采用易購的AT89S52系列,這種單片機可具有足夠的空余硬件資源,以實現其它的擴充功能。若使用電池供電,可采用低電壓的LV系列單片機時鐘計時器電路系統(tǒng)的總體設計框架如圖3.1所示。單片機控制器AT89S526位LED顯示器列驅動 圖3.1 硬件系統(tǒng)的總體設計框架2.2.3 系統(tǒng)硬件電路設計電話撥號防盜報警器的硬件電路設計描述為了發(fā)揮電片機強大的計算、控制能力,充分發(fā)揮軟件的優(yōu)勢,這里極大地簡化了電路,但可實現以前需要幾片甚至十幾片小規(guī)模數字電路才能完成的任務。電路原理如圖所示,共有4個按鍵,即rst、ok、up、set。rst:系統(tǒng)復位鍵。ok:輸入數據確認鍵。up:顯示的數字增加鍵。set:工作模式設定鍵,可設定管機、工作、輸入時間t1、輸入時間t2及輸入電話號碼5種模式。 磁性開關即為裝于門或窗口的防盜感應開關,門關閉時常開,門打開時閉合接通。當然也可改用其他的感應器件,如激光探測、超聲波感應、熱釋電感應、主動紅外線探測或無線門磁等,以實現全方位遠距離檢測。為了防止磁性開關離控制器較遠而產生引入干擾,使用了光耦作信號傳遞,效果良好。LED數碼管用于工作狀態(tài)指示或輸入數據指示。L1、L2接電話線,ZND為擊穿電壓120V的壓敏二極管,防止電路受雷電干擾。平時系統(tǒng)處于低功耗待機狀態(tài)(此時耗電僅2mA左右),由電話線上取電工作,并對3.6V/60mA鎳鉻電池充電,當輸入數據進行設定或進行撥號報警時,耗電會達到10mA,這時主要由鎳鉻電池供電。由于有鎳鉻電池后備供電,即使電話線斷電也不會使已輸入的數據丟失。該機除用于防盜報警外,若對軟件進行一些修改,也可通過電話線進行遠程數據傳遞。三極管T1、T2及電阻R1、R2構成撥號及報警電路,其工作原理前面已作詳細介紹。4.1.2時鐘計時器的硬件電路設計描述時鐘計時器的硬件電路,采用AT89S52單片機最小化應用設計,顯示采用共陽七段LED顯示器,P0口輸出段數碼數據,P2.0P2.5口作列掃描輸出,P1.0,P1.1和P1.2口接三個按鈕開關用以實現調時,調分功能.為了提供共陽LED數碼管的驅動電壓,用三極管8550作電源驅動輸出。采用12MHZ晶振有利于提高秒計時的精確性。硬件電路圖如圖3.2示。 圖3.2 具有時鐘功能的電話報警器原理圖 三 系統(tǒng)的軟件設計3.1電話撥號防盜報警器程序設計3.1.1主程序設計 主程序的工作過程為:先進行初始化工作,隨后根據輸入的鍵值分別散轉輸入的鍵值分別散轉至對應的子程序(管機、警戒工作、輸入時間t1、輸入時間t2、輸入電話號碼)循環(huán)工作。T0為100ms定時中斷服務子程序,它實現精確的撥號脈沖時序。INT0外中斷服務子函數用于實現功能選擇;而INT1外中斷服務子函數則檢測防盜觸發(fā)開關的狀態(tài)。 主程序狀態(tài)流程圖如圖3.6所示。INT0外中斷服務子函數狀態(tài)流程圖及INT1外中斷服務子函數的狀態(tài)流程圖分別如圖3.7、圖3.8所示。開始 定時器T0初始化 關閉撥號、報警線路輸入號碼 輸入t2輸入t1 工作 根據set鍵值散轉關 機 圖3.6 主程序狀態(tài)流程 - 40 -INT0外中斷服務子函數開始如set鍵按下,則set鍵值加1如鍵值大于5,則鍵值回0系統(tǒng)進入低功耗待機狀態(tài)INT0外中斷服務子函數結束圖3.7 INT0外中斷服務子函數狀態(tài)流程INT1外中斷服務子函數結束查詢門控開關共10次INT1外中斷服務子函數開始圖3.8 INT1外中斷服務子函數結束3.2 時鐘顯示程序設計3.2.1主函數 本設計中計時采用定時器T0中斷完成,其余狀態(tài)循環(huán)調用顯示子函數及鍵掃描子函數,當端口開關按下時,轉入相應調時功能。其主函數執(zhí)行流程如圖3.3所示。開 始顯示單元清0T0、T1設為16位計數器模式允許T0中斷N調用顯示子函數鍵按下?進入調時功能圖3.3 主函數流程圖3.2.2 LED顯示子函數 數碼管顯示的數據存放在內存單元dis0dis5中,其中dis0dis1存放秒數據,dis2dis3存放分數據,dis4dis5存放時數據,每一單元內均為十進制BCD碼。由于采用軟件動態(tài)掃描實現數據顯示功能,顯示用的十進制BCD碼數據的對應段碼存放在ROM表(dis711)中,顯示時,先取出dis0dis5中的某一數據,然后查得對應得顯示段碼從P0口輸出,P2口將對應得數碼管選中供電,就能顯示該地址單元的數據值。3.2.3 定時器T0中斷函數 定時器T0用于時間計時。定時溢出中斷周期可設為50ms,中斷進入后先判斷,中斷計時累計20次(即1ms)時對妙計數單元進行加1操作。時鐘計數單元在 義的6個單元(timedata6)中。timedata0timedata1存放秒數據,timedata2timedata3存放分數據,timedata4timedata5存放時數據。最大計時值為23小時59分59秒。在計數單元中采用十進制BCD碼計數,秒,分、時之間滿60進位。T0中斷服務程序執(zhí)行流程如圖3.4所示。T0中斷 保護現場 1s到?加1處理 恢復現場,中斷返回圖3.4 T0 中斷函數3.2.4 中斷函數 T1中斷服務程序用于指示調整數字單元的亮閃,在時間調整狀態(tài)下,每過0.4s,將對應單元的顯示數據換成“熄滅符”數據(0x0a)。這樣,在調整時間時,對應調整單元的顯示數據會間隔閃亮。3.2.5 功能函數 調時功能函數的設計方法是:按下T0鍵,進入調分狀態(tài),時鐘停止走動;按T1或T2鍵可進行加1或減1操作 ;繼續(xù)按T0鍵可分別進行分十位、時個位和時十位調整;最后按T0建將退出調整狀態(tài),時鐘開始計時運行。 四 系統(tǒng)的調試部分4.1 時鐘系統(tǒng)的調試4.1.1 時鐘系統(tǒng)的硬件調試硬件調試時可先檢查印制板及焊接的質量情況,在檢查無誤后可通電檢查LED顯示器的點亮狀況。若亮度不理想,可以調整P0口的電阻大小,一般情況下取200歐姆電阻即可獲得滿意的亮度效果。4.1.2 時鐘系統(tǒng)的軟件調試軟件調試Keil C51編譯器,源程序編譯及仿真調試應分段或以子函數為單位一個個地進行,最后可結合硬件實時運行調試。4.1.3 性能分析按照設計程序分析,LED顯示器動態(tài)掃描頻率約為167Hz,實際使用觀察時完全沒有閃爍,實際計時時精度較高,可滿足一般場合的應用需要。 4.2 撥號報警器功能調試通電前應檢查焊接質量,確認無短路、虛焊等故障。將撥碼開關J2指向下側,即斷開3.6V鎳鉻電池與系統(tǒng)的連接。將外部直流可調穩(wěn)壓電源調整為3.6V。接入系統(tǒng)的Vcc與地。如果系統(tǒng)耗電小于15mA為正常,否則應檢查是否有短路、元器件不良或錯焊現象存在。隨后取下外接直流穩(wěn)壓電源,恢復3.6V鎳鉻電池與系統(tǒng)的連接,進行軟、硬件統(tǒng)調測試。由于AT89S52的I/O引腳有限,故數碼管只設一位,因此輸入數字時只能分階段一位一位輸入。假設需輸入t1=061,t2=025,電話號碼=12345678,在此詳述如下:地1步:接上電話線(也即接上電源)后,數碼管顯示“E”,意為數據錯誤,因為此時我們尚未輸入任何數據。第2步:點按一下set鍵,鍵值加1,即此時set=1.這時數碼管最下的一橫點亮,顯示“_”,意為可輸入時間t1,點按ok鍵確認(小數點被同時點亮)。然后數碼管顯示數字“0”。按下up鍵后,數字開始從09循環(huán)遞增,調至0后松開up鍵,點按ok鍵確認(小數點被同時點亮)。此時百位數字“0”存入內存。按下up鍵后,數字開始循環(huán)遞增,調至1后松開up鍵,點按ok鍵確認(小數點被同時點亮)。此時十位數字“6”存入內存。按下up鍵后,數字開始循環(huán)遞增,調至1后松開up鍵,點按ok鍵確認(小數點被同時點亮)。此時個位數字“6”存入內存。這樣就完成了將061(代表t1=61s)存入內存的過程。同時數碼管又恢復顯示“_”。第3步:點按一下set鍵,鍵值加1,即此時set=2。這時數碼管下面的二橫點亮,顯示“二”,意為可輸入時間t2,點按ok鍵確認(小數點被同時點亮)。然后數碼管顯示數字“0”。按下up鍵后,數字開始從從09循環(huán)遞增,調至0后松開up鍵,點按ok鍵確認(小數點被同時點亮)。此時百位數字“0”存入內存。按下up鍵后,數字開始循環(huán)遞增,調至后松開up鍵,點按ok鍵確認(小數點被同時點亮)。此時十位數字“”存入內存。按下up鍵后,數字開始循環(huán)遞增,調至后松開up鍵,點按ok鍵確認(小數點被同時點亮)。此時個位數字“”存入內存。這樣就完成了將(代表t1=s)存入內存的過程。同時數碼管又恢復顯示“二”以后的調試同前面的方法相同。五 總結本系統(tǒng)以單片機89S52作為核心部件,利用單片機實現了電話撥號報警、時鐘顯示等功能,最終使系統(tǒng)完成設計要求的各項任務。在系統(tǒng)設計過程中,力求硬件線路簡單,并綜合運用了C語言、單片機等各種知識,采用了一些特別的方法使磁電檢測達到最佳的效果 ,充分發(fā)揮軟件編程方便靈活的特點,來滿足系統(tǒng)設計的要求。在設計過程中主要遇到幾個關鍵性問題。如檢測部分信號不穩(wěn)定,經檢查該問題與周圍的干擾有密切相關,將檢測部分的外圍進行了合理,使檢測信號很準確地檢測到。還有撥號電路模塊起初方案采用電橋和三極管進行控制,此設計采用單片機I/O口直接控制指示燈以及開關來進行控制。不僅節(jié)省了硬件資源,還提高了系統(tǒng)的穩(wěn)定性。變量定義及初始化模塊 參考文獻1楊長春.電子報合訂本 2002年上:2612電子產品世界,2004,9(167):81-823耿德根,詹衛(wèi)前,李青.單片機創(chuàng)新開發(fā)與機器人制作.北京 :北京航空航天大學出版社,2005.3:85-1204吳祖峰,葛麗,李剛.傳感器個數及距離對盲分離影響的分析.電子科技大學學報,2006,4,35(2):186-1885韋敏,寧方立,韋娟.基于智能功率模塊的無刷直流電機控制器.西北工業(yè)大學學報,2006,4,24(2):161-1646熊磊,黃玉水.一種改進型PDM調動控制方式.南昌大學學報,2006,3,28(1):99-1027黃智偉.全國大學生電子設計競賽訓練教程. 北京:電子工業(yè)出版社,2005.18閆志峰,劉立君,崔立彪.管道弧焊機器人控制系統(tǒng)設計.哈爾濱理工大學學報,9 萬光毅,嚴義.單片機實驗與實踐教程(一).北京:北京航空航天大學出版社,2003.12:123-13110黃河,鮑宏亞.Protel DXP 培訓教程.北京:清華大學出版社,2004.9致 謝How time flies!馬上就要畢業(yè)了。在院、系領導和老師的關心、教育和幫助下,經過五年的努力,已經使自己變成一個動手動腦的復合型人才。我將利用在校學習的專業(yè)知識投身職業(yè)教育事業(yè),為我國的職業(yè)教育發(fā)展做出自己的貢獻。五年來我學習到了大量的專業(yè)理論知識和動手實踐技能,畢業(yè)設計是對我這五年來學習的最好總結。在畢業(yè)設計過程中我遇到了很多困難,正是因為這些困難使我學習到了很多有用的實用知識,加深了書本理論知識和實踐的結合,這對我以后從事專業(yè)課教學工作是很有益處的。在大學的學習期間,我意識到了大學更重要的是教給我分析和解決問題的方法,這些必將對我以后的工作和生活產生深遠的影響。在畢業(yè)設計過程中,得到了曲老師的大力支持和幫助,請允許我向曲老師表示誠摯的感謝!五年來我見證了母校的發(fā)展壯大,希望母校再接再厲,健全體制,走向更加輝煌的明天。最后祝愿偉大的母校前程似錦!祝愿所有的老師身體健康,工作順利! 附錄附錄1 程序清單附錄2 系統(tǒng)使用說明附錄3 英文資料附錄4 系統(tǒng)PCB板圖附錄1:程序清單(1) 電話撥號報警程序 程序設計時需要設立3個數組DATA20、X3、Y3。DATA20用于存放電話號碼(最長20位),X3用于存放時間t1(000999s),Y3用于存放時間t2(000999s)。 另外還要設立3個軟件計數器data_flag、t1_flag、t2_flag。Data_flag用于統(tǒng)計輸入的電話號碼位長,t1_flag用于統(tǒng)計輸入的時間t1位長,t2位長。uchar DATA20; /*存放電話號碼的數組*/uchar X3; /*存放時間t1數組*/uchar Y3; /*存放時間t2數組*/uchar flag; /*RAM區(qū)防干擾標志*/ uchar dataflag=0; /*輸入電話號碼計數器(最長20位)*/uchar set=0; /*功能鍵值*/uchar m=0; /全局變量uchar n=0;uint f;uchar t1flag=0; /*輸入時間t1計數器(最長3位)*/uchar t2flag=0; /*輸入時間t2計數器(最長3位)*/uchar cnt_1=0; /*時間t1單元數學運算后暫存單元*/uchar cnt_2=0; /*時間t2單元數學運算后暫存單元*/*定時器T0初始化*/ viod init_timer() TMOD=0x01; /定時器T0方式1 TH0=-(50000/256); /裝載100ms定時初值TL0=-(50000%256);IE=0x82; /開中斷 啟動報警器子程序模塊 /*-啟動報警器進入警戒-*/void work()uchar h; p1=0xdf; /*數碼管左上角顯示“1”*/ delay(1);if(set=1) /*進入時間1循環(huán)*/while(cnt=X0*100+X1*10+X2) EX1=1;cnt_1=0; /*時間1到,打開外中斷1,計數器歸零*/*進入待機。若有1s以上開關動作,退出待機*/while(1)PCON=0x01;if(f=5PCON=0x00;break;)/*-*/EX1=0; /*關閉外中斷1*/if(set=1) /*進入時間2循環(huán)*/while(cnt_2=Y0*100+Y1*10+Y2) delay(1000); cnt_2+; /*計時器cnt_2累加*/ if(set!=1)cnt_2=0;break; /*如按下Set鍵,則退出此循環(huán)*/if(set=1)bh(); /*時間2到,調用撥號子程序*/delay(3000);p3_7=0; /控制輸出端為低,可驅動蜂鳴器等for(h=0;h60;h+) /*發(fā)出60s警音*/ for(f=0;f500;f+) f+; P3_1=! P3_1;P1=0x5f; delay(1); P3_1=0;P1=0x7f;delay(500);P3_7=1;/控制輸出端恢復高cnt_1=0;cnt_2=0; /*有關計數器、端口回到初始狀態(tài)*/P3_0=0;P3_1=0;P1_7=1;for(f=0;f3;f+)delay(60000); /*關閉3min,讓接警人進行手機或電話座機報警*/ 撥號脈沖子程序模塊/*-撥號-*/void bh()data_flag=0; /*電話號碼計數器(20位)歸零*/ P3_0=1; /*接通線路*/ p1_7=0; /*數碼管小數點亮*/ delay(1000);while (DATAdata_flag0) /*若號碼0但10*/ TR=1; /*啟動T0定時器*/ if(n=(DATAdata_flag*2) /*進行號碼x2次中斷,產生號碼個脈沖*/ data_flag+; n=0;TR0=0; P3_0=1;P1_7=0; delay(500); TR0=0; 關機子程序模塊 void stop() /*關機子程序if(flag=0x55)P1=0xfb; /*若標志為55H,說明內存區(qū)未受干擾,數碼 /管右下角顯示“1” else P1=0x86; /否則數碼管顯示“E”delay(1); /延時1ms再判if(flag=0x55)PCON=0x01; /進入低耗節(jié)電待機狀態(tài)delay(1); /延時1ms 完整代碼 #include /器件配置文件#define uchar unsigned char /變量類型的宏定義#define uint unsigned intuchar code DATA_7SEG10=0xC0,0xF9,0xA4,0xB0,0x99 0x92,0x82,0xF8,0x80,0x90,; /*09數碼管段碼*/uchar DATA20; /*存放電話號碼的數組*/uchar x3; /*存放時間t2數組*/uchar flag; /*RAM區(qū)防干擾標志*/uchar data_flag=0; /*輸入電話號碼計數器(最長20位)*/uchar set=0; /* 功能鍵值*/uchar m=0; /全局變量uchar n=0;uint f;uchar t1_flag=0; /*輸入時間1計數器(最長3位)*/uchar t2_flag=0; /*輸入時間2 計數器(最長3位)*/uchar cnt_1=0; /*時間t1單元數學運算后暫存單元*/uchar cnt_2=0; /*時間t2單元數學運算后暫存單元*/*/void delay(uint k); /*延時子函數聲明*/void stop(); /*關機子函數聲明*/void bh(); /*撥號子函數聲明*/*/*定時器T0初始化*/void init_timer()TMOD=0x01;TH0=-(50000/256);TL0=-(50000%256);IE=0x82;/*/*100ms定時中斷服務子函數*/void zd0()interrupt 1P3_0=! P3_0; /P3.0每100ms取反一次,送出脈沖P1_7=! P1_7; /數碼管小數點同步閃爍n+;TH0=-(50000/256);TL0=-(50000%256);/*/*100ms定時中斷服務子函數*/void zd0()interrupt 1p3_0=!P3_0; /P3.0每100ms取反一次,送出脈沖P1_7=!P1_7; /數碼管小數點同步閃爍n+;TH0=-(50000/256);TL0=-(50000%256);/*/*INT0中斷服務子函數*/viod zd_int0()interrupt 0delay(10); if(P3_2=0)set+; /功能鍵值遞增if(set=5)set=0; /鍵值的范圍04if(set=1)flag=0x55; /向RAM區(qū)的標志flag寫入55H PCON=0x00;f=8;again:if(P3_2=0)goto again; /若按鍵未釋放,則等待/*/*INT1中斷服務子函數*/void zd_int1()interrupt 2uchar h;f=0;for(h=0;h10;h+) /*檢查磁性開關(P3_3狀態(tài))10次,共1s*/delay(100)if(P3_3=0)f+;/*/*-關機-*/void stop()if(flag=0x55)P1=0xfb;elsep1=0x86; /數碼管右下角顯示“1”。delay(1);if(flag=0x55)PCON=0x01; /*進入節(jié)電待機狀態(tài)*/delay(1);/*/*延時1ms*K子函數*/void delay(uint k)uint i,j;for(i=1;jk;i+)for(j=0;j60;j+);/*/*-輸入時間t1-*/viod in_time1()P1=0xf7;delay(1); /*數碼管顯示“”*/if(P3_5=0) delay(10); /*按下OK鍵確認并點亮小數點*/ if(P3_5=0)P1=0x7f;m=0;t1_flag=0;delay(500);while(t1_flag=3)t1_flag=0; /*時間1計數器=3時歸零*/*/ /*-輸入時間t2-*/ viod in_time2()P1=0xb7;delay(1); /*數碼管顯示“二”*/if(P3_5=0) delay(10); /*按下OK鍵確認并點亮小數點*/ if(P3_5=0)P1=0X7f;m=0;t2_flag=0;delay(500);while(t2_flag=3)t2_flag=0; /*時間2計數器=3時歸零*/ /*/ /*-輸入電話號碼-*/vioa in_data()uchar g; P1=0xb6;delay(1); /*數碼管顯示三*/if(P3_5=0)delay(10);if(P3_5=0) p1=0x7f;m=0;data_flag=0; /*按下OK鍵確認并點亮小數點*/ for(g=0;g20;g+)DATAg=10; delay(500); /*同時DATA數組中全部寫入10*/ while(1) if(P3_4=0)delay(10); /*按下UP鍵數碼管作09遞增顯示*/ if(P3_4=0);m+;if(m=10)m=0;P1=DATA_7SEGm;delay(300); P1=DATA_7SEGm;delay(1); /*若不按UP鍵數碼管也作09顯示*/ if(P3_5=0) delay(10); if(P3_5=0) /*按下OK鍵顯示的數據(號碼)存入數組DATA中*/ DATAdata_flag=m;data_flag+;P1=0x7f;delay(500); /按下OK鍵超過2s則退出向數組DATA送入號碼*/ 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;/*/*-主函數-*/void main()int_timer(); /*定時器T0初始化*/EA=1;EX0=1; /*開總中斷,開外中斷0*/p3_0=0; /*關閉線路(掛機)*/p3_1=0;while(1) /*無限循環(huán)*/switch(set) /*根據Set標志散轉*/case 0:stop();break; /*關機*/case 1:work();break; /*警戒工作*/case 3:in_time2();break; /*輸入時間t1*/case 4:in_data();break; if(flag!=0x55) p1=0x86;delay(1);(2) 時鐘計時器程序/*/ 采用6位LED動態(tài)掃描時鐘演示程序/ 使用Keil C51/ 2004.03.31/*/*使用AT89S52單片機,12MHZ晶振,P0口輸出段碼,P2口作列掃描,用共陽LED數碼管*/key0為調時位選用,key1為加1鍵,key2為減1鍵#include reg51.h#define char unsigned char/char code dis711=0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff;/*共陽LED段碼表0 1 2 3 4 5 6 7 8 9 不亮*/char code scancon8=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f; /列掃描控制字char data timedata6=0x00,0x00,0x00,0x00,0x00,0x00; /計時單元數據初值,共6個char data dis8=0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,; /顯示單元數據,共6個數據char data con1s=0x00,con04s=0x00,con=0x00; /秒定時用sbit key0=P10;sbit key1=P11;sbit key2=P12;/*/1ms延時函數/*/dalaylms(int t)int i,j;for(i=0;it;i+) for(j=0;j120;j+) ; /*/鍵掃描子函數/keyscan()EA=0;if(key0=0) delay
收藏