久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6068|回復: 3
打印 上一主題 下一主題
收起左側

51單片機新型安全保險柜鎖設計資料

[復制鏈接]
跳轉到指定樓層
樓主

目前,人們對個人財產安全的要求越來越高,一種新型的較為安全的鎖具隨之產生,該類鎖具利用生物的指紋識別技術進行解鎖。本次設計就是通過指紋識別技術為核心的電路設計。


本次設計是通過52單片機為主控部分,將編寫好程序驅動指紋模塊,指紋模塊中有自己特有的程序,然后就可以進行指紋的采集,圖像的對比;單片機再連接其他的數字按鍵模塊進行數字密碼輸入,顯示模塊進行操作提示,存儲模塊進行數據存儲;電機模塊進行模擬開鎖,從而完成整個電路的設計。整個系統中還有電壓源提供,方便不同電路的電壓使用。該設計的工作原理是通過單片機的串口通信來對各模塊進行控制,主要是利用程序的編寫來實現,通過01代碼來表示各模塊的應用情況。

本課題根據生物識別技術來設計的一款指紋密碼鎖,主要利用了指紋識別技術識別人的指紋,從而進行身份驗證。本設計的指紋密碼鎖只有在指紋身份驗證正確和密碼輸入正確的情況下方可開門,大大提高了安全性。根據設計要求我們采用了以指紋采集模塊等模塊組成的系統設計方案。指紋模塊采用PS1802的指紋識別器,鍵盤采用的是4*4矩陣鍵盤,用來實現密碼的鍵入,保證操作的進行。此模塊主要使用LCD12864液晶進行顯示。



人們的生活品質不斷得到提高,貴重物品也開始漸漸出現在各家庭中,對于普通鎖具的安全性能,人們開始擔心。雖然,鎖具的發明與使用已經擁有悠久的歷史了,但是,傳統鎖具制作簡單,內部結構普通單一,使得這些鎖具容易被不法分子破壞,給人們的財產安全帶來隱患。目前市場的鎖具多種多樣,人們對于鎖具的選擇也不再是單一的,傳統的類型,一種人性化設計的鎖具漸漸受到廣大群眾的喜愛——指紋密碼鎖。這類鎖與傳統的鎖具相比最大的優勢在于能夠根據人的指紋進行開鎖,用戶可以是一個人,也可以是一家人,只需在指紋密碼鎖中錄入一家人的指紋圖像信息,再加上數字密碼信息,就可以輕松生成一把屬于你自己的智能鑰匙,獨一無二,讓偷竊者無從下手。由此,指紋識別技術與電子密碼相結合的鎖具漸漸出現在我們生活中,我們自己的手指就是我們打開大門的鑰匙,不用擔心鑰匙弄丟,進不來家門的尷尬現象。該鎖只有在指紋身份驗證正確和密碼輸入正確的情況下才執行開鎖,超過三次輸入不正確會有報警鳴聲,以提示我們該用戶操作不合法,需要警惕。為我們的生活帶來了便捷,提高了我們生活的質量。

為什么會出現這樣的問題,指紋電子密碼鎖與傳統的鎖具相比有下列的優點與缺點:

第一,在鎖具的設計方面上,傳統的鎖具設計單一,開鎖的方式是通過鐵質的鑰匙,插入鎖孔來轉動。

第二,對于鑰匙管理方面,傳統鎖具的鑰匙經常被不法分子利用,他們通過跟蹤鑰匙的主人,然后偷竊他們的鑰匙,對鑰匙進行復制,最后入侵他們的家里進行偷竊。

第三,在鎖具的安全性能方面,傳統鎖具容易被偷竊者破壞,偷竊者只需帶上一些小巧精密的工具,就能把鎖撬開。

第四,指紋密碼鎖相對于傳統的鎖具而言,其最大的優勢在于能夠利用個人的獨一無二的指紋信息和其對應的數字密碼進行解鎖。能夠做到雙重保險,讓偷竊者無從下手。

經過調查發現,市場上賣的鎖大部分都是性能比較低的,人們也為此感到擔憂。為了使用更精確,更安全的鎖,人們把目光投向了電子密碼鎖,通過數字的排練方式來開門的鎖,這樣就解決鑰匙丟失和被復制的問題。但是,隨著科技的進步,工具的先進發展,有些不法分子開始購買一些專門破解密碼的儀器,只要讓它連接鎖就能快速尋找出開鎖的密碼。這樣的鎖還是不夠安全,人們又進一步的去探索,在探索過程中,人們發現了一種利用生物指紋識別技術的開鎖方式,就是通過檢測人的指紋,識別指紋是否是正確指紋,然后進行開門的鎖。該鎖在數字電子鎖的基礎上外加了指紋識別的功能,這樣就能解決數字密碼被破解的風險,起到雙重保險的作用。加強了人們財產的安全性,保護了自己的個人財產,減少了不必要的擔心。

   1.2指紋密碼鎖課題研究背景

歷史的火輪在向前,科學技術在更新,鎖具的發展也在不停地向前走,從簡單的一字型鎖、鋸齒型鎖、摩擦表面鎖、到復雜的十字型鎖、點陣式的鎖、感應芯片式鎖、語音開門鎖、電子數字密碼鎖、瞳孔識別鎖、指紋識別密碼鎖等等。其中指紋識別密碼鎖是人們最喜歡用的一種鎖。究其原因如下:第一,指紋識別密碼鎖相對于語音,感應芯片開鎖方式而言,其最大的好處就是不會因為感冒而導致聲音發生變化或者芯片不靈敏而導致開不了鎖的現象。第二,指紋識別密碼鎖與十字型鎖,點陣式鎖的不同之處,在于不用隨時攜帶鑰匙,再也不用擔心鑰匙弄丟,就不了家門,或者被不法分子鎖利用對家庭的財產造成損失。第三,指紋識別密碼鎖與電子數字機密碼鎖相比,鎖具的安全性能更完善,能夠起到雙重保險的作用。為人們的生產、生活帶來便捷,也體現了智能化、人性化的設計理念。因此,指紋識別密碼鎖具有非常大的發展前景。

鎖具的發明也有一段歷史了,從古老的商代開始,人們為了保護好自己的家庭財產就去鑄鐵鋪開始研究制作鎖具,鎖具的出現標志著人們的個人意識開始漸漸萌生,保護私人財產的能力開始漸漸發展。到了我們現代,大家仍然喜歡用鎖,鎖上我們個人比較隱私的,重要的物品。于是便出現了各種各樣的鎖具,有鋸齒型的、摩擦表面型的、十字型的、點陣式的、語音識別、指紋識別和電子數字密碼鎖等等。人們開始嘗試用各種類型的鎖具,對比鎖具之間的差異。其中發展得最快的就是指紋識別鎖,伴隨著第三次工業革命后,計算機的發明和普及,使得計算機對圖片的處理能力不斷加強,計算機能計算并處理越來越復雜的圖片。這就為指紋識別技術奠定了基礎,在前期研究算法的過程中,不斷編寫能夠處理圖像清晰度的程序,讓指紋識別技術能平穩、快速的發展,使之成為最具有發展潛力的一門技術。在1990年之后,全球的指紋識別技術發展趨于成熟化,機密化,當時,只是應用在國家級的刑事案件調查和檢察院身份認證的特殊需要中,在一般的民用市場是往往是看不到此類鎖具的,只有在個別富豪中才擁有此類鎖具。 隨著人口的增多,市場的不斷擴大化,該類鎖具也漸漸開始在民用市場中普及,普通百姓也可以擁有了選擇該鎖具的權利。很快就在民用的家庭中出現了指紋抽屜鎖、指紋筆記本鎖、指紋保險柜鎖等等,人們漸漸熟悉了指紋識別的開鎖方式。

   1.3指紋識別技術的介紹

