基于51單片機的電子鎖設(shè)計
學(xué)院名稱: 電氣信息工程學(xué)院
專 業(yè): 電子信息工程
班 級:
姓 名:
學(xué) 號:
指導(dǎo)教師:
摘要:隨著電子產(chǎn)品向智能化和微型化的不斷發(fā)展,單片機已成為電子產(chǎn)品研制和開發(fā)中首選的控制器。隨著人們生活水平的提高,如何實現(xiàn)家庭防盜這一問題也變的尤其的突出,傳統(tǒng)的機械鎖由于其構(gòu)造的簡單,安全性能低,無法滿足人們的需要。本設(shè)計采用單片機為主控芯片,結(jié)合外圍電路,組成電子密碼鎖,用戶想要打開鎖,必先通過提供的鍵盤輸入正確的密碼才能將鎖打開,密碼輸入錯誤有提示,為了提高安全性,當(dāng)密碼輸入錯誤三次將報警。經(jīng)實驗證明,該密碼鎖具有設(shè)計方法合理,簡單易行,成本低,安全實用等特點,符合住宅、辦公室用鎖要求,具有推廣價值。
關(guān)鍵詞:電子密碼鎖,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 課題的研究內(nèi)容 2
1.3 課題的任務(wù)要求 2
第2章 系統(tǒng)方案設(shè)計 4
2.1系統(tǒng)方案設(shè)計 4
2.2 方案的選擇與論證 5
2.2.1 方案的比較與論證 5
2.2.2 系統(tǒng)結(jié)構(gòu)實現(xiàn)框圖設(shè)計 5
第3章 系統(tǒng)各模塊的硬件設(shè)計 7
3.1 電源模塊設(shè)計 7
3.2 掉電存儲模塊設(shè)計 7
3.2.1 AT24C02介紹 8
3.2.2掉電存儲電路設(shè)計 9
3.3 單片機控制模塊設(shè)計 9
3.3.1 單片機時鐘電路設(shè)計 10
3.3.2 單片機復(fù)位電路設(shè)計 11
3.4 按鍵模塊設(shè)計 11
3.5 顯示模塊設(shè)計 12
3.6 蜂鳴器模塊設(shè)計 14
第4章 系統(tǒng)軟件設(shè)計 15
4.1 系統(tǒng)軟件設(shè)計總體思路 15
4.2 系統(tǒng)軟件主程序流程圖設(shè)計 15
4.3 系統(tǒng)軟件子程序設(shè)計 16
4.3.1按鍵功能程序設(shè)計 16
4.3.2 密碼設(shè)置程序設(shè)計 16
4.3.3 開鎖程序設(shè)計 17
第5章 系統(tǒng)調(diào)試與數(shù)據(jù)分析 19
5.1 硬件電路的制作和調(diào)試 19
5.1.1 硬件電路的制作 19
5.1.2 硬件電路的調(diào)試 19
5.1.3 故障方析 20
5.2 軟硬件功能分析 20
5.3 測試結(jié)果分析 20
第6章 總結(jié)與展望 22
參考文獻(xiàn) 23
致謝 24
附錄1 電路原理圖 25
附錄2 程序 26
附錄3 實物圖 42
附錄4 元器件清單 43
《綜合工程實踐報告》
前言
目前,最常用的鎖是20世紀(jì)50年代意大利人設(shè)計的機械鎖,其機構(gòu)簡單、使用方便、價格便宜。但在使用中暴露了很多缺點:一是機械鎖是靠金屬制成的鑰匙上的不同齒形與鎖芯的配合來工作的。據(jù)統(tǒng)計,每4000把鎖中就有兩把鎖的鑰匙齒牙相同或類似,故安全性低。二是鑰匙一旦丟失,無論誰撿到都可以將鎖打開。三是機械鎖的材料大多為黃銅,質(zhì)地較軟,容易損壞。四是機械鎖鑰匙易于復(fù)制,不適于諸如賓館等公共場所使用。由于人們對鎖的安全性,方便性等性能有更高的要求,許多智能鎖(如指紋辨別、IC卡識別)也相繼問世,但這類產(chǎn)品的特點是針對特定指紋或有效卡,但能適用于保密要求高且僅供個別人使用的箱、柜、房間,其成本一般較高,在一定程度上限制了這類產(chǎn)品的普及和推廣。
電子密碼鎖是一種通過密碼輸入來控制電路或是芯片工作,控制機械開關(guān)的閉合,完成開鎖、閉鎖任務(wù)的電子產(chǎn)品。它的種類很多,有簡易的電路產(chǎn)品,也有基于芯片的性價比較高的產(chǎn)品,F(xiàn)在應(yīng)用較廣的電子密碼鎖是以芯片為核心,通過編程來實現(xiàn)的。其性能和安全性已大大超過了機械鎖,特點如下:
1.保密性好,編碼量多,遠(yuǎn)遠(yuǎn)大于彈子鎖。隨機開鎖成功率幾乎為零。
2.密碼可變。 用戶可以經(jīng)常更改密碼,防止密碼被盜,同時也可以避免因人員的更替而使鎖的密級下降。
3.誤碼輸入保護(hù)。當(dāng)輸入密碼多次錯誤時,報警系統(tǒng)自動啟動。
第1章 緒論
1.1 課題的意義和目的
隨著人們生活水平的提高,電子密碼防盜鎖作為防盜衛(wèi)士的作用日趨重要。電子密碼防盜鎖用密碼代替鑰匙,不但省去了佩戴鑰匙的煩惱,也從根本上解決了普通門鎖保密性差的缺點。根據(jù)國外的統(tǒng)計資料顯示,裝有電子防盜裝置的商業(yè)區(qū)或居民區(qū)盜竊犯罪率平均下降30%左右。目前西方發(fā)達(dá)國家已經(jīng)大量地應(yīng)用這種智能門禁系統(tǒng),但在我國的應(yīng)用還不廣泛,成本還很高。鍵盤式電子密碼在鍵盤上輸入,與打電話差不多,因而易于掌握,其突出優(yōu)點是“密碼”是記在被授權(quán)人腦子里的數(shù)字和字符,既準(zhǔn)確又可靠,不會丟失,難以被竊。
本設(shè)計系統(tǒng)主機采用8051單片機,MCS-51單片機的程序存儲器和數(shù)據(jù)存儲器的地址空間是相互獨立的,而且程序存儲器一般為ROM或EPROM,只能讀出不能寫入。擴展用的程序存儲器芯片大多采用EPROM芯片,最大可擴展到64K字節(jié)。該設(shè)計使用矩陣鍵盤輸入,LCD1602顯示輸入密碼, AT24C01存儲器存儲密碼。密碼正確,二極管發(fā)光。輸入密碼錯誤次數(shù)超過三次則系統(tǒng)報警,蜂鳴器發(fā)出報警音。
1.2 課題的研究內(nèi)容
本設(shè)計采用單片機為主控芯片,結(jié)合外圍電路,組成電子密碼鎖,用戶想要打開鎖,必先通過提供的鍵盤輸入正確的密碼才能將鎖打開,密碼輸入錯誤有提示,為了提高安全性,當(dāng)密碼輸入錯誤三次將報警。密碼可以由用戶自己修改設(shè)定,鎖打開后才能修改密碼。修改密碼之前必須再次輸入密碼,在輸入新密碼時候需要二次確認(rèn),以防止誤操作。
1.3 課題的任務(wù)要求
主要完成以下功能:
1、設(shè)置6位密碼,密碼通過鍵盤輸入,若密碼正確,則將鎖打開。
2、密碼可以由用戶自己修改設(shè)定(只支持6位密碼),鎖打開后才能修改密碼。修改密碼之前必須再次輸入密碼,在輸入新密碼時候需要二次確認(rèn),以防止誤操作。
3、報警、鎖定鍵盤功能。密碼輸入錯誤顯示器會出現(xiàn)錯誤提示,若密碼輸入錯誤次數(shù)超過3次,蜂鳴器報警并且鎖定鍵盤。
4、AT24C02保存密碼,支持復(fù)位保存,掉電保存功能。
第2章 系統(tǒng)方案設(shè)計
2.1系統(tǒng)方案設(shè)計
本設(shè)計采用STC89C52單片機為主控芯片,結(jié)合外圍電路矩陣鍵盤、液晶顯示器LCD1602和密碼存儲AT24C02等部分組成。其中矩陣鍵盤用于輸入數(shù)字密碼和進(jìn)行各種功能的實現(xiàn)。由用戶通過連接單片機的矩陣鍵盤輸入密碼,后經(jīng)過單片機對用戶輸入的密碼與自己保存的密碼進(jìn)行對比,從而判斷密碼是否正確,然后控制引腳的高低電平傳到開鎖電路或者報警電路控制開鎖還是報警,有以下幾種方案可供選擇。
方案一:選用單片機作為系統(tǒng)的核心部件,實現(xiàn)控制與處理的功能。單片機具有資源豐富、速度快、編程容易等優(yōu)點。該方案的設(shè)計框圖如圖1所示:
圖1 方案一設(shè)計框圖
方案二:采用數(shù)字電路控制,用以74LS112雙JK觸發(fā)器構(gòu)成的數(shù)字邏輯電路作為密碼鎖的核心控制,將密碼保存在JK觸發(fā)器中,與輸入密碼通過比較器比較,判斷結(jié)果是否相符合。該方案的設(shè)計框圖如圖2所示。
圖2 方案二設(shè)計框圖
2.2 方案的選擇與論證
2.2.1 方案的比較與論證
比較以上兩個方案,在同樣能達(dá)到技術(shù)指標(biāo)要求的前提下。采用數(shù)字電路設(shè)計的方案好處就是設(shè)計簡單,但控制的準(zhǔn)確性和靈活性差,故不采用。利用單片機內(nèi)部的隨機存儲器(RAM)和只讀存儲器(ROM)及其引腳資源,外接液晶顯示(LCD),鍵盤輸入等實現(xiàn)數(shù)據(jù)的處理傳輸和顯示功能,基本上能實現(xiàn)設(shè)計指標(biāo)。因此綜合考慮,本系統(tǒng)采用方案一。
2.2.2 系統(tǒng)結(jié)構(gòu)實現(xiàn)框圖設(shè)計
設(shè)計采用單片機為主控芯片,結(jié)合外圍電路,組成電子密碼控制系統(tǒng),密碼鎖共6位密碼,每位的取值范圍為0~9,用戶可以自行設(shè)定和修改密碼,每個密碼按鍵都有聲提示。用戶想要打開鎖,必先通過提供的鍵盤輸入正確的密碼才可以,密碼輸入錯誤有提示,為了提高安全性,當(dāng)密碼輸入錯誤三次將報警,期間輸入密碼無效,以防竊賊多次試探密碼。方案具體如下:
(1)矩陣鍵盤:矩陣鍵盤的工作過程可分為兩步:第一步是CPU首先檢測鍵盤上是否有鍵按下;第二步是識別哪一個鍵按下。
(2)復(fù)位電路:STC89C51的復(fù)位輸入引腳RST為單片機提供初始化的手段,可以使程序從指定處開始執(zhí)行,在STC89C51的時鐘電路工作后,只要RST引腳上出現(xiàn)兩個機器周期以上的高電平時,即可產(chǎn)生復(fù)位操作。只要RST保持高電平,則單片機循環(huán)復(fù)位。只要當(dāng)RST有高電平變?yōu)榈碗娖揭院,單片機才從0000H地址開始執(zhí)行程序,本系統(tǒng)采用按鍵復(fù)位方式的復(fù)位電路,當(dāng)復(fù)位鍵按下,系統(tǒng)自動切換到初始狀態(tài)。
(3)時鐘電路:STC89C51的時鐘可以有兩種方式,一種是內(nèi)部方式,利用芯片內(nèi)部的振蕩電路;另一種為外部方式。采用內(nèi)部振蕩方式。STC89C51內(nèi)部有一個用于構(gòu)成振蕩器的高增益反相放大器,引腳XTAL1和XTAL2分別是此放大器的輸入端和輸出端,這個放大器作為反饋元件的片外晶體和陶瓷諧振器一起構(gòu)成一個自激振動器。
(4)電源模塊:由于整個系統(tǒng)采用的電源電壓只需+5V,故利用PC機的USB串口直接供電。
(5)系統(tǒng)控制模塊:采用單片機控制芯片,它是一種低功耗、高性能的微型控制器,可以接受檢測信號,外接口亦能方便的輸出控制信號。
(6)LCD顯示模塊:該模塊主要用來顯示開鎖提示。LCD的數(shù)據(jù)端通過1K歐姆的上拉電阻接到單片機P0口。
(7)掉電存儲模塊:采用的是AT24C02,SCL移位脈沖口和SDA數(shù)據(jù)地址口接到單片機I/O口。
第3章 系統(tǒng)各模塊的硬件設(shè)計
本設(shè)計主要由單片機、矩陣鍵盤、液晶顯示器和密碼存儲等部分組成。其中矩陣鍵盤用于輸入數(shù)字密碼和進(jìn)行各種功能的實現(xiàn)。由用戶通過連接單片機的矩陣鍵盤輸入密碼,后經(jīng)過單片機對用戶輸入的密碼與自己保存的密碼進(jìn)行對比,從而判斷密碼是否正確,然后控制引腳的高低電平傳到開鎖電路或者報警電路控制開鎖還是報警。硬件部分由電源輸入部分、鍵盤輸入部分、復(fù)位部分、晶振部分、顯示部分、報警部分組成。
3.1 電源模塊設(shè)計
STC單片機USB下載線原理圖,也可以用USB口和電腦進(jìn)行串口通信PL-2303hx的USB轉(zhuǎn)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 掉電存儲模塊設(shè)計
3.2.1 AT24C02介紹
AT24C02是美國Atmel公司的低功耗CMOS型E2PROM,內(nèi)含256×8位存儲空間,具有工作電壓寬(2.5~5.5 V)、擦寫次數(shù)多(大于10000次)、寫入速度快(小于10 ms)、抗干擾能力強、數(shù)據(jù)不易丟失、體積小等特點。而且他是采用了I2C總線式進(jìn)行數(shù)據(jù)讀寫的串行器件,占用很少的資源和I/O線,并且支持在線編程,進(jìn)行數(shù)據(jù)實時的存取十分方便。AT24C02中帶有的片內(nèi)地址寄存器。每寫入或讀出一個數(shù)據(jù)字節(jié)后,該地址寄存器自動加1,以實現(xiàn)對下一個存儲單元的讀寫。所有字節(jié)均以單一操作方式讀取。為降低總的寫入時間,一次操作可寫入多達(dá)8個字節(jié)的數(shù)據(jù)。I2C總線是一種用于IC器件之間連接的二線制總線。他通過SDA(串行數(shù)據(jù)線)及SCL(串行時鐘線)兩根線在連到總線上的器件之間傳送信息,并根據(jù)地址識別每個器件。AT24C02正是運用了I2C規(guī)程,使用主/從機雙向通信,主機(通常為單片機)和從機(AT24C02)均可工作于接收器和發(fā)送器狀態(tài)。主機產(chǎn)生串行時鐘信號(通過SCL引腳)并發(fā)出控制字,控制總線的傳送方向,并產(chǎn)生開始和停止的條件。無論是主機還是從機,接收到一個字節(jié)后必須發(fā)出一個確認(rèn)信號ACK。AT24C02的控制字由8位二進(jìn)制數(shù)構(gòu)成,在開始信號發(fā)出以后,主機便會發(fā)出控制字,以選擇從機并控制總線傳送的方向。其電路如圖3-2-1所示。
SCL 為串行時鐘:串行時鐘輸入管腳用于產(chǎn)生器件所有數(shù)據(jù)發(fā)送或接收的時鐘這是一個輸入管腳。
SDL 為串行數(shù)據(jù)/地址:雙向串行數(shù)據(jù)/地址管腳用于器件所有數(shù)據(jù)的發(fā)送或接收SDL,是一個開漏輸出管腳可與其它開漏輸出或集電極開路輸出進(jìn)行線或。
A0、A1、A2 為器件地址輸入端:當(dāng)使用24C02 時最大可級聯(lián)8個器件,如果只有一個24C02被總線尋址,這三個地址輸入腳A0、A1、A2可懸空或連接到Vss。
WP為寫保護(hù): 如果WP 管腳連接到Vcc 所有的內(nèi)容都被寫保護(hù)只能讀當(dāng)WP, 管腳連接到Vss 或懸空,允許器件進(jìn)行正常的讀/寫操作。
3.2.2掉電存儲電路設(shè)計
采用AT24C02設(shè)計的掉電存儲電路如圖3-2-2所示。圖中R是上拉電阻,其作用是減少AT24C02的靜態(tài)功耗,由于AT24C02的數(shù)據(jù)線和地址線是復(fù)用的,采用串口的方式傳送數(shù)據(jù),所以只用兩根線SCL(移位脈沖)和SDA(數(shù)據(jù)/地址)與單片機傳送數(shù)據(jù)。
每當(dāng)設(shè)定一次密碼,系統(tǒng)就自動調(diào)用存儲程序,將信息保存在芯片內(nèi);當(dāng)系統(tǒng)重新上電的時候,自動調(diào)用讀存儲器程序,將存儲器內(nèi)的密碼等信息,讀到緩存單元中,供主程序使用。
3.3 單片機控制模塊設(shè)計
單片機是由運算器、控制器、存儲器、輸入設(shè)備以及輸出設(shè)備共五個基本部分組成的。單片機是把包括運算器、控制器、少量的存儲器、最基本的輸入輸出口電路、串行口電路、中斷和定時電路等都集成在一個尺寸有限的芯片上。
通常,單片機由單個集成電路芯片構(gòu)成,內(nèi)部包含有計算機的基本功能部件:中央處理器、存儲器和I/O接口電路等。因此,單片機只需要和適當(dāng)?shù)能浖巴獠吭O(shè)備相結(jié)合,便可成為一個單片機控制系統(tǒng)。
在STC89C52中有四個雙向I/O端口P0 ~ P3口,每個端口都是由鎖存器、輸出驅(qū)動器、輸入緩沖器組成。當(dāng)CPU控制系統(tǒng)與外部設(shè)備交換信息時,都是通過端口鎖存器進(jìn)行的。四個I/O端口都可作輸出輸入使用,其中P0和P2口通常用于對外部存儲器的訪問。
接通鎖存器時,P0口作為雙向I/O使用,如P0口的鎖存器的值為1,使輸出驅(qū)動器中的場效應(yīng)管截止,引腳空,此時端口可作高阻輸入。鎖存器的值為0時,下面的場效應(yīng)管導(dǎo)通,輸出為0。P0口作為地址/數(shù)據(jù)總線口使用時,由“控制”線控制將電子開關(guān)接通至“地址/數(shù)據(jù)”端,分別輸出擴展外存的低8位地址A0 ~ A7和數(shù)據(jù)D0 ~D7。一般情況下,當(dāng)P0口作輸入輸出線使用時,都要外接拉高電阻。
在P1、P2、P3端口內(nèi),都接有內(nèi)部上拉電阻,此上拉電阻分為固定部分和附加部分,當(dāng)端口的狀態(tài)要從0變?yōu)?時,在發(fā)生變化的哪個機器周期的S1P1和S1P2接通附加的拉高電路以增加變化的速度,否則這個狀態(tài)的變化將十分緩慢。附加的拉高電路允許通過的電流比普通的上拉電阻大100倍。
STC89C52有40條引腳,分為端口線、電源線和控制線三類。如圖3-3為STC89C52的引腳結(jié)構(gòu)圖:
圖3-3 89C52引腳圖
3.3.1 單片機時鐘電路設(shè)計
時鐘電路由一個晶體振蕩器12MHZ和兩個22pF的瓷片電容組成,瓷片電容叫晶振的負(fù)載電容。時鐘電路用于產(chǎn)生單片機工作所需要的時鐘信號,而時序所研究的是指令執(zhí)行中各信號之間的相互關(guān)系。單片機本身就如一個復(fù)雜的同步時序電路,為了保證同步工作方式的實現(xiàn),電路應(yīng)在唯一的時鐘信號控制下嚴(yán)格地工作。時鐘電路接法是,AT89C52的外接晶體引腳為XTAL1和XTAL2,是利用單片機內(nèi)部的振蕩器產(chǎn)生,只要在XTAL1、XTAL2引腳上外接定時反饋電路,內(nèi)部振蕩器便自激振蕩,產(chǎn)生時鐘輸出到內(nèi)部的定時控制邏輯。其電路如圖3-3-1所示:
圖3-3-1 時鐘電路圖
3.3.2 單片機復(fù)位電路設(shè)計
單片機在啟動時都需要復(fù)位,以使CPU及系統(tǒng)各部件處于確定的初始狀態(tài),并從初態(tài)開始工作。89系列單片機的復(fù)位信號是從RST引腳輸入到芯片內(nèi)的施密特觸發(fā)器中的。當(dāng)系統(tǒng)處于正常工作狀態(tài)時,且振蕩器穩(wěn)定后,如果RST引腳上有一個高電平并維持2個機器周期(24個振蕩周期)以上,則CPU就可以響應(yīng)并將系統(tǒng)復(fù)位。單片機系統(tǒng)的復(fù)位方式有:手動按鈕復(fù)位和上電復(fù)位。
本設(shè)計采用手動按鈕復(fù)位,需要人為在復(fù)位輸入端RST上加入高電平。一般采用的辦法是在RST端和正電源Vcc之間接一個按鈕。當(dāng)人為按下按鈕時,則Vcc的+5V電平就會直接加到RST端。手動按鈕復(fù)位的電路如所示。由于人的動作再快也會使按鈕保持接通達(dá)數(shù)十毫秒,所以,完全能夠滿足復(fù)位的時間要求。根據(jù)實際操作的經(jīng)驗,下面給出這種復(fù)位電路的電容、電阻參考值。C=10uF,Rl=10K,R2=1K,如圖3-3-2所示。
圖3-3-2復(fù)位電路圖
3.4 按鍵模塊設(shè)計
本系統(tǒng)需要的按鍵數(shù)量較多,為了減少I/O口的占用,將按鍵排列成矩陣形式,如圖3-4所示。在矩陣式鍵盤中,每條水平線和垂直線在交叉處不直接連通,而是通過一個按鍵加以連接。這樣,一個端口(如P1口)就可以構(gòu)成4*4=16個按鍵,比之直接將端口線用于鍵盤多出了一倍,而且線數(shù)越多,區(qū)別越明顯,由此可見,在需要的鍵數(shù)比較多時,采用矩陣法來做鍵盤是合理的。
圖3-4 矩陣鍵盤圖
矩陣鍵盤的工作過程可分為兩步:第一步是CPU首先檢測鍵盤上是否有鍵按下;第二步是識別哪一個鍵按下。
檢測鍵盤上是否有鍵按下的處理方法是:將行線送入全掃描字,讀入列線的狀態(tài)來判別。
識別鍵盤中哪一個鍵按下的處理方法是:將行線逐列置成低電平,檢查列輸入狀態(tài),稱為逐行掃描。
例如:P0.7~P0.0設(shè)為11111110,然后與11110000相與,如果結(jié)果不等于11110000,則判斷有按鍵按下,即這種情況是有按鍵按下,而且是P0.0為低電平,可知是第一行有一個按鍵按下,接下來就通過判斷P0口的值來檢測是哪個按鍵,如果值為11101110,即P0.4為低電平,初始值可知P0.0也是低電平,這是就可以判斷是第一行第一個按鍵是按下的;如果為11011110,則是第一行第二個按鍵是按下的;如果為10111110,則是第一行第三個按鍵是按下的;如果為01111110,則是第一行第四個按鍵是按下的。由此類推,便可以判斷是哪個按鍵按下,之后便可以進(jìn)行接下來的操作。
3.5顯示模塊設(shè)計
液晶顯示模塊已作為很多電子產(chǎn)品中都可以看到,顯示的主要是數(shù)字、專用符號和圖形。1602型LCD顯示模塊具有體積小,功耗低,顯示內(nèi)容豐富等特點。1602型LCD可以顯示2行16個字符,有8位數(shù)產(chǎn)品的通過器件,如在計算器、萬用表、電子表及很多家用電子據(jù)總線D0-D7和RS,R/W,EN三個控制端口,工作電壓為5V,并且具有字符對比度調(diào)節(jié)和背光功能。引腳功能說明:
LCD1602采用標(biāo)準(zhǔn)的14腳(無背光)或16腳(帶背光)接口,各引腳接口說明:
第1腳:VSS為地電源。
第2腳:VDD接5V正電源。
第3腳:VL為液晶顯示器對比度調(diào)整端,接正電源時對比度最弱,接地時對比 度最高,對比度過高時會產(chǎn)生“鬼影”,使用時可以通過一個10K的電位器調(diào)整對比度。
第4腳:RS為寄存器選擇,高電平時選擇數(shù)據(jù)寄存器、低電平時選擇指令寄存器。
第5腳:R/W為讀寫信號線,高電平時進(jìn)行讀操作,低電平時進(jìn)行寫操作。當(dāng)RS和R/W共同為低電平時可以寫入指令或者顯示地址,當(dāng)RS為低電平R/W為高電平時可以讀忙信號,當(dāng)RS為高電平R/W為低電平時可以寫入數(shù)據(jù)。
第6腳:E端為使能端,當(dāng)E端由高電平跳變成低電平時,液晶模塊執(zhí)行命令。
第7~14腳:D0~D7為8位雙向數(shù)據(jù)線。
第15腳:背光源正極。
第16腳:背光源負(fù)極。
LCD連線圖如圖3-5所示。
圖3-5 LCD1602連線圖
只有按下鍵盤上的開啟按鍵后,顯示器才處于開啟狀態(tài)。同理只有按下關(guān)閉按鍵后顯示器才處于關(guān)閉狀態(tài)。否則顯示器將一直處于初始狀態(tài),當(dāng)需要對密碼鎖進(jìn)行開鎖時,按下鍵盤上的開鎖按鍵后利用鍵盤上的數(shù)字鍵0-9輸入密碼,每按下一個數(shù)字鍵后在顯示器上顯示一個*,輸入多少位就顯示多少個*。當(dāng)密碼輸入完成時,按下確認(rèn)鍵,如果輸入的密碼正確的話, LCD子顯示“RIGHT”,單片機其中P2.0引角會輸出低電平,使三極管T2導(dǎo)通,電磁鐵吸合,電子密碼鎖被打開,如果密碼不正確,LCD顯示屏?xí)@示“ERROR”,P2.0輸出的是高電平,電子密碼鎖不能被打開。通過LCD顯示屏,可以清楚的判斷出密碼鎖所處的狀態(tài)。
3.6蜂鳴器模塊設(shè)計
三極管起開關(guān)作用,單片機驅(qū)動口輸出驅(qū)動電平并通過三極管放大驅(qū)動電流就能使蜂鳴器發(fā)出聲音。三極管基極低電平時導(dǎo)通,蜂鳴器發(fā)聲,基極高電平則使三極管關(guān)閉,蜂鳴器停止發(fā)聲。蜂鳴器報警電路如圖3-6所示。
圖3-6蜂鳴器連線圖
第4章 系統(tǒng)軟件設(shè)計
4.1 系統(tǒng)軟件設(shè)計總體思路
當(dāng)用戶需要開鎖時,先按鍵盤開鎖鍵之后按鍵盤的數(shù)字鍵0-9輸入密碼。密碼輸完后按下確認(rèn)鍵,如果密碼輸入正確則開鎖,不正確顯示密碼錯誤重新輸入密碼,當(dāng)三次密碼錯誤則發(fā)出報警;當(dāng)用戶需要修改密碼時,先按下鍵盤設(shè)置鍵后輸入原來的密碼,只有當(dāng)輸入的原密碼正確后才能設(shè)置新密碼。
4.2 系統(tǒng)軟件主程序流程圖設(shè)計
如圖4-2所示為主程序流程圖,開始接上電源,程序進(jìn)行初始化設(shè)置,然后在鍵盤上輸入密碼,此系統(tǒng)進(jìn)行鍵盤掃描,密碼正確,開鎖成功,密碼錯誤3次出錯報警,選擇是否修改密碼,若要修改密碼,先輸入舊密碼密碼,密碼正確后設(shè)置新密碼,錯誤時報警,需要兩次確認(rèn)新密碼,確認(rèn)后,密碼修改成功,否則結(jié)束最終返回。
4.3 系統(tǒng)軟件子程序設(shè)計
4.3.1按鍵功能程序設(shè)計
如圖4-3-1為按鍵功能流程圖,在按鍵當(dāng)中,有與輸入、開鎖、清除、設(shè)置、確認(rèn)的程序相對應(yīng)的按鍵,并按順序與輸入的數(shù)相比較,當(dāng)輸入正確時,進(jìn)入密碼程序,錯誤時進(jìn)行清除,輸入兩次新密碼正確時,可進(jìn)行重新設(shè)置密碼,最后確認(rèn)程序。
圖4-3-1 按鍵功能程序流程圖
4.3.2 密碼設(shè)置程序設(shè)計
如圖4-3-2為密碼設(shè)置流程圖,開始按下設(shè)置鍵,輸入舊密碼,如果錯誤累計三次,進(jìn)行報警程序。如輸入正確,可以修改密碼,確認(rèn)后再次輸入新密碼,如兩次輸入一樣,則更改成功。如果兩次輸入的新密碼不一樣,則修改密碼失敗,重新返回設(shè)置新密碼。
圖4-3-2密碼重置程序流程圖
4.3.3 開鎖程序設(shè)計
如圖4-3-3為開鎖流程圖,開始時按開鎖鍵,輸入密碼,如果輸入正確,則開鎖成功。如果輸入錯誤累計達(dá)到三次,則執(zhí)行報警程序。
圖4-3-3 開鎖程序流程圖
第5章 系統(tǒng)調(diào)試與數(shù)據(jù)分析
5.1 硬件電路的制作和調(diào)試
5.1.1 硬件電路的制作
本電路由相關(guān)元器件在通用板上面焊接而成,在焊接之前,用萬用表檢查各個元器件是否有損壞,比如電容、發(fā)光二極管是否開路,之后設(shè)計好各個元器件在電路板上面的布局,做到合理、美觀。布局完成之后就可以進(jìn)行焊接了,元器件之間的連線由帶有絕緣皮的導(dǎo)線完成。焊接的過程中不可三心二意,不要造成短路、開路等錯誤,盡量做到一步到位
5.1.2 硬件電路的調(diào)試
本次調(diào)試主要采用proteus軟件仿真。首先設(shè)計電子密碼鎖的源程序,源程序經(jīng)過匯編后,生成的目標(biāo)文件經(jīng)過仿真調(diào)試。依次按下密碼后按確定鍵,二極管亮,表示密碼正確開門。
系統(tǒng)調(diào)試包括硬件調(diào)試和軟件調(diào)試,硬件調(diào)試的任務(wù)排除系統(tǒng)的硬件電路.包括設(shè)計和工藝故障,軟件調(diào)試是利用開發(fā)工具進(jìn)行在線住址調(diào)試,除發(fā)現(xiàn)和解決程序錯誤之外,也可以發(fā)現(xiàn)硬件故障.
(1) 靜態(tài)調(diào)試
第一步為目測,單片機應(yīng)用系統(tǒng)中大部分電路安裝在印制電路板上,因此對每一塊加工好的印制電路板要進(jìn)行仔細(xì)的檢查。第二步為示波器測試,目測檢查后,可進(jìn)行示波器測試。第三步為加電檢查,第四步實際聯(lián)機檢查。但注意示波器必須接在入口而不能接在電壓大的端口上。
(2) 動態(tài)調(diào)試
一般方法是由近及遠(yuǎn)、由分到合。首先按邏輯功能將用戶系統(tǒng)硬件電路分為若干份,先分塊調(diào)試,當(dāng)調(diào)試某塊電路時,與該電路無關(guān)的器件全部從用戶系統(tǒng)中去掉,這樣,可將故障范圍限定在某個局部電路上。當(dāng)各塊電路調(diào)試無故障后,將各塊電路加入系統(tǒng)中,再對個塊電路功能及電路間可能存在的相互聯(lián)系進(jìn)行試驗。經(jīng)歷這樣一個調(diào)試過程后,大部分硬件故障基本可以排除。
軟件調(diào)試一般步驟:
先獨立后聯(lián)機:一個子程序一個子程序的進(jìn)行調(diào)試,最后單片機連起來總調(diào)。
先分塊后組合:逐個芯片逐步調(diào)試再和整體芯片一起進(jìn)行總調(diào)。
先單步后連續(xù):先執(zhí)行一條指令,在每步后,又返回監(jiān)控調(diào)試狀態(tài)在從程序任意一條地址處啟動,最后全速運行。
5.1.3 故障方析
現(xiàn)象一:通電調(diào)試硬件的時候,無論單片機P2.0~P2.5與單片機20腳(GND)相連,還是將單片機P3.4~P3.7與單片機20腳(GND)相連,發(fā)光二極管和LCD都不亮;
故障方析:可能電路未供上電,或者各個發(fā)光二極管陰極和數(shù)碼管位選端均未與單片機相連;
解決方法:用數(shù)字萬用表蜂鳴擋兩個表筆分別搭到單片機40腳(VCC)和電源排針,不響,可知電源未接通,將其接通,排除故障。
5.2 軟硬件功能分析
在軟硬件聯(lián)調(diào)時,按基本功能依次調(diào)試。當(dāng)電路通上+5v電源后,程序自動調(diào)入初始密碼,此時依次輸入:000000,然后按確認(rèn)鍵,此時鎖會打開,可以看到顯示open,密碼鎖打開。首次使用輸入:131420,對密碼進(jìn)行初始化,顯示出現(xiàn):initpassword,證明密碼初始化完成,此時初始密碼即為:000000。按下取消鍵,此時鎖關(guān)閉,所有輸入清除。在開鎖狀態(tài)下,再次輸入正確的密碼并按下確認(rèn)鍵,此時聽到兩聲提示,輸入新的六位密碼并按重設(shè)鍵,再重復(fù)輸入一次新密碼并按重設(shè)鍵,會聽到兩聲提示音,重設(shè)密碼成功,內(nèi)部保存新密碼并存儲到AT24C02。如兩次輸入的新密碼不一樣,則重設(shè)密碼失敗。報警并鎖定鍵盤:當(dāng)輸入密碼錯誤后,報警并鎖定鍵盤3秒,如3秒內(nèi)又有按鍵,3秒再啟動。
5.3 測試結(jié)果分析
經(jīng)通電測試檢查完畢,本系統(tǒng)可以實現(xiàn)的功能如下:
1、設(shè)置6位密碼,密碼通過鍵盤輸入,若密碼正確,則將鎖打開。
2、密碼可以由用戶自己修改設(shè)定(只支持6位密碼),鎖打開后才能修改密碼。修改密碼之前必須再次輸入密碼,在輸入新密碼時候需要二次確認(rèn),以防止誤操作。
3、報警、鎖定鍵盤功能。密碼輸入錯誤顯示器會出現(xiàn)錯誤提示,若密碼輸入錯誤次數(shù)超過3次,蜂鳴器報警并且鎖定鍵盤。
4、AT24C02保存密碼,支持復(fù)位保存,掉電保存功能。
第6章 總結(jié)與展望
本次設(shè)計的電子密碼鎖是以手動鍵盤輸入密碼的,通過這幾個星期對電子密碼鎖的研究學(xué)習(xí),發(fā)覺這種密碼輸入方式可以進(jìn)行改革。在越來越高科技化的今天,遙控控制顯的愈發(fā)重要,今后的電子密碼鎖應(yīng)該具有以紅外技術(shù)或無線電技術(shù)為輔助的密碼按鍵輸入遠(yuǎn)程交互技術(shù),這樣就能遠(yuǎn)程輸入密碼完成操作。也可以放棄傳統(tǒng)的按鍵輸入密碼模式,借助傳感器技術(shù)運用聲控來實現(xiàn)密碼輸入,又或者人臉識別技術(shù),還有一種就是用戶指紋輸入方式,這些都可以使開鎖的時間更短更方便。電子密碼鎖產(chǎn)業(yè)將向靜態(tài)功耗更低,外圍電路更簡化,可提供的功能或控制口更多,更人性化高科技化的方向發(fā)展。
通過本次畢業(yè)設(shè)計的鍛煉,我學(xué)到了很多有關(guān)電子密碼鎖的設(shè)計方法與工作原理,鞏固了單片機知識。無論從理論到實踐都使我學(xué)到了很多東西,它不僅可以鞏固了以前所學(xué)過的知識,而且學(xué)到了很多在書本上所沒有學(xué)到過的知識。同時也明白了理論與實踐相結(jié)合的重要性,只有理論知識是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識與實踐相結(jié)合起來,從理論中得出結(jié)論,才能真正為社會服務(wù),從而提高自己的實際動手能力和獨立思考的能力。
參考文獻(xiàn)
[1] 葉啟明.單片機制作的新型安全密碼鎖[J].家庭電子.2000,第六期:24-27
[2] 胡喬木. 中國大百科全書.中國大百科全書出版社. 1993
[3]李明喜.新型電子密碼鎖的設(shè)計[J].機電產(chǎn)品開發(fā)與創(chuàng)新.2004,第八期:77-79
[4]董繼成.一種新型安全的單片機密碼鎖[J].電子技術(shù).2004,第三期:55-60
[5]王寬仁.可靠安全的智能密碼鎖[J].電子技術(shù)應(yīng)用.2001年第2期
[6]何立民.MCS-51系列單片機應(yīng)用系統(tǒng)設(shè)計系統(tǒng)配置與接口技術(shù)[M].北京:北京航空航天大學(xué)出版社,1999
[7]胡漢才.單片機原理及其接口技術(shù)(第2版)[M].北京:清華大學(xué)出版社,2004
[8]江志紅. 51單片機技術(shù)與應(yīng)用系統(tǒng)開發(fā)[M]. 清華大學(xué)出版社, 2008
[9]童詩白,華成英. 模擬電子技術(shù)基礎(chǔ)[M] 高等教育出版社,2000
[10]閻石. 數(shù)字電子技術(shù)基礎(chǔ)[第四版][M].高等教育出版社.1998.11
[11]任艷艷. 基于AT89C51單片機多功能密碼鎖的研究[J]. 重慶職業(yè)技術(shù)學(xué)院學(xué)報.2008.5
[12]周功明. 基于AT89C2051單片機的防盜自動報警密碼鎖系統(tǒng)的設(shè)計[J]. 綿陽師范學(xué)院學(xué)報.2007.5
[13]周鑫,何建新, 劉琥. 基于單片機的電子密碼鎖控制電路設(shè)計[J] 成都信息工程學(xué)院學(xué)報. 2009,(08)
[14] 郭海英. 基于單片機的電子安全密碼鎖的設(shè)計[J]. 佛山職業(yè)技術(shù)學(xué)院現(xiàn)代電子技術(shù)2005 (13)
[15] 王金國.采用單片機的電子密碼鎖控制電路[J].山東煤炭科技 ,2000 ,(3) :30 - 33.
[16] 寧愛民. 應(yīng)用AT89C2051 單片機設(shè)計電子密碼鎖[J]. 淮海工學(xué)院學(xué)報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,
致謝
在這一個月的設(shè)計和制作過程中,在老師和同學(xué)的幫助下,我順利的完成了此次實訓(xùn)。通過這次電子綜合實訓(xùn),使我深刻地認(rèn)識到學(xué)好專業(yè)知識的重要性,也理解了理論聯(lián)系實際的含義,并且檢驗了大學(xué)四年的學(xué)習(xí)成果。雖然在這次設(shè)計中對于知識的運用和銜接還不夠熟練。但是我將在以后的工作和學(xué)習(xí)中繼續(xù)努力、不斷完善。這四周的課程設(shè)計是對過去所學(xué)知識的系統(tǒng)提高和擴充的過程,為今后的發(fā)展打下了良好的基礎(chǔ),而且為我們下學(xué)期的畢業(yè)設(shè)計提供了模板。
附錄1 電路原理圖
附錄2 程序
- #include<REG51.h>
- #include<intrins.h>
- #define LCM_Data P0
- #define uchar unsigned char
- #define uint unsigned int
- #define w 8//定義密碼位數(shù)
- sbit lcd1602_rs=P2^6;
- sbit lcd1602_en=P2^7;
- sbit Scl=P3^4; //24C02串行時鐘
- sbit Sda=P3^5; //24C02串行數(shù)據(jù)
- sbit ALAM = P2^0; //報警
- sbit KEY = P3^7; //開鎖
- bit operation=0; //操作標(biāo)志位
- bit pass=0; //密碼正確標(biāo)志
- bit ReInputEn=0; //重置輸入充許標(biāo)志
- bit s3_keydown=0; //3秒按鍵標(biāo)志位
- bit key_disable=0; //鎖定鍵盤標(biāo)志
- unsigned char countt0,second; //t0中斷計數(shù)器,秒計數(shù)器
- 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]; //輸入密碼暫存區(qū)
- unsigned char CurrentPassword[6]={1,3,1,4,2,0}; //當(dāng)前密碼值
- unsigned char TempPassword[6];
- unsigned char N=0; //密碼輸入位數(shù)記數(shù)
- unsigned char ErrorCont;//錯誤次數(shù)計數(shù)
- unsigned char CorrectCont;//正確輸入計數(shù)
- unsigned char ReInputCont; //重新輸入計數(shù)
- 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();}
- /*應(yīng)答位*/
- void Ack(void)
- {Sda=0;
- Nop();
- Scl=1;
- Nop();
- Scl=0;}
- /*反向應(yīng)答位*/
- void NoAck(void)
- { Sda=1;
- Nop();
- Scl=1;
- Nop();
- Scl=0;}
- /*發(fā)送數(shù)據(jù)子程序,Data為要求發(fā)送的數(shù)據(jù)*/
- 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;}
- /*讀一字節(jié)的數(shù)據(jù),并返回該字節(jié)值*/
- 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)//延時函數(shù),有參函數(shù)
- {uint x,y;
- for(x=xms;x>0;x--)
- for(y=110;y>0;y--);}
- //--------------------------寫指令---------------------------//
- write_1602com(uchar com)//****液晶寫入指令函數(shù)****
- {lcd1602_rs=0;//命令
- P0=com;
- delay(5);
- lcd1602_en=1;
- delay(5);
- lcd1602_en=0;}
- //-------------------------寫數(shù)據(jù)-----------------------------//
- write_1602dat(uchar dat)//***液晶寫入數(shù)據(jù)函數(shù)****
- {lcd1602_rs=1;//數(shù)據(jù)
- P0=dat;
- delay(5);
- lcd1602_en=1;
- delay(5);
- lcd1602_en=0;}
- //-------------------------初始化-------------------------//
- void lcd_init(void)
- {write_1602com(0x38);//設(shè)置液晶工作模式,意思:16*2行顯示,5*7點陣,8位數(shù)據(jù)
- write_1602com(0x0c);//開顯示不顯示光標(biāo)
- write_1602com(0x06);//整屏不移動,光標(biāo)自動右移
- write_1602com(0x01);//清顯示}
- //==============將按鍵值編碼為數(shù)值========================//
- 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; //關(guān)閉重置功能,
- 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]; //將第一次輸入的數(shù)據(jù)暫存起來
- }
- }
- N=0; //輸入數(shù)據(jù)位數(shù)計數(shù)器清零
- }
- }
- }
-
- }
- 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; //關(guān)閉鎖
- ALAM=1; //報警關(guān)
- operation=0//操作標(biāo)志位清零
- pass=0;//密碼正確標(biāo)志清零
- ReInputEn=0;//重置輸入充許標(biāo)志清零
- ErrorCont=0;//密碼錯誤輸入次數(shù)清零
- CorrectCont=0;//密碼正確輸入次數(shù)清零
- ReInputCont=0;//重置密碼輸入次數(shù)清零
- //open_led=1;
- s3_keydown=0;
- key_disable=0;
- N=0;
- }
- //=======確認(rèn)鍵,并通過相應(yīng)標(biāo)志位執(zhí)行相應(yīng)功能=============//
- 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) //錯誤輸入計數(shù)達(dá)三次時,報警并鎖定鍵盤
- {
- 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) //正確輸入計數(shù),當(dāng)只有一次正確輸入時,開鎖,
- {
- //DisplayListChar(0,1,LockOpen);
- write_1602com(er);
- for(j=0;j<16;j++)
- {
- write_1602dat(LockOpen[j]);
- }
- TwoAlam();//操作成功提示音
- KEY=0; //開鎖
- pass=1; //置正確標(biāo)志位
- TR0=1; //開啟定時
- //open_led=0; //開鎖指示燈亮
- for(j=0;j<6;j++)//將輸入清除
- {
- InputData[i]=0;
- }
- }
- else//當(dāng)兩次正確輸入時,開啟重置密碼功能
- {
- //DisplayListChar(0,1,SetNew);
- write_1602com(er);
- for(j=0;j<16;j++)
- {
- write_1602dat(SetNew[j]);
- }
- TwoAlam(); //操作成功提示
- //允許重置密碼輸入
- CorrectCont=0; //正確計數(shù)器清零
- }
- }
- 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//當(dāng)已經(jīng)開啟重置密碼功能時,而按下開鎖鍵,
- {
- //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; //將輸入數(shù)據(jù)計數(shù)器清零,為下一次輸入作準(zhǔn)備
-
- 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講入工作狀態(tài)
- 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); //設(shè)置光標(biāo)位置
- //write_1602com(0x0f); //設(shè)置光標(biāo)為閃爍
- Delay5Ms(); //延時片刻(可不要)
- N=0; //初始化數(shù)據(jù)輸入位數(shù)
- while(1)
- {
- if(key_disable==1)
- Alam_KeyUnable();
- else
- ALAM=1; //關(guān)報警
- 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; //重新設(shè)置密碼
- case('*'):Cancel();break; //取消當(dāng)前輸入
- case('#'):Ensure();break; //確認(rèn)鍵,
- default:
- {
- //DisplayListChar(0,1,Input);
- write_1602com(er);
- for(i=0;i<16;i++)
- {
- write_1602dat(Input[i]);
- }
- operation=0;
- if(N<6) //當(dāng)輸入的密碼少于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//輸入數(shù)據(jù)位數(shù)大于6后,忽略輸入
- {
- N=6;
- break; }}}}}} }}
復(fù)制代碼
附錄4 元器件清單