基于51單片機的電子鎖設計
學院名稱: 電氣信息工程學院
專 業: 電子信息工程
班 級:
姓 名:
學 號:
指導教師:
摘要:隨著電子產品向智能化和微型化的不斷發展,單片機已成為電子產品研制和開發中首選的控制器。隨著人們生活水平的提高,如何實現家庭防盜這一問題也變的尤其的突出,傳統的機械鎖由于其構造的簡單,安全性能低,無法滿足人們的需要。本設計采用單片機為主控芯片,結合外圍電路,組成電子密碼鎖,用戶想要打開鎖,必先通過提供的鍵盤輸入正確的密碼才能將鎖打開,密碼輸入錯誤有提示,為了提高安全性,當密碼輸入錯誤三次將報警。經實驗證明,該密碼鎖具有設計方法合理,簡單易行,成本低,安全實用等特點,符合住宅、辦公室用鎖要求,具有推廣價值。
關鍵詞:電子密碼鎖,89C51,鍵盤接口,LCD1602顯示
Controller system design of digital lock
Abstract:With the continuous development of electronic products to intelligent and miniaturization, microcontroller has become electronic product development and the development of the preferred controller. As people living standard rise, how to realize the family anti-theft this problem is particularly prominent, the traditional mechanical lock because of its simple structure, safety performance is low, cannot satisfy the needs of the people. This design USES the single chip microcomputer as main control chip, combining with the peripheral circuit, composed of electronic trick lock, the user wants to play the lock, must first by providing keyboard input the correct password to open the lock, password input error, in order to improve the security, when the password input error three times will report to the police. Proved by the experiment, the design method of the combination lock is reasonable, simple, low cost, safe and practical characteristics, conform to the requirements of the residential, office use, locks, has promotion value.
Keywords:electronic code lock, 89C51, keyboard interface, LCD1602 display
目 錄
前言 1
第1章 緒論 2
1.1 課題的意義和目的 2
1.2 課題的研究內容 2
1.3 課題的任務要求 2
第2章 系統方案設計 4
2.1系統方案設計 4
2.2 方案的選擇與論證 5
2.2.1 方案的比較與論證 5
2.2.2 系統結構實現框圖設計 5
第3章 系統各模塊的硬件設計 7
3.1 電源模塊設計 7
3.2 掉電存儲模塊設計 7
3.2.1 AT24C02介紹 8
3.2.2掉電存儲電路設計 9
3.3 單片機控制模塊設計 9
3.3.1 單片機時鐘電路設計 10
3.3.2 單片機復位電路設計 11
3.4 按鍵模塊設計 11
3.5 顯示模塊設計 12
3.6 蜂鳴器模塊設計 14
第4章 系統軟件設計 15
4.1 系統軟件設計總體思路 15
4.2 系統軟件主程序流程圖設計 15
4.3 系統軟件子程序設計 16
4.3.1按鍵功能程序設計 16
4.3.2 密碼設置程序設計 16
4.3.3 開鎖程序設計 17
第5章 系統調試與數據分析 19
5.1 硬件電路的制作和調試 19
5.1.1 硬件電路的制作 19
5.1.2 硬件電路的調試 19
5.1.3 故障方析 20
5.2 軟硬件功能分析 20
5.3 測試結果分析 20
第6章 總結與展望 22
參考文獻 23
致謝 24
附錄1 電路原理圖 25
附錄2 程序 26
附錄3 實物圖 42
附錄4 元器件清單 43
《綜合工程實踐報告》
前言
目前,最常用的鎖是20世紀50年代意大利人設計的機械鎖,其機構簡單、使用方便、價格便宜。但在使用中暴露了很多缺點:一是機械鎖是靠金屬制成的鑰匙上的不同齒形與鎖芯的配合來工作的。據統計,每4000把鎖中就有兩把鎖的鑰匙齒牙相同或類似,故安全性低。二是鑰匙一旦丟失,無論誰撿到都可以將鎖打開。三是機械鎖的材料大多為黃銅,質地較軟,容易損壞。四是機械鎖鑰匙易于復制,不適于諸如賓館等公共場所使用。由于人們對鎖的安全性,方便性等性能有更高的要求,許多智能鎖(如指紋辨別、IC卡識別)也相繼問世,但這類產品的特點是針對特定指紋或有效卡,但能適用于保密要求高且僅供個別人使用的箱、柜、房間,其成本一般較高,在一定程度上限制了這類產品的普及和推廣。
電子密碼鎖是一種通過密碼輸入來控制電路或是芯片工作,控制機械開關的閉合,完成開鎖、閉鎖任務的電子產品。它的種類很多,有簡易的電路產品,也有基于芯片的性價比較高的產品。現在應用較廣的電子密碼鎖是以芯片為核心,通過編程來實現的。其性能和安全性已大大超過了機械鎖,特點如下:
1.保密性好,編碼量多,遠遠大于彈子鎖。隨機開鎖成功率幾乎為零。
2.密碼可變。 用戶可以經常更改密碼,防止密碼被盜,同時也可以避免因人員的更替而使鎖的密級下降。
3.誤碼輸入保護。當輸入密碼多次錯誤時,報警系統自動啟動。
第1章 緒論
1.1 課題的意義和目的
隨著人們生活水平的提高,電子密碼防盜鎖作為防盜衛士的作用日趨重要。電子密碼防盜鎖用密碼代替鑰匙,不但省去了佩戴鑰匙的煩惱,也從根本上解決了普通門鎖保密性差的缺點。根據國外的統計資料顯示,裝有電子防盜裝置的商業區或居民區盜竊犯罪率平均下降30%左右。目前西方發達國家已經大量地應用這種智能門禁系統,但在我國的應用還不廣泛,成本還很高。鍵盤式電子密碼在鍵盤上輸入,與打電話差不多,因而易于掌握,其突出優點是“密碼”是記在被授權人腦子里的數字和字符,既準確又可靠,不會丟失,難以被竊。
本設計系統主機采用8051單片機,MCS-51單片機的程序存儲器和數據存儲器的地址空間是相互獨立的,而且程序存儲器一般為ROM或EPROM,只能讀出不能寫入。擴展用的程序存儲器芯片大多采用EPROM芯片,最大可擴展到64K字節。該設計使用矩陣鍵盤輸入,LCD1602顯示輸入密碼, AT24C01存儲器存儲密碼。密碼正確,二極管發光。輸入密碼錯誤次數超過三次則系統報警,蜂鳴器發出報警音。
1.2 課題的研究內容
本設計采用單片機為主控芯片,結合外圍電路,組成電子密碼鎖,用戶想要打開鎖,必先通過提供的鍵盤輸入正確的密碼才能將鎖打開,密碼輸入錯誤有提示,為了提高安全性,當密碼輸入錯誤三次將報警。密碼可以由用戶自己修改設定,鎖打開后才能修改密碼。修改密碼之前必須再次輸入密碼,在輸入新密碼時候需要二次確認,以防止誤操作。
1.3 課題的任務要求
主要完成以下功能:
1、設置6位密碼,密碼通過鍵盤輸入,若密碼正確,則將鎖打開。
2、密碼可以由用戶自己修改設定(只支持6位密碼),鎖打開后才能修改密碼。修改密碼之前必須再次輸入密碼,在輸入新密碼時候需要二次確認,以防止誤操作。
3、報警、鎖定鍵盤功能。密碼輸入錯誤顯示器會出現錯誤提示,若密碼輸入錯誤次數超過3次,蜂鳴器報警并且鎖定鍵盤。
4、AT24C02保存密碼,支持復位保存,掉電保存功能。
第2章 系統方案設計
2.1系統方案設計
本設計采用STC89C52單片機為主控芯片,結合外圍電路矩陣鍵盤、液晶顯示器LCD1602和密碼存儲AT24C02等部分組成。其中矩陣鍵盤用于輸入數字密碼和進行各種功能的實現。由用戶通過連接單片機的矩陣鍵盤輸入密碼,后經過單片機對用戶輸入的密碼與自己保存的密碼進行對比,從而判斷密碼是否正確,然后控制引腳的高低電平傳到開鎖電路或者報警電路控制開鎖還是報警,有以下幾種方案可供選擇。
方案一:選用單片機作為系統的核心部件,實現控制與處理的功能。單片機具有資源豐富、速度快、編程容易等優點。該方案的設計框圖如圖1所示:
圖1 方案一設計框圖
方案二:采用數字電路控制,用以74LS112雙JK觸發器構成的數字邏輯電路作為密碼鎖的核心控制,將密碼保存在JK觸發器中,與輸入密碼通過比較器比較,判斷結果是否相符合。該方案的設計框圖如圖2所示。
圖2 方案二設計框圖
2.2 方案的選擇與論證
2.2.1 方案的比較與論證
比較以上兩個方案,在同樣能達到技術指標要求的前提下。采用數字電路設計的方案好處就是設計簡單,但控制的準確性和靈活性差,故不采用。利用單片機內部的隨機存儲器(RAM)和只讀存儲器(ROM)及其引腳資源,外接液晶顯示(LCD),鍵盤輸入等實現數據的處理傳輸和顯示功能,基本上能實現設計指標。因此綜合考慮,本系統采用方案一。
2.2.2 系統結構實現框圖設計
設計采用單片機為主控芯片,結合外圍電路,組成電子密碼控制系統,密碼鎖共6位密碼,每位的取值范圍為0~9,用戶可以自行設定和修改密碼,每個密碼按鍵都有聲提示。用戶想要打開鎖,必先通過提供的鍵盤輸入正確的密碼才可以,密碼輸入錯誤有提示,為了提高安全性,當密碼輸入錯誤三次將報警,期間輸入密碼無效,以防竊賊多次試探密碼。方案具體如下:
(1)矩陣鍵盤:矩陣鍵盤的工作過程可分為兩步:第一步是CPU首先檢測鍵盤上是否有鍵按下;第二步是識別哪一個鍵按下。
(2)復位電路:STC89C51的復位輸入引腳RST為單片機提供初始化的手段,可以使程序從指定處開始執行,在STC89C51的時鐘電路工作后,只要RST引腳上出現兩個機器周期以上的高電平時,即可產生復位操作。只要RST保持高電平,則單片機循環復位。只要當RST有高電平變為低電平以后,單片機才從0000H地址開始執行程序,本系統采用按鍵復位方式的復位電路,當復位鍵按下,系統自動切換到初始狀態。
(3)時鐘電路:STC89C51的時鐘可以有兩種方式,一種是內部方式,利用芯片內部的振蕩電路;另一種為外部方式。采用內部振蕩方式。STC89C51內部有一個用于構成振蕩器的高增益反相放大器,引腳XTAL1和XTAL2分別是此放大器的輸入端和輸出端,這個放大器作為反饋元件的片外晶體和陶瓷諧振器一起構成一個自激振動器。
(4)電源模塊:由于整個系統采用的電源電壓只需+5V,故利用PC機的USB串口直接供電。
(5)系統控制模塊:采用單片機控制芯片,它是一種低功耗、高性能的微型控制器,可以接受檢測信號,外接口亦能方便的輸出控制信號。
(6)LCD顯示模塊:該模塊主要用來顯示開鎖提示。LCD的數據端通過1K歐姆的上拉電阻接到單片機P0口。
(7)掉電存儲模塊:采用的是AT24C02,SCL移位脈沖口和SDA數據地址口接到單片機I/O口。
第3章 系統各模塊的硬件設計
本設計主要由單片機、矩陣鍵盤、液晶顯示器和密碼存儲等部分組成。其中矩陣鍵盤用于輸入數字密碼和進行各種功能的實現。由用戶通過連接單片機的矩陣鍵盤輸入密碼,后經過單片機對用戶輸入的密碼與自己保存的密碼進行對比,從而判斷密碼是否正確,然后控制引腳的高低電平傳到開鎖電路或者報警電路控制開鎖還是報警。硬件部分由電源輸入部分、鍵盤輸入部分、復位部分、晶振部分、顯示部分、報警部分組成。
3.1 電源模塊設計
STC單片機USB下載線原理圖,也可以用USB口和電腦進行串口通信PL-2303hx的USB轉TTL電平串口的電路。如圖3-1所示。
- 電腦的原有的串口,叫作RS232接口,這是一種cmos接口,接口電壓從-15v到+15v之間,而單片機C51都是TTL電平,電平電壓只用0v或是5v兩種。用這個電腦做出來的就是單片機上用的TTL電平,所以,不要再接MAX232芯片了。這是它的一大好處。
- 電路可以提取出USB接口的+5v電壓,正好用于C51單片機的使用,非常方便。另外PL-2303hx還能對外提供一個+3.3v的電壓,這個電壓,對于AVR單片機,非常合適。
圖3-1 USB-TTL下載器原理圖
3.2 掉電存儲模塊設計
3.2.1 AT24C02介紹
AT24C02是美國Atmel公司的低功耗CMOS型E2PROM,內含256×8位存儲空間,具有工作電壓寬(2.5~5.5 V)、擦寫次數多(大于10000次)、寫入速度快(小于10 ms)、抗干擾能力強、數據不易丟失、體積小等特點。而且他是采用了I2C總線式進行數據讀寫的串行器件,占用很少的資源和I/O線,并且支持在線編程,進行數據實時的存取十分方便。AT24C02中帶有的片內地址寄存器。每寫入或讀出一個數據字節后,該地址寄存器自動加1,以實現對下一個存儲單元的讀寫。所有字節均以單一操作方式讀取。為降低總的寫入時間,一次操作可寫入多達8個字節的數據。I2C總線是一種用于IC器件之間連接的二線制總線。他通過SDA(串行數據線)及SCL(串行時鐘線)兩根線在連到總線上的器件之間傳送信息,并根據地址識別每個器件。AT24C02正是運用了I2C規程,使用主/從機雙向通信,主機(通常為單片機)和從機(AT24C02)均可工作于接收器和發送器狀態。主機產生串行時鐘信號(通過SCL引腳)并發出控制字,控制總線的傳送方向,并產生開始和停止的條件。無論是主機還是從機,接收到一個字節后必須發出一個確認信號ACK。AT24C02的控制字由8位二進制數構成,在開始信號發出以后,主機便會發出控制字,以選擇從機并控制總線傳送的方向。其電路如圖3-2-1所示。
SCL 為串行時鐘:串行時鐘輸入管腳用于產生器件所有數據發送或接收的時鐘這是一個輸入管腳。
SDL 為串行數據/地址:雙向串行數據/地址管腳用于器件所有數據的發送或接收SDL,是一個開漏輸出管腳可與其它開漏輸出或集電極開路輸出進行線或。
A0、A1、A2 為器件地址輸入端:當使用24C02 時最大可級聯8個器件,如果只有一個24C02被總線尋址,這三個地址輸入腳A0、A1、A2可懸空或連接到Vss。
WP為寫保護: 如果WP 管腳連接到Vcc 所有的內容都被寫保護只能讀當WP, 管腳連接到Vss 或懸空,允許器件進行正常的讀/寫操作。
3.2.2掉電存儲電路設計
采用AT24C02設計的掉電存儲電路如圖3-2-2所示。圖中R是上拉電阻,其作用是減少AT24C02的靜態功耗,由于AT24C02的數據線和地址線是復用的,采用串口的方式傳送數據,所以只用兩根線SCL(移位脈沖)和SDA(數據/地址)與單片機傳送數據。
每當設定一次密碼,系統就自動調用存儲程序,將信息保存在芯片內;當系統重新上電的時候,自動調用讀存儲器程序,將存儲器內的密碼等信息,讀到緩存單元中,供主程序使用。
3.3 單片機控制模塊設計
單片機是由運算器、控制器、存儲器、輸入設備以及輸出設備共五個基本部分組成的。單片機是把包括運算器、控制器、少量的存儲器、最基本的輸入輸出口電路、串行口電路、中斷和定時電路等都集成在一個尺寸有限的芯片上。
通常,單片機由單個集成電路芯片構成,內部包含有計算機的基本功能部件:中央處理器、存儲器和I/O接口電路等。因此,單片機只需要和適當的軟件及外部設備相結合,便可成為一個單片機控制系統。
在STC89C52中有四個雙向I/O端口P0 ~ P3口,每個端口都是由鎖存器、輸出驅動器、輸入緩沖器組成。當CPU控制系統與外部設備交換信息時,都是通過端口鎖存器進行的。四個I/O端口都可作輸出輸入使用,其中P0和P2口通常用于對外部存儲器的訪問。
接通鎖存器時,P0口作為雙向I/O使用,如P0口的鎖存器的值為1,使輸出驅動器中的場效應管截止,引腳空,此時端口可作高阻輸入。鎖存器的值為0時,下面的場效應管導通,輸出為0。P0口作為地址/數據總線口使用時,由“控制”線控制將電子開關接通至“地址/數據”端,分別輸出擴展外存的低8位地址A0 ~ A7和數據D0 ~D7。一般情況下,當P0口作輸入輸出線使用時,都要外接拉高電阻。
在P1、P2、P3端口內,都接有內部上拉電阻,此上拉電阻分為固定部分和附加部分,當端口的狀態要從0變為1時,在發生變化的哪個機器周期的S1P1和S1P2接通附加的拉高電路以增加變化的速度,否則這個狀態的變化將十分緩慢。附加的拉高電路允許通過的電流比普通的上拉電阻大100倍。
STC89C52有40條引腳,分為端口線、電源線和控制線三類。如圖3-3為STC89C52的引腳結構圖:
圖3-3 89C52引腳圖
3.3.1 單片機時鐘電路設計
時鐘電路由一個晶體振蕩器12MHZ和兩個22pF的瓷片電容組成,瓷片電容叫晶振的負載電容。時鐘電路用于產生單片機工作所需要的時鐘信號,而時序所研究的是指令執行中各信號之間的相互關系。單片機本身就如一個復雜的同步時序電路,為了保證同步工作方式的實現,電路應在唯一的時鐘信號控制下嚴格地工作。時鐘電路接法是,AT89C52的外接晶體引腳為XTAL1和XTAL2,是利用單片機內部的振蕩器產生,只要在XTAL1、XTAL2引腳上外接定時反饋電路,內部振蕩器便自激振蕩,產生時鐘輸出到內部的定時控制邏輯。其電路如圖3-3-1所示:
圖3-3-1 時鐘電路圖
3.3.2 單片機復位電路設計
單片機在啟動時都需要復位,以使CPU及系統各部件處于確定的初始狀態,并從初態開始工作。89系列單片機的復位信號是從RST引腳輸入到芯片內的施密特觸發器中的。當系統處于正常工作狀態時,且振蕩器穩定后,如果RST引腳上有一個高電平并維持2個機器周期(24個振蕩周期)以上,則CPU就可以響應并將系統復位。單片機系統的復位方式有:手動按鈕復位和上電復位。
本設計采用手動按鈕復位,需要人為在復位輸入端RST上加入高電平。一般采用的辦法是在RST端和正電源Vcc之間接一個按鈕。當人為按下按鈕時,則Vcc的+5V電平就會直接加到RST端。手動按鈕復位的電路如所示。由于人的動作再快也會使按鈕保持接通達數十毫秒,所以,完全能夠滿足復位的時間要求。根據實際操作的經驗,下面給出這種復位電路的電容、電阻參考值。C=10uF,Rl=10K,R2=1K,如圖3-3-2所示。
圖3-3-2復位電路圖
3.4 按鍵模塊設計
本系統需要的按鍵數量較多,為了減少I/O口的占用,將按鍵排列成矩陣形式,如圖3-4所示。在矩陣式鍵盤中,每條水平線和垂直線在交叉處不直接連通,而是通過一個按鍵加以連接。這樣,一個端口(如P1口)就可以構成4*4=16個按鍵,比之直接將端口線用于鍵盤多出了一倍,而且線數越多,區別越明顯,由此可見,在需要的鍵數比較多時,采用矩陣法來做鍵盤是合理的。
圖3-4 矩陣鍵盤圖
矩陣鍵盤的工作過程可分為兩步:第一步是CPU首先檢測鍵盤上是否有鍵按下;第二步是識別哪一個鍵按下。
檢測鍵盤上是否有鍵按下的處理方法是:將行線送入全掃描字,讀入列線的狀態來判別。
識別鍵盤中哪一個鍵按下的處理方法是:將行線逐列置成低電平,檢查列輸入狀態,稱為逐行掃描。
例如:P0.7~P0.0設為11111110,然后與11110000相與,如果結果不等于11110000,則判斷有按鍵按下,即這種情況是有按鍵按下,而且是P0.0為低電平,可知是第一行有一個按鍵按下,接下來就通過判斷P0口的值來檢測是哪個按鍵,如果值為11101110,即P0.4為低電平,初始值可知P0.0也是低電平,這是就可以判斷是第一行第一個按鍵是按下的;如果為11011110,則是第一行第二個按鍵是按下的;如果為10111110,則是第一行第三個按鍵是按下的;如果為01111110,則是第一行第四個按鍵是按下的。由此類推,便可以判斷是哪個按鍵按下,之后便可以進行接下來的操作。
3.5顯示模塊設計
液晶顯示模塊已作為很多電子產品中都可以看到,顯示的主要是數字、專用符號和圖形。1602型LCD顯示模塊具有體積小,功耗低,顯示內容豐富等特點。1602型LCD可以顯示2行16個字符,有8位數產品的通過器件,如在計算器、萬用表、電子表及很多家用電子據總線D0-D7和RS,R/W,EN三個控制端口,工作電壓為5V,并且具有字符對比度調節和背光功能。引腳功能說明:
LCD1602采用標準的14腳(無背光)或16腳(帶背光)接口,各引腳接口說明:
第1腳:VSS為地電源。
第2腳:VDD接5V正電源。
第3腳:VL為液晶顯示器對比度調整端,接正電源時對比度最弱,接地時對比 度最高,對比度過高時會產生“鬼影”,使用時可以通過一個10K的電位器調整對比度。
第4腳:RS為寄存器選擇,高電平時選擇數據寄存器、低電平時選擇指令寄存器。
第5腳:R/W為讀寫信號線,高電平時進行讀操作,低電平時進行寫操作。當RS和R/W共同為低電平時可以寫入指令或者顯示地址,當RS為低電平R/W為高電平時可以讀忙信號,當RS為高電平R/W為低電平時可以寫入數據。
第6腳:E端為使能端,當E端由高電平跳變成低電平時,液晶模塊執行命令。
第7~14腳:D0~D7為8位雙向數據線。
第15腳:背光源正極。
第16腳:背光源負極。
LCD連線圖如圖3-5所示。
圖3-5 LCD1602連線圖
只有按下鍵盤上的開啟按鍵后,顯示器才處于開啟狀態。同理只有按下關閉按鍵后顯示器才處于關閉狀態。否則顯示器將一直處于初始狀態,當需要對密碼鎖進行開鎖時,按下鍵盤上的開鎖按鍵后利用鍵盤上的數字鍵0-9輸入密碼,每按下一個數字鍵后在顯示器上顯示一個*,輸入多少位就顯示多少個*。當密碼輸入完成時,按下確認鍵,如果輸入的密碼正確的話, LCD子顯示“RIGHT”,單片機其中P2.0引角會輸出低電平,使三極管T2導通,電磁鐵吸合,電子密碼鎖被打開,如果密碼不正確,LCD顯示屏會顯示“ERROR”,P2.0輸出的是高電平,電子密碼鎖不能被打開。通過LCD顯示屏,可以清楚的判斷出密碼鎖所處的狀態。
3.6蜂鳴器模塊設計
三極管起開關作用,單片機驅動口輸出驅動電平并通過三極管放大驅動電流就能使蜂鳴器發出聲音。三極管基極低電平時導通,蜂鳴器發聲,基極高電平則使三極管關閉,蜂鳴器停止發聲。蜂鳴器報警電路如圖3-6所示。
圖3-6蜂鳴器連線圖
第4章 系統軟件設計
4.1 系統軟件設計總體思路
當用戶需要開鎖時,先按鍵盤開鎖鍵之后按鍵盤的數字鍵0-9輸入密碼。密碼輸完后按下確認鍵,如果密碼輸入正確則開鎖,不正確顯示密碼錯誤重新輸入密碼,當三次密碼錯誤則發出報警;當用戶需要修改密碼時,先按下鍵盤設置鍵后輸入原來的密碼,只有當輸入的原密碼正確后才能設置新密碼。
4.2 系統軟件主程序流程圖設計
如圖4-2所示為主程序流程圖,開始接上電源,程序進行初始化設置,然后在鍵盤上輸入密碼,此系統進行鍵盤掃描,密碼正確,開鎖成功,密碼錯誤3次出錯報警,選擇是否修改密碼,若要修改密碼,先輸入舊密碼密碼,密碼正確后設置新密碼,錯誤時報警,需要兩次確認新密碼,確認后,密碼修改成功,否則結束最終返回。
4.3 系統軟件子程序設計
4.3.1按鍵功能程序設計
如圖4-3-1為按鍵功能流程圖,在按鍵當中,有與輸入、開鎖、清除、設置、確認的程序相對應的按鍵,并按順序與輸入的數相比較,當輸入正確時,進入密碼程序,錯誤時進行清除,輸入兩次新密碼正確時,可進行重新設置密碼,最后確認程序。
圖4-3-1 按鍵功能程序流程圖
4.3.2 密碼設置程序設計
如圖4-3-2為密碼設置流程圖,開始按下設置鍵,輸入舊密碼,如果錯誤累計三次,進行報警程序。如輸入正確,可以修改密碼,確認后再次輸入新密碼,如兩次輸入一樣,則更改成功。如果兩次輸入的新密碼不一樣,則修改密碼失敗,重新返回設置新密碼。
圖4-3-2密碼重置程序流程圖
4.3.3 開鎖程序設計
如圖4-3-3為開鎖流程圖,開始時按開鎖鍵,輸入密碼,如果輸入正確,則開鎖成功。如果輸入錯誤累計達到三次,則執行報警程序。
圖4-3-3 開鎖程序流程圖
第5章 系統調試與數據分析
5.1 硬件電路的制作和調試
5.1.1 硬件電路的制作
本電路由相關元器件在通用板上面焊接而成,在焊接之前,用萬用表檢查各個元器件是否有損壞,比如電容、發光二極管是否開路,之后設計好各個元器件在電路板上面的布局,做到合理、美觀。布局完成之后就可以進行焊接了,元器件之間的連線由帶有絕緣皮的導線完成。焊接的過程中不可三心二意,不要造成短路、開路等錯誤,盡量做到一步到位
5.1.2 硬件電路的調試
本次調試主要采用proteus軟件仿真。首先設計電子密碼鎖的源程序,源程序經過匯編后,生成的目標文件經過仿真調試。依次按下密碼后按確定鍵,二極管亮,表示密碼正確開門。
系統調試包括硬件調試和軟件調試,硬件調試的任務排除系統的硬件電路.包括設計和工藝故障,軟件調試是利用開發工具進行在線住址調試,除發現和解決程序錯誤之外,也可以發現硬件故障.
(1) 靜態調試
第一步為目測,單片機應用系統中大部分電路安裝在印制電路板上,因此對每一塊加工好的印制電路板要進行仔細的檢查。第二步為示波器測試,目測檢查后,可進行示波器測試。第三步為加電檢查,第四步實際聯機檢查。但注意示波器必須接在入口而不能接在電壓大的端口上。
(2) 動態調試
一般方法是由近及遠、由分到合。首先按邏輯功能將用戶系統硬件電路分為若干份,先分塊調試,當調試某塊電路時,與該電路無關的器件全部從用戶系統中去掉,這樣,可將故障范圍限定在某個局部電路上。當各塊電路調試無故障后,將各塊電路加入系統中,再對個塊電路功能及電路間可能存在的相互聯系進行試驗。經歷這樣一個調試過程后,大部分硬件故障基本可以排除。
軟件調試一般步驟:
先獨立后聯機:一個子程序一個子程序的進行調試,最后單片機連起來總調。
先分塊后組合:逐個芯片逐步調試再和整體芯片一起進行總調。
先單步后連續:先執行一條指令,在每步后,又返回監控調試狀態在從程序任意一條地址處啟動,最后全速運行。
5.1.3 故障方析
現象一:通電調試硬件的時候,無論單片機P2.0~P2.5與單片機20腳(GND)相連,還是將單片機P3.4~P3.7與單片機20腳(GND)相連,發光二極管和LCD都不亮;
故障方析:可能電路未供上電,或者各個發光二極管陰極和數碼管位選端均未與單片機相連;
解決方法:用數字萬用表蜂鳴擋兩個表筆分別搭到單片機40腳(VCC)和電源排針,不響,可知電源未接通,將其接通,排除故障。
5.2 軟硬件功能分析
在軟硬件聯調時,按基本功能依次調試。當電路通上+5v電源后,程序自動調入初始密碼,此時依次輸入:000000,然后按確認鍵,此時鎖會打開,可以看到顯示open,密碼鎖打開。首次使用輸入:131420,對密碼進行初始化,顯示出現:initpassword,證明密碼初始化完成,此時初始密碼即為:000000。按下取消鍵,此時鎖關閉,所有輸入清除。在開鎖狀態下,再次輸入正確的密碼并按下確認鍵,此時聽到兩聲提示,輸入新的六位密碼并按重設鍵,再重復輸入一次新密碼并按重設鍵,會聽到兩聲提示音,重設密碼成功,內部保存新密碼并存儲到AT24C02。如兩次輸入的新密碼不一樣,則重設密碼失敗。報警并鎖定鍵盤:當輸入密碼錯誤后,報警并鎖定鍵盤3秒,如3秒內又有按鍵,3秒再啟動。
5.3 測試結果分析
經通電測試檢查完畢,本系統可以實現的功能如下:
1、設置6位密碼,密碼通過鍵盤輸入,若密碼正確,則將鎖打開。
2、密碼可以由用戶自己修改設定(只支持6位密碼),鎖打開后才能修改密碼。修改密碼之前必須再次輸入密碼,在輸入新密碼時候需要二次確認,以防止誤操作。
3、報警、鎖定鍵盤功能。密碼輸入錯誤顯示器會出現錯誤提示,若密碼輸入錯誤次數超過3次,蜂鳴器報警并且鎖定鍵盤。
4、AT24C02保存密碼,支持復位保存,掉電保存功能。
第6章 總結與展望
本次設計的電子密碼鎖是以手動鍵盤輸入密碼的,通過這幾個星期對電子密碼鎖的研究學習,發覺這種密碼輸入方式可以進行改革。在越來越高科技化的今天,遙控控制顯的愈發重要,今后的電子密碼鎖應該具有以紅外技術或無線電技術為輔助的密碼按鍵輸入遠程交互技術,這樣就能遠程輸入密碼完成操作。也可以放棄傳統的按鍵輸入密碼模式,借助傳感器技術運用聲控來實現密碼輸入,又或者人臉識別技術,還有一種就是用戶指紋輸入方式,這些都可以使開鎖的時間更短更方便。電子密碼鎖產業將向靜態功耗更低,外圍電路更簡化,可提供的功能或控制口更多,更人性化高科技化的方向發展。
通過本次畢業設計的鍛煉,我學到了很多有關電子密碼鎖的設計方法與工作原理,鞏固了單片機知識。無論從理論到實踐都使我學到了很多東西,它不僅可以鞏固了以前所學過的知識,而且學到了很多在書本上所沒有學到過的知識。同時也明白了理論與實踐相結合的重要性,只有理論知識是遠遠不夠的,只有把所學的理論知識與實踐相結合起來,從理論中得出結論,才能真正為社會服務,從而提高自己的實際動手能力和獨立思考的能力。
參考文獻
[1] 葉啟明.單片機制作的新型安全密碼鎖[J].家庭電子.2000,第六期:24-27
[2] 胡喬木. 中國大百科全書.中國大百科全書出版社. 1993
[3]李明喜.新型電子密碼鎖的設計[J].機電產品開發與創新.2004,第八期:77-79
[4]董繼成.一種新型安全的單片機密碼鎖[J].電子技術.2004,第三期:55-60
[5]王寬仁.可靠安全的智能密碼鎖[J].電子技術應用.2001年第2期
[6]何立民.MCS-51系列單片機應用系統設計系統配置與接口技術[M].北京:北京航空航天大學出版社,1999
[7]胡漢才.單片機原理及其接口技術(第2版)[M].北京:清華大學出版社,2004
[8]江志紅. 51單片機技術與應用系統開發[M]. 清華大學出版社, 2008
[9]童詩白,華成英. 模擬電子技術基礎[M] 高等教育出版社,2000
[10]閻石. 數字電子技術基礎[第四版][M].高等教育出版社.1998.11
[11]任艷艷. 基于AT89C51單片機多功能密碼鎖的研究[J]. 重慶職業技術學院學報.2008.5
[12]周功明. 基于AT89C2051單片機的防盜自動報警密碼鎖系統的設計[J]. 綿陽師范學院學報.2007.5
[13]周鑫,何建新, 劉琥. 基于單片機的電子密碼鎖控制電路設計[J] 成都信息工程學院學報. 2009,(08)
[14] 郭海英. 基于單片機的電子安全密碼鎖的設計[J]. 佛山職業技術學院現代電子技術2005 (13)
[15] 王金國.采用單片機的電子密碼鎖控制電路[J].山東煤炭科技 ,2000 ,(3) :30 - 33.
[16] 寧愛民. 應用AT89C2051 單片機設計電子密碼鎖[J]. 淮海工學院學報2003 ,6
[17] AT89S51 DATA SHEEP Philips SemiSonduStors [J]. 2009
[18] AT89S51 DATA SHEEP Philips SemiSonduStors [J]. 2009
[19] Texas Instruments InSorporated, AT89S51 Family User’s Guide.
[20] Voice of Electronic Password-lock Design, China Control Net ,2008
[21] Design Serial Infrared PhysiSalL ayer SpeSifiSation, Version 1.3. Ostober 15,
致謝
在這一個月的設計和制作過程中,在老師和同學的幫助下,我順利的完成了此次實訓。通過這次電子綜合實訓,使我深刻地認識到學好專業知識的重要性,也理解了理論聯系實際的含義,并且檢驗了大學四年的學習成果。雖然在這次設計中對于知識的運用和銜接還不夠熟練。但是我將在以后的工作和學習中繼續努力、不斷完善。這四周的課程設計是對過去所學知識的系統提高和擴充的過程,為今后的發展打下了良好的基礎,而且為我們下學期的畢業設計提供了模板。
附錄1 電路原理圖
附錄2 程序
- #include<REG51.h>
- #include<intrins.h>
- #define LCM_Data P0
- #define uchar unsigned char
- #define uint unsigned int
- #define w 8//定義密碼位數
- sbit lcd1602_rs=P2^6;
- sbit lcd1602_en=P2^7;
- sbit Scl=P3^4; //24C02串行時鐘
- sbit Sda=P3^5; //24C02串行數據
- sbit ALAM = P2^0; //報警
- sbit KEY = P3^7; //開鎖
- bit operation=0; //操作標志位
- bit pass=0; //密碼正確標志
- bit ReInputEn=0; //重置輸入充許標志
- bit s3_keydown=0; //3秒按鍵標志位
- bit key_disable=0; //鎖定鍵盤標志
- unsigned char countt0,second; //t0中斷計數器,秒計數器
- void Delay5Ms(void);
- unsigned char time=0;
- unsigned char code a[]={0xFE,0xFD,0xFB,0xF7}; //控盤掃描控制表
- unsigned char code start_line[]= {"password: "};
- unsigned char code name[]={"===CodedLock==="};//顯示名稱
- unsigned char code Correct[]= {" correct "};//輸入正確
- unsigned char code Error[] ={" error "}; //輸入錯誤
- unsigned char code codepass[]= {" pass "};
- unsigned char code LockOpen[]= {" open "};//OPEN
- unsigned char code SetNew[]= {"SetNewWordEnable"};
- unsigned char code Input[] = {"input: "};//INPUT
- unsigned char code ResetOK[]= {"ResetPasswordOK "};
- unsigned char code initword[]= {"Init password..."};
- unsigned char code Er_try[]= {"error,try again!"};
- unsigned char code again[]= {"input again "};
- unsigned char InputData[6]; //輸入密碼暫存區
- unsigned char CurrentPassword[6]={1,3,1,4,2,0}; //當前密碼值
- unsigned char TempPassword[6];
- unsigned char N=0; //密碼輸入位數記數
- unsigned char ErrorCont;//錯誤次數計數
- unsigned char CorrectCont;//正確輸入計數
- unsigned char ReInputCont; //重新輸入計數
- unsigned char code initpassword[6]={0,0,0,0,0,0};
- void Delay5Ms(void)
- {unsigned int TempCyc = 5552;
- while(TempCyc--);}
- void Delay400Ms(void)
- { unsigned char TempCycA = 5;
- unsigned int TempCycB;
- while(TempCycA--)
- {TempCycB=7269;
- while(TempCycB--); }}
- void mDelay(uint t) //延時
- { uchar i;
- while(t--)
- {for(i=0;i<125;i++)
- {;}}}
- void Nop(void) //空操作
- {_nop_();
- _nop_();
- _nop_();
- _nop_();
- }
- /*起始條件*/
- void Start(void)
- {Sda=1;
- Scl=1; Nop();
- Sda=0;
- Nop();}
- /*停止條件*/
- void Stop(void)
- {Sda=0;
- Scl=1;
- Nop();
- Sda=1;
- Nop();}
- /*應答位*/
- void Ack(void)
- {Sda=0;
- Nop();
- Scl=1;
- Nop();
- Scl=0;}
- /*反向應答位*/
- void NoAck(void)
- { Sda=1;
- Nop();
- Scl=1;
- Nop();
- Scl=0;}
- /*發送數據子程序,Data為要求發送的數據*/
- void Send(uchar Data)
- { uchar BitCounter=8;
- uchar temp;
- do
- {temp=Data;
- Scl=0;
- Nop();
- if((temp&0x80)==0x80)
- Sda=1;
- else
- Sda=0;
- Scl=1;
- temp=Data<<1;
- Data=temp;
- BitCounter--;}
- while(BitCounter);
- Scl=0;}
- /*讀一字節的數據,并返回該字節值*/
- uchar Read(void)
- {uchar temp=0;
- uchar temp1=0;
- uchar BitCounter=8;
- Sda=1;
- do{
- Scl=0;
- Nop();
- Scl=1;
- Nop();
- if(Sda)
- temp=temp|0x01;
- else
- temp=temp&0xfe;
- if(BitCounter-1)
- {temp1=temp<<1;
- temp=temp1;}
- BitCounter--;}
- while(BitCounter);
- return(temp);}
- void WrToROM(uchar Data[],uchar Address,uchar Num)
- { uchar i;
- uchar *PData;
- PData=Data;
- for(i=0;i<num;i++)
- {Start();
- Send(0xa0);
- Ack();
- Send(Address+i);
- Ack();
- Send(*(PData+i));
- Ack();
- Stop();
- mDelay(20);}}
- void RdFromROM(uchar Data[],uchar Address,uchar Num)
- {uchar i;
- uchar *PData;
- PData=Data;
- for(i=0;i<num;i++)
- {Start();
- Send(0xa0);
- Ack();
- Send(Address+i);
- Ack();
- Start();
- Send(0xa1);
- Ack();
- *(PData+i)=Read();
- Scl=0;
- NoAck();
- Stop();}}
- void delay(uint xms)//延時函數,有參函數
- {uint x,y;
- for(x=xms;x>0;x--)
- for(y=110;y>0;y--);}
- //--------------------------寫指令---------------------------//
- write_1602com(uchar com)//****液晶寫入指令函數****
- {lcd1602_rs=0;//命令
- P0=com;
- delay(5);
- lcd1602_en=1;
- delay(5);
- lcd1602_en=0;}
- //-------------------------寫數據-----------------------------//
- write_1602dat(uchar dat)//***液晶寫入數據函數****
- {lcd1602_rs=1;//數據
- P0=dat;
- delay(5);
- lcd1602_en=1;
- delay(5);
- lcd1602_en=0;}
- //-------------------------初始化-------------------------//
- void lcd_init(void)
- {write_1602com(0x38);//設置液晶工作模式,意思:16*2行顯示,5*7點陣,8位數據
- write_1602com(0x0c);//開顯示不顯示光標
- write_1602com(0x06);//整屏不移動,光標自動右移
- write_1602com(0x01);//清顯示}
- //==============將按鍵值編碼為數值========================//
- unsigned char coding(unsigned char m)
- {unsigned char k;
- switch(m)
- {case (0x18): k=1;break;
- case (0x28): k=2;break;
- case (0x48): k=3;break;
- case (0x88): k='A';break;
- case (0x14): k=4;break;
- case (0x24): k=5;break;
- case (0x44): k=6;break;
- case (0x84): k='B';break;
- case (0x12): k=7;break;
- case (0x22): k=8;break;
- case (0x42): k=9;break;
- case (0x82): k='C';break;
- case (0x11): k='*';break;
- case (0x21): k=0;break;
- case (0x41): k='#';break;
- case (0x81): k='D';break;}
- return(k);}
- //=====================按鍵檢測并返回按鍵值===============================//
- unsigned char keynum(void)
- {unsigned char row,col,i;
- P1=0xf0;
- if((P1&0xf0)!=0xf0)
- {Delay5Ms();
- Delay5Ms();
- if((P1&0xf0)!=0xf0)
- {row=P1^0xf0; //確定行線
- i=0;
- P1=a[i]; //精確定位
- while(i<4)
- {if((P1&0xf0)!=0xf0)
- {col=~(P1&0xff); //確定列線
- break; //已定位后提前退出
- }
- else
- {
- i++;
- P1=a[i];
- }
- }
- }
- else
- {
- return 0;
- }
- while((P1&0xf0)!=0xf0);
- return(row|col); //行線與列線組合后返回
- }
- Else return 0; //無鍵按下時返回0
- }
- //=======================一聲提示音,表示有效輸入========================//
- void OneAlam(void)
- {
- ALAM=0;
- Delay5Ms();
- ALAM=1;
- }
- //========================二聲提示音,表示操作成功========================
- void TwoAlam(void)
- {
- ALAM=0;
- Delay5Ms();
- ALAM=1;
- Delay5Ms();
- ALAM=0;
- Delay5Ms();
- ALAM=1;
- }
- //========================三聲提示音,表示錯誤========================//
- void ThreeAlam(void)
- {
- ALAM=0;
- Delay5Ms();
- ALAM=1;
- Delay5Ms();
- ALAM=0;
- Delay5Ms();
- ALAM=1;
- Delay5Ms();
- ALAM=0;
- Delay5Ms();
- ALAM=1;
- }
- void FourAlam(void)
- {ALAM=0;
- mDelay(700);
- ALAM=1;
- mDelay(1000);
- ALAM=0;
- mDelay(700);
- ALAM=1;
- mDelay(1000);
- ALAM=0;
- mDelay(700);
- ALAM=1;
- mDelay(1000);
- }
- void DisplayOne(void)
- {
- //DisplayOneChar(9+N,1,'*');
- write_1602com(yi+5+N);
- write_1602dat('*');
- }
- //=======================顯示提示輸入=========================//
- void DisplayChar(void)
- {
- unsigned char i;
- if(pass==1)
- { //DisplayListChar(0,1,LockOpen);
- write_1602com(er);
- for(i=0;i<16;i++)
- {
- write_1602dat(LockOpen[i]);}
- }
- else
- {
- if(N==0) //DisplayListChar(0,1,Error);
- write_1602com(er);
- for(i=0;i<16;i++)
- {
- write_1602dat(Error[i]);}
- }
- else
- { //DisplayListChar(0,1,start_line);
- write_1602com(er);
- for(i=0;i<16;i++)
- {
- write_1602dat(start_line[i]);
- }
- }
- }
- }
- void DisplayInput(void)
- {
- unsigned char i;
- if(CorrectCont==1)
- {
- //DisplayListChar(0,0,Input);
- write_1602com(er);for(i=0;i<16;i++)
- write_1602dat(Input[i]);
- }
- }
- void ResetPassword(void)
- {
- unsigned char i;
- unsigned char j;
- if(pass==0)
- {
- pass=0;
- DisplayChar();
- ThreeAlam();
- }
- else
- {
- if(ReInputEn==1)
- {
- if(N==6)
- {
- ReInputCont++;
- if(ReInputCont==2)
- {
- for(i=0;i<6;)
- if(TempPassword[i]==InputData[i]) //將兩次輸入的新密碼作對比
- i++;
- else
- {
- //DisplayListChar(0,1,Error);
- write_1602com(er);
- for(j=0;j<16;j++)
- {
- write_1602dat(Error[j]);
- }
- ThreeAlam();
- pass=0;
- ReInputEn=0; //關閉重置功能,
- ReInputCont=0;
- DisplayChar();
- break;
- }
- }
- if(i==6)
- {
- //DisplayListChar(0,1,ResetOK);
- write_1602com(er);
- for(j=0;j<16;j++)
- {
- write_1602dat(ResetOK[j]);
- }
- TwoAlam();//操作成功提示
- WrToROM(TempPassword,0,6); //將新密碼寫入24C02存儲
- ReInputEn=0;
- }
- ReInputCont=0;
- CorrectCont=0;
- }
- else
- {
- OneAlam();
- //DisplayListChar(0, 1, again); //顯示再次輸入一次
- write_1602com(er);
- for(j=0;j<16;j++)
- {
- write_1602dat(again[j]);
- }
- for(i=0;i<6;i++)
- {
- TempPassword[i]=InputData[i]; //將第一次輸入的數據暫存起來
- }
- }
- N=0; //輸入數據位數計數器清零
- }
- }
- }
-
- }
- void Alam_KeyUnable(void)
- {
- P1=0x00;
- ALAM=~ALAM;
- Delay5Ms();
- }
- void Clean(void)
- {
- if(N<7)
- { if(N<1)N=1;
- N--;
- write_1602com(er+6+N);
- write_1602dat(' ');
- }
- OneAlam();
- }
- void Cancel(void)
- {
- unsigned char i;
- unsigned char j;
- //DisplayListChar(0, 1, start_line);
- write_1602com(er);
- for(j=0;j<16;j++)
- {
- write_1602dat(start_line[j]);
- }
- TwoAlam();//提示音
- for(i=0;i<6;i++)
- {
- InputData[i]=0;
- }
- KEY=1; //關閉鎖
- ALAM=1; //報警關
- operation=0//操作標志位清零
- pass=0;//密碼正確標志清零
- ReInputEn=0;//重置輸入充許標志清零
- ErrorCont=0;//密碼錯誤輸入次數清零
- CorrectCont=0;//密碼正確輸入次數清零
- ReInputCont=0;//重置密碼輸入次數清零
- //open_led=1;
- s3_keydown=0;
- key_disable=0;
- N=0;
- }
- //=======確認鍵,并通過相應標志位執行相應功能=============//
- void Ensure(void)
- {unsigned char i,j;
- RdFromROM(CurrentPassword,0,6); //從24C02里讀出存儲密碼
- if(N==6)
- {
- if(ReInputEn==0) //重置密碼功能未開啟
- {
- for(i=0;i<6;)
- {if(CurrentPassword[i]==InputData[i])
- {
- i++;
- }
- else
- {ErrorCont++;
- if(ErrorCont==3) //錯誤輸入計數達三次時,報警并鎖定鍵盤
- {
- write_1602com(er);
- for(i=0;i<16;i++)
- {
- write_1602dat(Error[i]);
- }
- Alam_KeyUnable();
- Delay400Ms();
- Delay400Ms();
- Delay400Ms();
- Delay400Ms();
- Delay400Ms();
- Delay400Ms();
- Delay400Ms();
- Delay400Ms();
- Delay400Ms();
- Delay400Ms();
- Delay400Ms();
- Delay400Ms();
- Delay400Ms();
- Delay400Ms();
- Delay400Ms();
- Delay400Ms();
- Delay400Ms();
- Delay400Ms();
- Delay400Ms();
- Delay400Ms();
- Delay400Ms();
- Delay400Ms();
- }
- else
- {TR0=1; //開啟定時
- key_disable=1; //鎖定鍵盤
- pass=0;
- break;
- }
- }
- }
- if(i==6)
- {
- CorrectCont++;
- if(CorrectCont==1) //正確輸入計數,當只有一次正確輸入時,開鎖,
- {
- //DisplayListChar(0,1,LockOpen);
- write_1602com(er);
- for(j=0;j<16;j++)
- {
- write_1602dat(LockOpen[j]);
- }
- TwoAlam();//操作成功提示音
- KEY=0; //開鎖
- pass=1; //置正確標志位
- TR0=1; //開啟定時
- //open_led=0; //開鎖指示燈亮
- for(j=0;j<6;j++)//將輸入清除
- {
- InputData[i]=0;
- }
- }
- else//當兩次正確輸入時,開啟重置密碼功能
- {
- //DisplayListChar(0,1,SetNew);
- write_1602com(er);
- for(j=0;j<16;j++)
- {
- write_1602dat(SetNew[j]);
- }
- TwoAlam(); //操作成功提示
- //允許重置密碼輸入
- CorrectCont=0; //正確計數器清零
- }
- }
- else
- {
- if((InputData[0]==1)&&(InputData[1]==3)&&(InputData[2]==1)&&(InputData[3]==4)&&(InputData[4]==2)&&(InputData[5]==0)){
- WrToROM(initpassword,0,6); //強制將初始密碼寫入24C02存儲
- //DisplayListChar(0,1,initword); //顯示初始化密碼
- write_1602com(er);
- for(j=0;j<16;j++)
- {
- write_1602dat(initword[j]);
- }
- TwoAlam();
- Delay400Ms();
- TwoAlam();
- N=0;
- }
- else
- {
- //DisplayListChar(0,1,Error);
- write_1602com(er);
- for(j=0;j<16;j++)
- {
- write_1602dat(Error[j]);
- }
- ThreeAlam();//錯誤提示音
- pass=0;
- }
- }
- }
- else//當已經開啟重置密碼功能時,而按下開鎖鍵,
- {
- //DisplayListChar(0,1,Er_try);
- write_1602com(er);
- for(j=0;j<16;j++)
- {
- write_1602dat(Er_try[j]);
- }
- ThreeAlam();
- }
- }
- else
- {
- //DisplayListChar(0,1,Error);
- write_1602com(er);
- for(j=0;j<16;j++)
- {
- write_1602dat(Error[j]);
- }
- ThreeAlam();//錯誤提示音
- pass=0;
- }
- N=0; //將輸入數據計數器清零,為下一次輸入作準備
-
- operation=1;
- }
- void main(void)
- {
- unsigned char KEY,NUM;
- unsigned char i,j;
- P1=0xFF;
- MOD=0x11;
- TL0=0xB0;
- TH0=0x3C;
- EA=1;
- ET0=1;
- TR0=0;
- Delay400Ms();//啟動等待,等LCM講入工作狀態
- lcd_init();//LCD初始化
- write_1602com(yi);//日歷顯示固定符號從第一行第0個位置之后開始顯示
- for(i=0;i<16;i++)
- {
- write_1602dat(name[i]);//向液晶屏寫日歷顯示的固定符號部分
- }
- write_1602com(er);//時間顯示固定符號寫入位置,從第2個位置后開始顯示
- for(i=0;i<16;i++)
- {
- write_1602dat(start_line[i]);//寫顯示時間固定符號,兩個冒號
- }
- write_1602com(er+9); //設置光標位置
- //write_1602com(0x0f); //設置光標為閃爍
- Delay5Ms(); //延時片刻(可不要)
- N=0; //初始化數據輸入位數
- while(1)
- {
- if(key_disable==1)
- Alam_KeyUnable();
- else
- ALAM=1; //關報警
- KEY=keynum();
- if(KEY!=0)
- {
- f(key_disable==1)
- {
- econd=0;
- }
- else
- {
- NUM=coding(KEY);
- {
- switch(NUM)
- {
- case ('A'): FourAlam() ; break;
- case ('B'):
- case('C'):Clean();break;
- ase('D'): ResetPassword();break; //重新設置密碼
- case('*'):Cancel();break; //取消當前輸入
- case('#'):Ensure();break; //確認鍵,
- default:
- {
- //DisplayListChar(0,1,Input);
- write_1602com(er);
- for(i=0;i<16;i++)
- {
- write_1602dat(Input[i]);
- }
- operation=0;
- if(N<6) //當輸入的密碼少于6位時,接受輸入并保存,大于6位時則無效。
- {
- OneAlam();//按鍵提示音
- //DisplayOneChar(6+N,1,'*');
- for(j=0;j<=N;j++)
- {
- write_1602com(er+6+j);
- write_1602dat('*');
- }
- InputData[N]=NUM;
- N++;
- }
- else//輸入數據位數大于6后,忽略輸入
- {
- N=6;
- break; }}}}}} }}
復制代碼
附錄4 元器件清單