指紋識別技術是通過利用人類所特有的指紋來進行對比識別的一項技術。主要是記錄下人類指紋的旋轉度,條紋差距,條紋波形及指紋的平面受力面積大小,通過計算機進行特殊的算法處理后,能夠計算錄入指紋與輸入指紋之間的相似程度進而判斷該指紋是否為正確指紋的過程。

指紋模塊一般由感應部分和內部芯片部分組成,感應部分是由紅外線閃光的感應斜坡臺構成,用戶只需在斜坡臺上輕輕按下,等待感應模塊感應,一般需要錄入兩次指紋,第一次是初級采集指紋圖像,第二次在第一次的基礎上繼續采集指紋圖像,然后兩次采集的指紋圖像進行合成處理,我們可以在采集的時候設置聲音,方便提示我們指紋正在采集,在設計過程中,通過發出滴滴的聲音,我們可以清楚的知道指紋已經錄入成功了。接下來就是指紋模塊的內部芯片開始工作的時候了,內部芯片有自己的工作電路,在單片機的電流輸入時通過TTL電平轉換,來開啟內部芯片的工作電路,工作電路經過放大信號處理后,就可以對指紋圖像信息信號進行處理。利用高運算量來提高工作效率,處理之后會把數據存儲到特定的地址,方便程序的隨時調用。緊接著就可以對我們設置好的指紋進行驗證了,轉換模式,進入識別模式,將錄入指紋的手指放在感應部分的斜坡上就可以看到該模塊的感應過程,這時也有聲音提示,告訴你識別成功。

當然,如果你想識別更多的指紋的話,在開始工作的時候要設置好指紋的序號,通過排序的方式,依次錄入指紋,建立指紋群。同時,也記下自己錄入指紋手指的順序,由于指紋模塊可以錄入將近1000個指紋,所以不用擔心它內存不夠,盡可能的多錄幾組指紋數據,方便開鎖使用。

本次設計主要是利用了單片機對指紋模塊、按鍵模塊、顯示模塊、電機開鎖模塊進行控制的作品設計。是將我們學習過的單片機進行生活運用的設計,本次設計考驗了我們學習知識,應用知識的能力。

設計的核心思想是通過單片機與指紋模塊、按鍵模塊、電機開鎖模塊進行串口連接的通信方式,定義單片機與這些模塊連接的管腳,通過高低電平的形式來控制各模塊的開啟與關閉。指紋模塊主要負責指紋信息的采集,指紋圖像的處理、指紋的存儲和指紋模式轉換的工作方式;按鍵模塊主要是為用戶設置數字密碼而提供的,本次設計用了16個按鍵,有0到9,錄入鍵、刪除鍵、關門鍵、確定鍵組成。其中錄入鍵有最高權限密碼的設置和清除指紋庫的設置,設計中最高權限密碼為123456,通過輸入最高權限密碼可以對指紋及數字密碼信息進行更改;清除指紋庫的密碼為000111,輸入后按下確定鍵就可以對之前所錄入的所用指紋、數字機密碼信息進行清空處理,還有兩個單獨的按鍵是用來設計模式切換和初始化設置。電機開鎖模塊中用的電機是直流電機,單片機發送高低電平到驅動芯片L298N,直流電機接入L298N芯片的兩個管腳,通過設置高低電平的數字排序來控制電機的正反轉,假設00為正轉,01為反轉,這樣就能通過程序來控制電機的轉動了。顯示模塊主要是利用LCD12864顯示屏來對設計的操作進行顯示功能,在單片機中定義頭文件,然后編寫顯示程序,如第一行顯示指紋密碼系統,第二行顯示識別模式或修改模式等等。設計中通過軟件來對硬件的操作進行控制,使得設計的各部分內容能夠緊密的結合,實現了該技術的應用。



第二章 系統的方案選擇和驗證   2.1單片機的選擇

我們在學習過程中所遇到的單片機有51單片機、52單片機、ATmag16單片機、AVR單片機,在這些單片機中,我選擇了52單片機來設計本次的設計。

原因如下:

第一,52單片機相對與51單片機來說,擁有更大的內存,其內部數據存儲器可以存儲256*8字節,比51單片機擴大了一倍。還增加了兩個中斷源,為程序的中斷控制提供了更多的選擇;能更好的兼容51單片機。

第二,52單片機相對與ATmag16單片機在編寫程序上,52單片機的程序編寫比較通俗易懂,容易應用。使用者只要熟悉一下單片機的基本編程過程就能快速的學會編程。

第三,52單片機與ATmag16單片機和51單片機獨特的地方就是有2個串行中斷接口,可以利用UART通道進行編程。

接下來通過52單片機的管腳圖來介紹各管腳在本次設計中所表示的功能,如下圖:

圖2.1  52單片機引腳圖



在本次設計中1引腳至7引腳接數字密碼4*4矩陣按鍵部分,通過高低電平來判斷是哪個鍵被按下,8引腳接切換模式的按鍵,9引腳接初始化模式的按鍵。

10引腳與指紋模塊的TXD接口相接,11引腳與指紋模塊的RXD接口相接,12引腳為外部中斷零,通過設置中斷來對指紋的識別和修改模式進行切換。13引腳和14引腳接電機開鎖模塊的L298N芯片的,15引腳接三極管2N3906部分,做為整體電路的報警提示模塊。16引腳接入一個紅色的發光二極管作為指紋模塊的識別模式燈;17引腳接入一個綠色的發光二極管作為指紋模塊的錄入模式燈。18、19引腳與晶振電容組成晶振電路,本次設計中所用的晶振為11.0592Hz,波特率為9600,不加倍。20引腳為整個電路提供公共的地線;21引腳、22引腳分別接存儲模塊中存儲芯片24C02的SDA、SCL的接口,負責存儲數據的通信傳送;40引腳為整個電路的電壓引腳。

   2.2指紋模塊的選擇與論證

目前,市場上出現了多種多樣的指紋識別模塊,他們的類別大概分為三種:射頻指紋模塊、半導體指紋模塊、光學指紋模塊。我在設計的時候選擇了光學指紋模塊,該模塊主要是利用光學的折射和反射原理,當光線從底部射向三棱鏡,再從三棱鏡射出時,該光線會在手指的表面形成凹凸不平的線條,線條在經過折射后再反射回去,就把指紋的凹凸紋狀顯示出來了。在經過內部CMOS芯片對圖片進行不同程度的處理,就能實現指紋的采集。與半導體指紋模塊相比,能夠有效的減少了因為傳感器感應電容(電感)的差異而造成指紋的采集失敗。射頻指紋識別與指紋識別相比性能更優,它能通過傳感器發射出微量射頻信號,然后穿透手指的表層去檢測指紋里層的紋路,從而獲取指紋的信息圖像。防偽指紋能力強,但是由于其模塊的造價太貴,所以本次設計沒有選擇該模塊,而是選擇了一個功能比較完善的,總體性能偏中等的指紋識別模塊。

我在網上幾家店進行了對比,最終選擇了購買PS1802指紋模塊,該模塊的組成圖片如下:

圖2-2   PS1802集成模塊實物圖


從圖中我們可以知道,該模塊有四根線伸出來,它們還有顏色的差別,紅色的是VCC線,綠色的是指紋模塊發送信息的接線,白色的是指紋模塊接收信息的接線,黑色的是接入GND的接線。該模塊與單片機進行串口通信,單片機發送一個字符字節指令到指紋模塊,然后在指紋模塊的內部電路中進行尋找字符字節,找到后再發回給單片機,進而它們之間能夠完成通信。指紋模塊中有數據包識別碼,通過單片機的發送中斷和接收中斷進行數九包識別碼的尋址,完成后開始錄入用戶的個人信息指紋,把指紋信息存儲在FIFO中,方便用戶的使用。如果你想識別更多的指紋的話,在開始工作的時候要設置好指紋的序號,通過排序的方式,依次錄入指紋,建立指紋群。同時,也記下自己錄入指紋手指的順序,由于指紋模塊可以錄入將近1000個指紋,所以不用擔心它內存不夠,盡可能的多錄幾組指紋數據,方便開鎖使用。在錄入指紋的過程中,有最高權限密碼的設置和清除指紋庫的設置,設計中最高權限密碼為123456,通過輸入最高權限密碼可以對指紋及數字密碼信息進行更改;清除指紋庫的密碼為000111,輸入后按下確定鍵就可以對之前所錄入的所用指紋、數字機密碼信息進行清空處理,還有兩個單獨的按鍵是用來設計模式切換和初始化設置。

   2.3顯示模塊的選擇與論證

在平時的課程設計中,我接觸了一些顯示模塊,如VGS12864E、ICL7106、LCD1602、LCD12864。這些顯示模塊各有各的優點,根據本次設計的需要我選擇了LCD12864顯示模塊。該模塊鎖具有的優勢如下:

第一,VGS12864E與LCD12864相比都能顯示128*64行的點陣,但VGS12864E特有OLED圖形字符的顯示模塊,該模塊采用了有機發光技術,與LCD12864相比在太陽光直射下,不需要背光源,依然能呈現出清晰的圖像和數據。通過低電壓來驅動,能在-20℃~70℃的溫度下工作,但是由于近年來科技的發展,VGS12864E的生產漸漸減少,現在很難在市場上看到該類顯示模塊。

第二,ICL7106與LCD12864相比,因為其內部有3個1/2位A/D轉換器,因此,能夠直接驅動LED數碼管。然而,在本次的設計中,顯示模塊只是應用于屏幕的漢字顯示,方便對用戶的操作進行提示,沒有用到LED數碼管,因此,沒有選擇ICL7106顯示模塊。

第三,LCD12864是128*64分辨率的點陣,能顯示8*4個漢字,也能顯示圖像效果,與LCD1602相比,顯示的漢字多一些,能夠顯示四行漢字。12864接口有串行和并行兩種方式,而1602只有并行的接口方式,不能滿足設計者的需求。

經過對比分析考慮后,本次設計最終采用LCD12864液晶顯示模塊。該模塊與單片機的26、27、28、32、33、34、35、36、37、38、39引腳相連接,通過并行的接口方式與單片機進行通信控制,在單片機中定義頭文件,然后設置每行顯示的文字,以提示用戶的操作。在設計中,讓第一行的文字顯示為指紋密碼系統,第二行為識別模式或修改模式,用戶可以通過按鍵進行切換;第三行根據程序的順序依次顯示請錄入指紋、請輸入密碼、密碼正確和最右邊的密碼序號;第四行顯示為密碼加冒號。這樣,用戶就能直觀的通過屏幕顯示來完成指紋密碼鎖的指紋錄入和指紋開鎖的過程。

   2.4 數字按鍵部分介紹

在作品的設計中,當輸入的指紋正確時還需要通過數字密碼來解鎖,因此就需要一個數字按鍵模塊。在單片機的學習中,我們學習矩陣鍵盤的應用,為本次設計提供了靈感。本次設計采用了4*4個數的矩陣鍵盤,有0到9的數字按鍵和錄入鍵、刪除鍵、關門鍵、確定鍵幾部分組成。通過設置行線與列線的端口接入點,來定義數字按鍵的行線與列線,經過編寫程序對行、列線進行電平高低的設置,通過高低電平的變化來確定按下的按鍵,最后在LCD12864液晶顯示屏上顯示后變成*號,以保護用戶的密碼不被泄露。

   2.5報警部分芯片的選擇

當用戶輸入的信息不正確時,輸入指紋出錯超過三次的情況下或者輸入數字密碼的次數也超過三次時,系統便會發出警報聲,以提示用戶輸入的信息不正確。同時也警示不法分子,你不是合法用戶,沒有開門的權利。警報電路由2N3906三極管、電阻和蜂鳴器構成,三極管2N3906是該電路主要芯片。三極管2N3906是分離式半導體類三級管,屬于PNP型,低電平導通,正好與蜂鳴器的電壓導通性質一樣,當低電平通過時,電路開始導通,驅動蜂鳴器發出響聲。本次設計的報警電路如下所示:

圖2.3警報電路設計圖

   2.6存儲電路模塊的介紹

存儲模塊主要應用E平方PROM通信協議進行存儲的操作,在儀器儀表及工業自動化控制中得到大量的應用,F在市場上有多種多樣的存儲芯片,經過方案對比發現24C02芯片是最符合本設計的設計思路,其引腳圖如下圖2-4所示:

圖2-4  24C02引腳圖

在設計中,存儲模塊的5引腳(SCL)與單片機的22引腳相連接,6引腳(SDA)與單片機的21引腳相連接,1引腳、2引腳、3引腳、4引腳都接上GND,讓芯片進行讀寫操作。7引腳、8引腳接VCC,給這個電路提供電源。



第三章 各模塊電路的介紹

設計中一共有七個電路模塊,它們分別是52單片機模塊、數字按鍵模塊、指紋識別模塊、LCD12864液晶顯示模塊、存儲模塊、電機模擬開鎖模塊和總體電源模塊。我們在本章中將對以上內容進行詳細介紹。

  3.1數字按鍵模塊電路的介紹

在作品的設計中,當輸入的指紋正確時還需要通過數字密碼來解鎖,因此就需要一個數字按鍵模塊。作品中有16個按鍵,它們分別是0到9數字按鍵和錄入鍵、刪除鍵、關門鍵、確定鍵。在單片機中進行編寫程序,設置好行線與列線的端口接入點,來定義數字按鍵的行線與列線,經過編寫程序對行、列線進行電平高低的設置,通過高低電平的變化來確定按下的按鍵。數字按鍵模塊的電路如下所示:

圖 3.1數字按鍵模塊電路

   3.2 指紋識別模塊電路的介紹

設計中的指紋模塊內部有一個高度集成的芯片,該芯片有自己的工作電壓,當單片機的電壓經過芯片時會在內部電路中進行轉換,形成芯片的工作電壓。指紋模塊有存儲指紋的存儲空間,一般能存儲1000枚指紋,因此,不用擔心指紋模塊不夠存。本次設計所選用的是光學指紋模塊,在修改模式下,可以對指紋模塊錄入指紋信息,用戶把手指放在指紋模塊的斜坡上,光線會在手指的表面形成凹凸不平的線條,線條在經過折射后再反射回去,就把指紋的凹凸紋狀顯示出來了。然后通過聽滴滴聲來判斷指紋是否錄入成功;在模塊進入識別模式時,指紋模塊會發出紅色的光,當用戶的指紋放在指紋模塊的斜坡上時,通過看顯示屏幕或者聽聲音就能知道指紋是否識別。指紋識別模塊電路圖如下:

圖3.2指紋模塊電路圖

指紋模塊在修改模式下的工作過程:

  • 等待指紋模塊的紅色光不再閃爍時,表示順利進入修改模式;
  • 進入修改模式后,按照屏幕提示進行指紋錄入操作;
  • 盡量選擇大拇指和食指進行錄入,這兩個手指錄入比較能夠容易錄入進去;
  • 在聽蜂鳴器發出滴滴聲時,表示錄入成功。

指紋模塊在識別模式下的工作過程:

  • 按下切換按鍵,把修改模式切換成識別模式;
  • 識別模式切換后,指紋模塊會發出紅色的閃光;
  • 按下之前已錄入的手指的指紋;
  • 等待指紋識別,當聽到滴滴兩聲時,指紋識別成功。
    3.3LCD12864顯示模塊電路介紹

本次設計中使用的是LCD12864液晶顯示模塊,該模塊能顯示128*64字符的漢字,屏幕比較大,可以顯示四行的漢字,與單片機通過并行的接口方式進行通信,定義每一行所代表的語句,來對操作者進行提示。具體電路圖如下:

圖3.3  LCD12864顯示模塊電路


該模塊與單片機的26、27、28、32、33、34、35、36、37、38、39引腳相連接,通過并行的接口方式與單片機進行通信控制,在單片機中定義頭文件,然后設置每行顯示的文字,以提示用戶的操作。在設計中,讓第一行的文字顯示為指紋密碼系統,第二行為識別模式或修改模式,用戶可以通過按鍵進行切換;第三行根據程序的順序依次顯示請錄入指紋、請輸入密碼、密碼正確和最右邊的密碼序號;第四行顯示為密碼加冒號。這樣,用戶就能直觀的通過屏幕顯示來完成指紋密碼鎖的指紋錄入和指紋開鎖的過程。

   3.4存儲模塊電路的介紹

經過比較發現24C02芯片最符合本設計的設計思路,因為24C02有256字節,能存儲40組數字密碼,當系統因為一些不可預計的原因導致斷電,存儲模塊電路能把掉電前的數據保存下來,等到下次上電的時候,能繼續工作。芯片的工作電壓為1.8V到5.5V,串行接口,兼容I2C總線;能對硬件進行寫保護,具有高度的可靠性,擦寫壽命達到100萬次,是現代智能儀表的首選芯片之一。

存儲模塊電路圖如下:

圖 3.4 存儲模塊電路圖
   3.5電機模擬開鎖模塊電路的介紹

本次設計應用了L298N芯片作為電路的核心芯片,該芯片的工作電壓為4.5V至46V,考慮到穩定性,本電路的工作電壓為12V,一共有15個管腳。有四個輸入口與輸出口,一般情況下,能驅動一臺兩相的步進電機或者四相的步進電機,兩臺直流電機。此次設計采用了直流電機,通過輸出的高低電平來控制電機的正反轉,如假設OUT1、OUT2=00代表電機正轉,OUT1、OUT2=01代表電機反轉。電機模塊開鎖電路圖如下:

圖 3.5電機模擬開鎖電路圖

從電路圖中,我們可以看到八個IN4007二極管構成“H橋”,這些二極管在電路中起到續流的作用,還有兩個電容,C1、C2在電路中作為兩個濾波電容,以防止一些電流的不穩定所造成的干擾,C1是用來吸收低頻干擾的,C2是用來吸收高頻脈沖干擾的。電路中要想控制電機轉動的速度,取決于控制脈沖,給直流電電機一個控制脈沖時,電機就轉動一步,再發一個脈沖,會再轉一步,當兩個脈沖的時間間隔越短時,電機就轉動得越快。在本模塊中的電源電壓為12V,該電壓能夠使L298N芯片正常驅動電機,讓電機轉動,成功實現模擬開鎖的過程。


   3.6 總體電源模塊電路的介紹

電路的正常運轉需要電源,因此,本設計還需要一個穩定的,實用的電源模塊對整個設計提供電源。因為各電路需要的電壓不同,所以設置正負5V、正負12V、正負15V的電壓源。下圖3.6是總體電源電路:

圖3.6 總體電源模塊電路圖

從電路圖中,可以看到該電路設計提供了正負5V、正負12V、正負15V的電壓,在圖的最右邊有一個紅色的發光二極管,當電路正常運行時,就會亮起,提示操作者該電路沒有障礙,能夠正常使用。電路的工作原理:當220V交流電經過橋式二極管整流后,再通過C1、C2、C3、C4電容進行濾波處理,之后得到300V直流電壓,該電壓經過LM7815、LM7915穩壓管后變成正的15V電壓和負的15V電壓,在電路傍邊接兩個端口作為正負15V電壓的輸出;這兩個電壓經過C5、C6、C7、C8電容的高頻濾波,進入LM7812、LM7912穩壓管,就得到了正負12V的電壓,外接兩個端子作為正負12V的輸出端;通過同樣的方式,繼續把電壓進行濾波處理后,流向LM7805、LM7905使得輸出的電壓達到正負5V。設計中,單片機的電源電壓為5V,一般來說,5V電壓能夠讓電路正常運行;在電機模擬開鎖驅動電路中的電源電壓為12V,該電壓能夠使L298N芯片正常驅動電機,讓電機轉動,成功實現模擬開鎖的過程。


第四章  系統的軟件調試
4.1開鎖電路調試及流程圖設計

以上介紹了設計的硬件電路部分,現在開始介紹設計中的軟件設計與調試過程,程序設計中,用了C語言來進行編程,C語言是我們之前開設的一門課程之一,我們能夠運用C語言來編寫程序,能夠比較熟練地應用C語言去解決課程所要完成的課程設計要求。設計中本著程序語言簡潔、能實現功能為前提,盡可能的使用一些我們所學過的知識去編寫,以達到學以致用的效果。接下來,可以通過下面的流程圖來展示。


第一步,調整模式,將當前的識別模式通過模式切換按鍵切換成修改模式,在該模式下進行指紋圖像信息的采集與錄入;第二步輸入最高權限密碼,本設計的最高權限密碼為123456,輸入完成后就可以進入下一步;第三步指紋信息圖像錄入,定義單片機中連接指紋模塊的引腳,設置好連接方式后,在程序中編寫指紋錄入程序,要錄入兩次指紋,進行指紋圖像的對比和采集;第四步指紋信息圖像處理,程序對所搜集到的指紋圖像信息進行合成、加工,讓圖像更加清晰,然后把該指紋信息存儲指定的地址(Carch)中;第五步設置數字密碼,指紋圖像信息錄入正確后,開始數字密碼的錄入,用戶設置自己的用戶密碼,該密碼存儲在24C02芯片中,24C02能夠存儲40組數字密碼;第五步切換為識別模式,在識別模式下進行開鎖的演示操作;第六步識別指紋,將用戶之前錄入過指紋的手指放在指紋模塊的斜坡上,程序中設計了這兩次指紋信息圖像的相似程度和對比度,通過數據計算能夠知道錄入的指紋與識別的指紋是否匹配,從而判斷出該指紋的用戶是否是本人,識別指紋的過程中應用了C語言的for循環語句,當用戶的指紋沒有識別出時,可以繼續跳轉到識別模式下的程序,繼續進行指紋識別的操作,循環六次后,如果還不能識別指紋時,系統便會發出警報,提示該用戶的指紋不正確,或者已經有非用戶者入侵了;第七步數字密碼的輸入,當指紋識別成功時,開始進入數字密碼輸入步驟,程序中應用了for循環語句,用CC來表示,輸入密碼錯誤時,可以繼續跳回輸入密碼,當密碼輸入錯誤三次時,系統的警報會響起,警報該用戶所輸入的數字密碼不正確,這時,用戶就要小心了,可能有不法分子侵入了。第八步開鎖過程,當指紋識別成功,數字密碼輸入正確時,程序會執行開鎖的操作,單片機的電壓通過25管腳傳輸到L298N芯片上,芯片內部經過電平轉換把輸出的電壓送到OUT1、OUT2管腳以驅動電機轉動,實現開鎖過程的模擬。整個設計流暢地體現了指紋密碼鎖設計的解鎖的過程。

4.2 設計中的特殊開鎖方式

生活中,有時候我們的手指受傷了,導致不能正常的開鎖,這個時候就需要更改錄入的手指,或者直接用最高權限密碼去設置開鎖環節。我們可以在錄入指紋的時候,多錄入幾個手指的指紋,以備不時之需,當我們錄入的手指中的一個手指的指紋受損了,我們還可以用其他的手指指紋進行開鎖,避免了用戶自己進不了家門的尷尬局面。不過,我們也可以輸入最高權限密碼,輸入完成后,再選擇一個指紋完全的手指,重新錄入,錄入后就直接開鎖。這樣就能夠有效的避免了用戶忘記是用哪個手指的指紋錄入或者是忘記了數字密碼后不能正常開鎖的情況發生。該最高權限密碼一般只有用戶自己知道,而且該密碼已經寫在程序中,如果用戶想要更改,也可以找到編寫該密碼的部分自己進行修改,但是用戶一定要記得自己設置的最高權限密碼,不要輕易的與不熟悉的人說這個密碼,以防止不法分子利用它來破解開鎖,對人們的生產、生活造成影響。當指紋信息存儲過多時,我們要怎么刪除我們之前存儲的指紋呢?在設計中也考慮了清除指紋的操作,在修改模式下,按下輸入鍵,輸入000111后,按下確定鍵,就能把之前存儲過的指紋圖像信息全部刪除;同時,數字密碼也能刪除。這樣用戶就又可以重新設置指紋信息圖像和數字密碼了。

第五章 作品總結
5.1作品設計過程

在作品的設計過程中,遇到了很多問題,如最開始的單片機、指紋模的選擇、電路的整體設計思路。在一個多月的摸索中,最后確定用哪個方案進行系統設計。設計完成后便開始畫電路圖,選擇元器件的封裝,連線畫圖。弄好之后就把電路圖轉印到銅板上,檢查電路是否有斷線的,不清楚的,做好補漏的工作。之后就開始焊接電路,把元器件按照電路的排放依次焊接到電路圖上,測試電路是否能正常運行。最后在把已經編寫好的程序下載到單片機中,運行程序,看各模塊的功能是否能實現,然后再根據各模塊的情況進行修改。

設計中有顯示屏可以對用戶的操作進行提示,按鍵模塊的設計也是按照人們的思維從左到右的數字增加方式,而且確定按鍵、輸入按鍵、刪除按鍵都標有文字說明。存儲部分能夠考慮到整體電路斷電時,數據信息還能存儲到芯片中,當系統上電后,還能調出存儲的數據信息繼續進行工作;通過設置最高權限密碼可以對鎖進行重新設置,開鎖過程的設計也是比較人性化的,當用戶的指紋識別正確和數字密碼輸入無誤時,按下確定鍵鎖會轉動,以實現開鎖功能,開鎖之后用戶只需按下關門鍵,就會看到鎖具朝著相反的方向轉動,從而達到關門的效果。





附錄一

系統整體電路圖:



附錄二
主程序:

  1. #include
  2. #include
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #include " LCD12864.h "//里面定義了12864液晶的端口接法以及 12864程序聲名
  6. #include "24c02.h"
  7. sbit buzzer=P3^5; //蜂鳴器引腳
  8. sbit A1 =P2^2;
  9. sbit B1 =P2^3 ;
  10. sbit anjian=P2^4;
  11. sbit red=P3^7;//錄入模式指示燈 在板子靠近單片機處
  12. sbit green= P3^6;//識別模式指示燈 在板子遠離單片機處
  13. sbit key=P3^2; //中斷
  14. #define FALSE 0
  15. #define TURE  1
  16. #define MAX_NUMBER    30
  17. #define _Nop()  _nop_()
  18. unsigned char               SaveNumber=0,searchnum=0;
  19. unsigned int                SearchNumber=0,clk0=0;
  20. bit modeflag= 0 ,  clearallflag=0, changeflag=0;
  21. //默認為識別模式
  22. //如果為1為錄入指紋模式,每錄入一次SaveNumber++
  23. unsigned char                             FifoNumber=0;
  24. unsigned char idata  FIFO[MAX_NUMBER+1]={0};

  25. void TxdByte(unsigned char dat)//串口發送信息,通過查詢方式發送一個字符
  26. {
  27.     TI = 0;                            //讓TI=0
  28.     SBUF = dat;              //讀入數據
  29.     while(!TI);              //等待發送完畢
  30.     TI = 0;                            //清零
  31. }
  32. uchar Command(unsigned char *p,unsigned char MaxTime) //命令解析,給模塊發送一個命令 *p 數組 MaxTime*17ms 循環時間
  33. {
  34.                 unsigned char count=0,tmpdat=0,temp=0,i=0,package=0,flag=0,checksum=0;            
  35.               uchar result=0, start=0,stop=0;
  36.                 TxdByte(0xef);//數據包包頭識別碼
  37.                  TxdByte(0x01);//數據包包頭識別碼
  38.                 i=*p;//數組的第"0"個元素、里面存放了本數組的長度,把這個長度給變量i,方便進行操作
  39.                 p++;
  40.               p++;
  41.                 for (count=i-1; count!=1;count--)  //Sent command String
  42.                 {
  43.                             temp=*p++;//取第個"1"個元素的內容,然后發送
  44.                   TxdByte(temp);//將數據發送出去
  45.               }               
  46.               //以上完成了對數組的全部發送
  47.                 result=TURE;//發送完成,結果為真 (真為1)               
  48.                 FifoNumber=0;
  49.                 for (count=MAX_NUMBER+1; count!=0; count--)//清空所有FIFO[]數組里面的內容,寫入0X00
  50.               {
  51.                 FIFO[count-1]=0x00;                                             
  52.               }              //用于存貯所有接收到的數據
  53.                 if (result)   //如果result=TURE成立
  54.                  {                           
  55.                    result=FALSE;  //result清零
  56.                     start =FALSE;
  57.                                stop  =FALSE;
  58.                      count=0;
  59.                      clk0=0;              //清零CL0計數
  60.                            
  61. /////////////////////////do的內容////////////////////////////////
  62.                             {            
  63.                                           restart0:                                                      
  64.                                      if (RI==1)//如果接收到數據
  65.                                                 {                                                        
  66.                                                                         tmpdat=SBUF;//先把接收到的數據放到tmpdat中
  67.                                         RI=0;
  68.                                         if ((tmpdat==0xef)&&(start==FALSE))//這個數據為第一個傳回來的數據,也就是"指令應答"的第一個字節
  69.                                                       {              
  70.                                                                                                   count=0;
  71.                             FIFO[0]=tmpdat;//讀入第一個應答字節(0XEF),存在第"0"個元素中   
  72.                                                                                                   flag=1;                          
  73.                                                                                                   goto
  74.                                                                                                                 restart0;//可以用中斷方式進行                                         
  75.                                                        }
  76.                                                                       if(flag==1)//第一個字節已經回來,所以flag==1成立
  77.                                                                      
  78. ///////////////////////do的內容結束//////////////////////////////               
  79.               while ((clk0<=MaxTime)&&(count<=MAX_NUMBER) && ( changeflag == 0 ));
  80.                             //由定時器以及最大接收數據來控制,保證不會在此一直循環                             
  81.         FifoNumber=count;              //保存接收到的數據個數
  82.               }
  83.    return (result);
  84. }
  85. bit VefPSW(void)//驗證設備握手口令,成功返回1   
  86. {
  87.               unsigned char  count=0;
  88.               while (1)
  89.                  {
  90.                    if(Command(VPWD,20) && (FifoNumber==11) && (FIFO[9]==0x00))
  91.                             {
  92.                               return (1) ;
  93.                             }            
  94.                    count++;
  95.                                  if (count>=2)//如果不成功,再驗證一次,如果兩次不成功,返回失敗
  96.                   {
  97.                       return(0);  
  98.                             }
  99.               }
  100. }
  101. void Clear_All(void) //清空指紋庫  
  102. {                                                      
  103.       delay1ms(200);
  104.                 Command(DELE_all,50); //清空指紋庫                             
  105. }
  106. unsigned char ImgProcess(unsigned char BUFID)  //發獲取圖像并生成特征文件,存入BUFID中//輸入參數為緩沖區號
  107. {            
  108.     if(Command(GIMG,89) && (FifoNumber==11) && (FIFO[9]==0x00))
  109.     {
  110.                             if(BUFID==1)     
  111.                             {                                                         
  112.                                   if(Command(GENT1,60) && (FifoNumber==11) && (FIFO[9]==0x00))
  113.                       {                                                                                                
  114.                                                         return 1;
  115.                                           }
  116.                             }
  117.                             else if(BUFID==2)
  118.                             {
  119.                                             if(Command(GENT2,60) && (FifoNumber==11) && (FIFO[9]==0x00))

  120. return 255; //由于只有162個指紋,如果返回255,表示這個指紋識別失敗
  121.                                           }   
  122.                      }
  123.                             i++;            
  124.     }
  125.    return 0;
  126. }

  127. bit savefingure(unsigned char ID)//保存指紋
  128. {
  129.               unsigned char i=0;
  130.               //現在開始進行存儲指紋模板的操作
  131.      for (i=0;i<16;i++)              //保存指紋信息
  132.               {
  133.                             FIFO[i]=STOR[i];
  134.               }
  135.      FIFO[12]=ID; //把指紋模板存放的PAGE_ID也就是FLASH的位置
  136.      FIFO[14]=FIFO[14]+ID;              //校驗和
  137.      if (Command(FIFO,70)==1)//不成功返回0              //此處進行存放指紋模板的命
  138.               {
  139.                  return(1);
  140.               }

  141.               return (0) ; //不成功返回0
  142. }
  143. unsigned char enroll(void) //采集兩次指紋,生成1個 指紋模板
  144. {
  145.               unsigned char temp=0,count=0;
  146.               delay1ms(30);
  147.                 while(1)
  148.                 {
  149.                               temp=ImgProcess(1); //生成特征1   
  150.                                if ( temp == 1 )//生成特征文件成功            
  151.                     {                                   
  152.                       break;
  153.                      }
  154.                    else                  
  155.                      {
  156.                       if ( temp == 0 )//采集指紋沒有成功
  157.                         {
  158.                                                         count++;
  159.                           if (count>=40)//如果采集了40次,還不成功,直接采集失敗,直接退出enroll函數----返回0
  160.                                                                       return(0);
  161.             }
  162.         }
  163.                  }
  164.                  count=0;
  165.     buzzer=0;
  166.               delay1ms(100);
  167.               buzzer=1;
  168.               delay1ms(2000);//延時2S開始采集下一個特征
  169.               //開始采集第二個特征
  170.               while(1)
  171.                 {
  172.                                temp=ImgProcess(2); //生成特征2   
  173.                                if (temp==1)//生成特征文件2成功
  174.                     {
  175.                       if (  (Command(MERG,40)&& (FifoNumber==11) && (FIFO[9]==0x00))==0  ) //合并不成功返回0,成功返回1
  176.                                           {
  177.                                           return(0);
  178.                                           }            
  179.                                           else//特征文件合并生成模板,結果存于ModelBuffer
  180.                                           {
  181.                                                         buzzer=0;
  182.                            delay1ms(100);
  183.                            buzzer=1;
  184.                                                         delay1ms(100);
  185.                                                         buzzer=0;
  186.                            delay1ms(100);              //響兩聲,表示生成一個模板成功
  187.                            buzzer=1;
  188.                            return 1;
  189.                                           }            
  190.         }
  191.                     else  //采集指紋沒有成功   
  192.                      {            
  193.                                 count++;            
  194.                                           if (count>=25)
  195.                                           {
  196.                                                         return(0);
  197.                                           }                           
  198.                    }
  199.                  }
  200. }
  201. void modecheck(void)
  202. {
  203.      if(modeflag==0)
  204.               {
  205.                             green=0;
  206.                             red=1;
  207.                             display(1);              //識別模式
  208.               }
  209.               else if(modeflag==1)
  210.               {
  211.                             red=0;
  212.                             green=1;
  213.                             display(2);              //錄入模式
  214.               }
  215.               numshow(0);
  216. }
  217. void init_sys()                            //端口初始化
  218. {
  219.               ET0=1;     //定時器0開中斷
  220.               TL0=0x97;
  221.               TH0=0xBD;              //17ms的初值  
  222.    //串口初始化
  223.     SCON=0x50;   //UART方式1:8位UART;   REN=1:允許接收
  224.     PCON=0x00;   //SMOD=0:波特率不加倍
  225.     TMOD=0x21;   //T1方式2,用于UART波特率
  226.     TH1=0xFD;
  227.     TL1=0xFD;   //UART波特率設置:9600
  228.     TR1=1;
  229.     TR0=1;// 開定時器0
  230.                  EX0=1;              //開外中斷
  231.                 IT0=1;
  232.               IT1=1;
  233.     EA=1;              //開全局中斷
  234. }
  235. void woshou()
  236. {
  237.                             unsigned char i=0;
  238.               for(i=0;i<6;i++)//開始握手6次,如果沒有一次成功,表示模塊通信不正常。只要成功就跳出此循環
  239.               {
  240.                             if(VefPSW())//與模塊握手通過,綠燈亮起。進入識別模式
  241.                               {
  242.               display(3); //握手成功
  243.                                             red=0;
  244.                                             buzzer=0;
  245.                                             delay_1ms(1000);
  246.                                             buzzer=1;
  247.                                             delay_1ms(1000);              //顯示3秒握手狀態
  248.                         modecheck();              //顯示當前是什么狀態
  249.                                             break;
  250.                               }
  251.                   else
  252.                             {
  253.                                           display(4);  //握手失敗
  254.                                           break;
  255.                             }
  256.               }               
  257. }
  258. unsigned char key_sm()
  259. {
  260.               unsigned char i,temp;
  261.               P1=0xf0;
  262.               temp=P1;
  263.               if(temp!=0xf0)
  264.               {
  265.               delay1ms(10);
  266.               if(temp!=0xf0)
  267.               {
  268.               /////////////////////第一行掃描/////////////////////
  269.               P1=0xfe;              //1111 1110
  270.               temp=P1;
  271.               switch(temp)
  272.               {
  273.                             case(0xee):buzzer=0;delay1ms(200);buzzer=1;n++;if(n>7){n=7;}  //輸入0
  274.                                                                                           write_12864dat(num[10]);delay1ms(1);write_12864dat(num[10]);
  275.                                                                                     break;
  276.                                                         case 3:passwd[2]=2;write_12864com(0x98+4); delay1ms(1);write_12864dat(num[2]);delay1ms(100);
  277.                                                                                          write_12864com(0x98+4); delay1ms(1);write_12864dat(num[10]);
  278.                                                                                     break;
  279.                                                         case 4:passwd[3]=2;write_12864com(0x98+4); delay1ms(1);write_12864dat(num[10]);delay1ms(1);
  280.                                                                                          write_12864dat(num[2]);delay1ms(100);write_12864com(0x98+4);delay1ms(1);
  281.                                                                                          write_12864dat(num[10]);delay1ms(1);write_12864dat(num[10]);
  282.                                                                                     break;
  283.                                                         case 5:passwd[4]=2;write_12864com(0x98+5); delay1ms(1);write_12864dat(num[2]);delay1ms(100);
  284.                                                                                          write_12864com(0x98+5); write_12864dat(num[3]);delay1ms(100);write_12864com(0x98+4);delay1ms(1);
  285.                                                                                                       write_12864dat(num[10]);delay1ms(1);write_12864dat(num[10]);
  286.                                                                                     break;
  287.                                                                                     }
  288.                                                                       break;
  289.                                 }
  290. ////////////////////第二行掃描/////////////////////
  291.                             P1=0xfd;              //1111 1101
  292.                    temp=P1;
  293.                             switch(temp)
  294.                               {
  295.                                case(0xed):buzzer=0;delay1ms(200);buzzer=1;n++;if(n>7){n=7;}  //輸入4
  296.                                                         switch(n)
  297.                                                         {
  298. ); delay1ms(1);write_12864dat(num[10]);delay1ms(1);
  299.                                                                                          write_12864dat(num[4]);delay1ms(100);write_12864com(0x98+4);delay1ms(1);            
  300.                                                         switch(n)
  301.                                                         {
  302.                                                         case 1:passwd[0]=5;write_12864com(0x98+3); delay1ms(1);write_12864dat(num[5]);delay1ms(100);
  303.                                                                                           write_12864com(0x98+3);
  304.                                                                                     break;
  305.                                                         case 4:passwd[3]=5;write_12864com(0x98+4); delay1ms(1);write_12864dat(num[10]);delay1ms(1);
  306.                                                                                          write_12864dat(num[5]);delay1ms(100);write_12864com(0x98+4);delay1ms(1);                                                                                        write_12864dat(num[10]);delay1ms(1);write_12864dat(num[10]);
  307.                                                                                     break;
  308.                                                         case 5:passwd[4]=5;write_12864com(0x98+5); delay1ms(1);write_12864dat(num[5]);delay1ms(100);
  309.                                                                                          write_12864com(0x98+5); delay1ms(1);write_12864dat(num[10]);
  310.                                                                                     break;
  311.                                          
  312.                                                                                         write_12864com(0x98+4); delay1ms(1);write_12864dat(num[10]);
  313.                                                                                     break;
  314.                                                         case 4:passwd[3]=7;write_12864com(0x98+4); delay1ms(1);write_12864dat(num[10]);delay1ms(1);
  315.                                                                                          write_12864dat(num[7]);delay1ms(100);write_12864com(0x98+4);delay1ms(1);                                                                          write_12864dat(num[10]);delay1ms(1);write_12864dat(num[10]);
  316.                                                                                     break;
  317.                     }
  318. ////////////////////////第三行掃描/////////////////////
  319.                             P1=0xfb;   //1111 1011
  320.                             temp=P1;
  321.                             switch(temp)
  322.                             {
  323.                               case(0xeb):buzzer=0;delay1ms(200);buzzer=1;n++;if(n>7){n=7;}  ///輸入8
  324.                                           switch(n)
  325.                                           {
  326.                                                         case 1:passwd[0]=8;write_12864com(0x98+3); delay1ms(1);write_12864dat(num[8]);delay1ms(100);
  327.                                                                                          write_12864com(0x98+3); delay1ms(1);write_12864dat(num[10]);
  328.                                                                                     break;
  329.                                                         case 2:passwd[1]=8;write_12864com(0x98+3);  delay1ms(1);write_12864dat(num[8]);delay1ms(100);
  330.                                                                                          write_12864com(0x98+5); delay1ms(1);write_12864dat(num[10]);
  331.                                                                                     break;
  332.                                                         case 6:passwd[5]=8;write_12864com(0x98+5); delay1ms(1);write_12864dat(num[10]);delay1ms(1);
  333.                                                                                        
  334.                                                                                           write_12864com(0x98+3); delay1ms(1);write_12864dat(num[10]);
  335.                                                                                     break;
  336.                                                         case 2:passwd[1]=9;write_12864com(0x98+3); delay1ms(1);write_12864dat(num[10]);delay1ms(1);                                                                           write_12864dat(num[9]);delay1ms(100);write_12864com(0x98+3);delay1ms(1);                                                                                        write_12864dat(num[10]);delay1ms(1);write_12864dat(num[10]);
  337.                                                                                     break;
  338.                                                         case 3:passwd[2]=9;write_12864com(0x98+4); delay1ms(1);write_12864dat(num[10]);delay1ms(1);
  339.                                                                                           write_12864dat(num[9]);delay1ms(100);write_12864com(0x98+5);delay1ms(1);                                                                           write_12864dat(num[10]);delay1ms(1);write_12864dat(num[10]);
  340.                                                                                     break;
  341.                                                                                     }break;
  342.                               case(0xbb):break;
  343.                               case(0x7b):break;
  344.                             }
  345. ////////////////////////第四行掃描/////////////////////
  346.                             P1=0xf7; //1111 0111               
  347.                             temp=P1;
  348.                             switch(temp)
  349.                             {
  350.                               case(0xe7):buzzer=0;delay1ms(200);buzzer=1;aa=0;break;//錄入一個指紋                                case(0xd7):buzzer=0;delay1ms(200);buzzer=1;n=0;write_12864com(0x98+3); delay1ms(1);
  351.                                                                       for(i=0;i<6;i++){ passwd[i]=0;write_12864dat(' ');delay1ms(1);}
  352.                                                                         break;  //更正
  353.                               case(0xb7):buzzer=0;delay1ms(200);buzzer=1;n=0;break;  //退出
  354.                               case(0x77):buzzer=0;delay1ms(200);buzzer=1;n=0;bb=1;; break;  //確認摁鍵
  355.                             }                              
  356.               }               
  357.     }            
  358. }
  359. void main(void)
  360. {
  361.               //unsigned int ;
  362.               unsigned char cc=1,t,ii=0,addra=0,c,flag_1=0;                 //CC為密碼錯誤次數,ii為密碼個數
  363.               initdisplay();                //顯示初始化
  364.               init_sys();              //開啟定時和中斷
  365.               woshou();              //握手狀態
  366.               init_24C02();//24C02初始化
  367.                
  368.     while(1)
  369.               {
  370.                             if( modeflag==0 )//識別模式
  371.                             {
  372.                               searchnum=search();  //識別指紋號
  373.                               if(searchnum>=1 && searchnum <= 162 )
  374.                               {            
  375.                                display(7); //識別成功                             
  376.                                             numshow(searchnum);//顯示搜索到的指紋號
  377.                                           buzzer=0;
  378.                                           delay1ms(100);
  379.                                           buzzer=1;//蜂鳴器響
  380.                                           //read_num(5); //指紋識別成功
  381.                                           delay1ms(500);
  382.                                           display(12);//輸入密碼
  383.              aa=1;
  384.                                             c=1;
  385.                                             cc=0;
  386.                                             while(aa)
  387.                                           {            
  388.                                               key_sm();
  389.                                                         if(bb==1)  //等待密碼輸完摁下確定鍵
  390.                                                         {
  391.                                                         bb=0;
  392.                                                            for(t=0;t<6;t++)
  393.                                                              {
  394.                                                                         passwd1[t]=read_add((searchnum-1)*6+1+t);                 //從24C02中讀出原密碼
  395.                                                                         delay1ms(10);                                                                                    
  396.                                                                       }
  397.               if((passwd[0]==passwd1[0])&&(passwd[1]==passwd1[1])&&(passwd[2]==passwd1[2])&&(passwd[3]==passwd1[3])&&(passwd[4]==passwd1[4])&&(passwd[5]==passwd1[5]))  //比較密碼
  398.                                                               {            
  399.                                                                          display(15);
  400.                                                                for(ii=0;ii<6;ii++)
  401.                                                                          {
  402.                                                                          passwd[ii]=0;
  403.                                                                          passwd1[ii]=0;          //密碼歸零
  404.                                                                          }
  405.                                                                                        //read_num(5);
  406.                                                                    dianji=0;            //電機轉動
  407.                                                                                        cc=0;
  408.                                                                                        red=0;
  409.                                                                                        //relay=0;
  410.                                                                                        delay1ms(2000);
  411.                                                                                        delay1ms(2000);
  412.                                                                                        delay1ms(1000);
  413.                                                                                        //relay=1;
  414.                                                                                        red=1;                          //關燈
  415.                                                                                         buzzer=0;           //蜂鳴器響起
  416.                                                                                                   delay1ms(10000);
  417.                                                                                                   buzzer=1;                                           //蜂鳴器關閉
  418.                                                                                                   dianji=1;                                             //電機關閉                                
  419.                          }
  420.                                                         else
  421.                                                             {
  422.                                                               write_12864com(0x98+3); //調用12864寫命令
  423.                                                                         for(ii=0;ii<6;ii++)                //清6個密碼
  424.                                                                         {
  425.                                                                         write_12864dat(' ');              //調用12864寫數據
  426.                                                                         delay1ms(1);
  427.                                                                         passwd[ii]=0;                 //              清零密碼
  428.                                                                         }
  429.                                                               cc++;
  430.                                                                          if(cc>=3)                            //密碼輸入錯誤3次的話
  431.                                                                    {
  432.                                                                                          cc=0;
  433.                                                                                                   aa=0;                                          
  434.                                                                                                   c=0;
  435.                                                                                                   buzzer=0;
  436.                                                                                                   delay1ms(1000);
  437.                                                                                    
  438.                                                                                                   buzzer=1;
  439.                                                                    }
  440.                                                         buzzer=0;
  441.                                                         delay1ms(500);
  442.                                                         buzzer=1;       //密碼錯誤
  443.                                                             }
  444.                                                         }
  445.                                           }            
  446.                               }            
  447.                               if(searchnum==255)//指紋識別失敗
  448.                               {
  449.                                  //蜂鳴器響三聲
  450.                                           //read_num(6); //指紋識別失敗
  451.                                           display(8);//指紋識別失敗
  452.                                           numshow(0);
  453.                                           buzzer=0;
  454.                                           delay1ms(100);
  455.                                           buzzer=1;
  456.                                           delay1ms(100);
  457.                                           buzzer=0;
  458.                                           delay1ms(100);
  459.                                           buzzer=1;
  460.                               }
  461.                             }
  462. if(modeflag==1)                                                      
  463.     {
  464.               while(aa==1)
  465.               key_sm();//輸入密碼模式
  466.               while(aa==0)              // 等待摁下錄入一個指紋鍵
  467.                        {
  468.                                                                       display(12);//輸入密碼
  469.                                                                       key_sm();//
  470.                                                                       if(bb==1)//輸完6位且已經摁下確認鍵
  471.                                                                                     {                                                                                            if((passwd[0]==passwd3[0])&&(passwd[1]==passwd3[1])&&(passwd[2]==passwd3[2])&&(passwd[3]==passwd3[3])&&(passwd[4]==passwd3[4])&&(passwd[5]==passwd3[5]))//核對的是最高權限密碼passwd3密,清除指紋庫和密碼                                                                                                   
  472.                                                                                         {                                                                                                               
  473.                                                                                                                     Clear_All();//清除指紋庫
  474.                    write_add(0x00,0x00);//把24c02里面的指紋號也清零
  475.                                                                                                                 display(17);//清空指紋庫
  476.                                                                                                                delay1ms(5000);
  477.                                                                                                                display(16);       //"        號"            
  478.                                                                                                                display(15);        //                                                         
  479.                                                                                                                  for(ii=0;ii<6;ii++)
  480.                                                                                                                                                 {                                                                                                  
  481.                                                                                                   passwd[ii]=0;                           //密碼保存成功
  482.                                                                                                                                                            }
  483.                                                                                                                 aa=1;
  484.                                                                                                       }                                                                                     if((passwd[0]==passwd2[0])&&(passwd[1]==passwd2[1])&&(passwd[2]==passwd2[2])&&(passwd[3]==passwd2[3])&&(passwd[4]==passwd2[4])&&(passwd[5]==passwd2[5]))//核對的是最高權限密碼passwd2密碼                                                                                      
  485.                             {  SaveNumber=read_add(0x00);  //把上一次的指紋號讀出來
  486.                                                                                                      display(10);//請錄入指紋,在第三行顯示
  487.                                                         if(savefingure(SaveNumber+1)==1)                                  if( SaveNumber<162 )//模塊握手成功
  488.                                                                                                                 {
  489.                                                         if(enroll()==1)//              采集兩次生成一個指紋模板
  490.                                                                                                                              {
  491.                                           SaveNumber=read_add(0x00);  //把上一次的指紋號讀出來,
  492.                                                         if(savefingure(SaveNumber+1)==1)//保存也成功
  493.                                                                                     //if(flag_1                                                                           {                           
  494.                                                         display(14);//錄入成功
  495.                                                         SaveNumber=read_add(0x00);  //把上一次的指紋號讀出來,
  496.                                                         SaveNumber++;//指紋個數加1                                                                                                              
  497.                                                         zhiwen++;              //指紋個數加1
  498.                                                         delay1ms(1000);
  499.                                                         numshow(SaveNumber);//顯示錄入指紋號
  500.                                                         write_add(0x00,SaveNumber);
  501.                                                         bb=0;
  502.                                              display(9);//請設置密碼,在第三
  503.                                                         delay1ms(1000);
  504.                                                         display( 15);//請輸入密碼,在第三行顯示
  505.                                                         while(bb==0)//等待密碼再次輸入完,摁下確認鍵
  506.                                                         key_sm();                //輸入密碼
  507.                                                         for(ii=0;ii<6;ii++)
  508.                                                         {                                                                                         write_add((SaveNumber-1)*6+1+ii,passwd[ii]);//把數據密碼存到24c02里面去
  509.                                                         delay1ms(10);
  510.                                                         passwd[ii]=0;                            //密碼保存成功                                                                                                   }
  511.                                              display(13);                            //密碼設置成功
  512.                                              delay1ms(3000);
  513.                                                         display(15);        //
  514.                                                         display(16);       //"        號"
  515.                                                         aa=1;
  516.                                                         bb=0;
  517.                                                         flag_1=0;
  518.                                                                                                                }                                                                                                
  519.                                                                                     }
  520.                                                                                                   else
  521. {
  522.              display(6);//錄入失敗
  523.              delay1ms(1000);
  524.              display(11);//請復位
  525.              aa=1;
  526.              bb=0;
  527.          }
  528.     }
  529.         else
  530. {
  531.                                                         display(6);//錄入失敗
  532.              delay1ms(1000);
  533.              display(11);//請復位
  534.              aa=1;
  535.              bb=0;

  536.               }
  537.                  }
  538.                     }
  539.                        }
  540.                          }
  541.                             }
  542.                                }
  543.               ////////////////////////////中斷////////////////////////////////
  544. void  Timer0(void) interrupt 1//定時器
  545. {
  546.               TL0=0x97;                            //17ms
  547.               TH0=0xBD;
  548.               clk0++;   //
  549. }
  550. void int0 () interrupt 0
  551. {
  552.               if(key==0)
  553.               {              delay_1ms(10);   //消抖
  554.                             if(key==0)
  555.                             {              while(key==0);                           
  556.                                           buzzer=0;
  557.                                           delay1ms(300);
  558.                                           buzzer=1;                           
  559.                                           modeflag=~modeflag;              //通過摁鍵切換模式                           
  560.                                           modecheck();
  561.                                           //if(modeflag==0)
  562.                                           // woshou();
  563.                 }
  564.               }
  565.             
  566.                            
  567.                            
復制代碼

以上內容word文檔下載: 文檔.7z (1.34 MB, 下載次數: 89)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:89286 發表于 2017-2-10 07:52 | 只看該作者
amazing.好資料,51黑有你更精彩!!!
回復

使用道具 舉報

板凳
ID:151000 發表于 2017-10-17 21:41 | 只看該作者
謝謝樓主分享。。
回復

使用道具 舉報

地板
ID:673375 發表于 2019-12-25 12:06 | 只看該作者
太牛逼了,謝謝樓主分享,正在學習樓主的資料
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久草视频观看 | av不卡一区 | 国产精品网页 | 亚洲国产视频一区 | 亚洲一区二区三区视频 | 免费大黄视频 | 97伦理电影网 | 不卡一区二区三区四区 | 欧美日韩亚洲国产 | 成人免费精品视频 | 二区三区视频 | 亚洲一级视频在线 | 羞羞视频免费在线 | 亚洲视频一区在线播放 | 日韩三级 | 亚洲欧美中文日韩在线v日本 | 天天躁日日躁狠狠很躁 | 99色综合| 黑人巨大精品 | 久久合久久 | 日韩视频在线一区 | 免费1区2区3区| 成人深夜福利网站 | 午夜免费网站 | 亚洲视频在线观看 | 中文字幕1区 | 中文字幕在线观看一区二区 | 亚洲一区中文字幕 | 国产h视频 | a在线观看免费 | 亚洲福利电影网 | 91一区二区在线观看 | 国产精品不卡视频 | 精品国产色 | 国产精品亚洲精品久久 | 精品九九久久 | 国产精品一二三区在线观看 | 日本一级淫片免费啪啪3 | 国产乱码精品1区2区3区 | 中文字幕国产精品 | 99久久精品国产麻豆演员表 |