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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機指紋識別設計論文

[復制鏈接]
跳轉到指定樓層
樓主
ID:187525 發表于 2017-5-6 16:01 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
   


1        引言        1
1.1        指紋識別簡介        1
1.1.1        指紋識別原理        1
1.1.2        指紋識別應用        2
1.1.3        指紋識別技術的發展        2
1.2        系統設計的目的        3
1.3        課題背景        3
2        整體設計方案        4
2.1        系統總體設計        4
2.1.1        系統功能描述        4
2.1.2        系統總體框架        4
2.2        系統核心部件單片機        5
2.2.1        單片機的選擇        5
2.2.2        ATMEG16單片機的介紹        7
2.2.3        單片機的復位電路        9
2.2.4        ATMEG16最小系統及晶振的選擇        10
2.3        液晶顯示模塊        11
2.3.1        HS12864-15C系列液晶的特點        11
2.3.2        HS12864-15C系列液晶的引腳功能        12
2.3.3        液晶顯示HS12864-15C的指令系統        13
2.4        電源和指紋模塊        13
2.4.1        ZAZ-010系列獨立式指紋識別模塊引腳功能        14
2.4.2        ZAZ-010系列指紋識別模塊指令系統        15
2.4.3        電源模塊        17
3        系統軟件的設計        19
3.1        系統程序工作分析        19
3.2        設計前準備工作        19
3.3        單片機的程序設計        20
3.3.1        鍵盤管理程序設計流程        22
3.3.2        LCD顯示模塊程序設計流程        22
3.3.3        指紋通信模塊的程序設計流程        23
4        實物的制作與調試        24
4.1        電路的焊接        24
4.2        電路和程序的調試        25
4.2.1        單片機的程序下載        25
4.2.2        串口調試        25
4.2.3        液晶鍵盤調試        26
            27
參考文獻        28
附錄1:串口調試子程序        29
附錄2:整體源程序        31
附錄3:硬件電路圖        48
            49



1 引言
我們今天的工作生活中,很多的場合都需要身份的認證,而傳統的基于標志的身份認證技術由于受到證件偽造以及密碼破解等手段的威脅,逐漸表現得有些力不從心。怎樣保護自己的重要文件資料,如何保證自己的隱私不被泄露?在傳統的身份認證中,我們往往使用密碼加密法,但是這種方法只是"防君子不防小人"。在高明的黑客眼里,由幾個字符組成的密碼脆弱得不堪一擊,F在,科技的發展讓我們有了新的選擇——生物識別技術。將生物識別技術應用于筆記本、門鎖等方面,可以對文件、財產起保護作用,并且可以進行身份識別。
生物識別技術是依據人的體貌、聲音等生物特征進行身份驗證的科學解決方案,現有的生物識別技術大致上包括指紋識別技術、掌紋識別技術、視網膜識別技術、虹膜識別技術、面相識別技術、聲音識別技術和筆跡識別技術等。生物識別技術的優勢主要有:1、減少、消除身份假冒,進行真實身份的確認;2、降低管理成本,取代了身份人工認證過程;3、方便使用者,減少或消除了使用卡、鑰匙或者密碼等麻煩。生物識別技術的發展主要起始于指紋研究,它亦是目前應用最為廣泛的生物識別技術。
指紋識別技術的發展得益于現代電子集成制造技術和快速可靠的算法的研究。盡管指紋只是人體皮膚的小部分,但用于識別的數據量相當大,對這些數據進行比對也不是簡單的相等與不相等的問題,而是使用需要進行大量運算的模糊匹配算法,F代電子集成制造技術使得我們可以制造相當小的指紋圖像讀取設備,同時飛速發展的個人計算機運算速度提供了在微機甚至單片機上可以進行兩個指紋的比對運算的可能。另外,匹配算法可靠性也不斷提高,指紋識別技術己非常實用。
1.1  指紋識別簡介
1.1.1 指紋識別原理
指紋識別技術的原理和其它生物識別技術的原理相似。它是利用人體的指紋特征對個體身份進行區分和鑒定。在所有的生物識別技術中指紋識別技術是目前最為成熟,也被應用最廣的生物識別技術。這主要因為指紋采用的過程對人們來講非常簡單,指紋識別的準確率高的原因。嚴格來講,指紋識別的原理包括指紋采集原理、指紋特征提取原理和指紋特征匹配原理三大部分。指紋采集原理主要是根據指紋的幾何特性或生理特性,通過各種傳感技術把指紋表現出來,形成數字化表示的指紋圖案。
由于指紋的嵴和峪的幾何特征不同,主要表現為嵴是突起的,峪是凹下的,所以在接觸到光線時,其反射光的強度也就不同。在接觸到平面時,其在平面上形成的壓力也就不同。另一方面,由于指紋的嵴和峪的生理特征不同,主要表現為:嵴和峪的溫度不同,其導電性也不同,其對波長的反饋也就不同。通過這些幾何的、生理的特性的不同,把人的指紋采集到計算機系統中形成指紋圖像。
指紋特征分析的原理是對指紋圖案的整體特征和細節特征進行提取、鑒別的原理。其分析的對象包括紋形特征和特征點的分布、類型,以及一組或多組特征點之間的平面幾何關系。特征點的平面幾何關系表現為某個特征點之間的距離等,或者某三個或更多特征點之間組成的多邊形的幾何特性。不論是特征點的單體特征,還是特征點的組合特征都是指紋特征的組成部分。把這些指紋特征用數字模板的形式表示出來,就實現了一個指紋特征分析的過程。把人的指紋采集到計算機系統中形成指紋圖像。
指紋特征值匹配原理是對指紋圖案的整體特征和細節特征按模式識別的原理進行比對匹配。匹配是在已注冊的指紋和當前待驗證的指紋之間進行的。匹配運算不是對兩個指紋圖像進行比較,而是對已形成數字模板的指紋特征值進行匹配。
1.1.2 指紋識別應用
指紋識別技術是最早的通過計算機實現的身份識別手段,它是應用最為廣泛的生物特征識別技術。過去,它主要應用于刑偵系統。近幾年來,它逐漸走向市場更為廣泛的民用市場。指紋技術在現代生活和工作中的應用已越來越普遍,指紋考勤機、指紋社保、指紋銀行、指紋商場、指紋投票、指紋保護電腦、等等生活中和工作中的新現象已廣為人知,其應用相當廣泛,指紋技術正在日益刷新著我們的現代化生活方式。指紋識別技術是目前國際公認的應用廣泛、價格低廉、易用性高的生物認證技術。指紋只是人體皮膚的小部分,但是它卻蘊涵了大量的信息。這些皮膚的紋路在圖案、斷點和交叉點上是各不相同的,在信息處理中將它們稱作"特征"。醫學上已經證明這些特征對于每個手指都是不同的,而且這些特征具有唯一性和永久性。因此我們就可以把一個人同他的指紋對應起來,通過比較他的指紋特征和預先保存的指紋特征,就可以驗證他的真實身份。
1.1.3 指紋識別技術的發展
在經歷了近 10 年緩慢的自然增長后,指紋識別技術即將迎來一個跳躍性發展的黃金時期。專家們保守估計,未來 5 年,我國將有近百億元的市場等待著企業去開拓。指紋識別技術的巨大市場前景,將對國際、國內安防產業產生巨大的影響。較小的公司將面臨新進入的傳統行業大公司的無情競爭。在這些巨無霸面前,現有中小公司很難說有太大的競爭力,行業重新洗牌不可避免,合并與退出可能會成為大部分中小公司的無奈選擇。最終可能形成傳統行業的公司或大資本在較短時間內主導生物特征識別行業的局面。這也是每一個新興市場的必然結果。而競爭的結果將會形成一個新興的大產業。
國內生物識別技術的應用主要集中在企業級應用上,在 2002年總體約為2.5億元人民幣的終端市場中,超過 40%的產品都用于考勤、門禁系統之中。自2002年以來整個生物識別市場中指紋識別占據了超過 98%的份額,從需求看,中國 13 億人口決定了中國將是未來全球最大的指紋識別認證技術市場。
1.2  系統設計的目的
現代社會越來越需要高效可靠的身份識別系統。傳統的個人身份鑒別手段如口令、密碼、身份-甚至磁卡、IC 卡等識別卡方式。由于其與身份人的可分離性,可假冒、可偽造、可盜用、可破譯,已不能完全滿足現代社會經濟活動和社會安全防范的需要。從消除人為不安全因素看,只有不易被他人代替、仿制、甚至其本人也無法轉讓的身份誤碼別憑證才能勝任。因此,基于人體生理特征的身份識別系統逐漸為社會所矚目。隨著識別技術的不斷成熟,隨著計算機技術的飛速發展,各種基于人體生理特征的身份識別系統如:指紋、手掌、聲音、視網膜、瞳孔、面紋等識別技術紛紛從實驗室中走出來,由小型機落戶微機,走向民用。而從易用性、安全性、成熟性和造價等方面綜合比較,指紋識別技術將成為未來人體生理特征身份識別技術的主流之一,指紋自動識別技術開創了個人身份鑒別的新時代,將來我們生活的很多場 合都要用到指紋,指紋使我們的生活更方便、安全。
1.3  課題背景
指紋檢測可以良好的判斷和定義一個人的真實生物身份,從而降低社會活動中的信任成本。從根本上改變經濟和社會交往模式,提高效率。未來社會利用生物識別技術的場合將會越來越多,指紋識別技術日趨完善,指紋檢測變得越發重要。本次設計指紋識別電子密碼鎖是基于深圳指昂科技有限公司生產的ZAZ-010指紋模塊,可以根據串口通信協議與上位機實現通信,從而實現指紋的錄入、存儲、比對,并通過HS12864-15C液晶顯示出指紋采集存儲的過程和比對的結果。指紋電子密碼鎖安全可靠,使用方便。



2 整體設計方案
2.1  系統總體設計
2.1.1 系統功能描述
本系統是針對指紋采集、識別模塊開發出的指紋識別電子密碼鎖系統。該系統使用指紋模塊搜索手指,一旦搜索到手指,立即采集指紋圖像,并將采集到的圖像轉化成數據的形式發送出去。它利用人體指紋各異性和不變性,為用戶提供加密手段,使用時只需將手指平放在指紋采集儀的采集窗口上,即可完成采集任務,操作十分方便快捷。主要功能就是用液晶顯示出指紋模塊采集指紋圖像各個流程及比對的結果.采集指紋圖像之前,指紋模塊必須要檢測手指是否放在采集窗口上,所以就要有錄入指紋這一項功能。簡單的描述本次設計的功能即使用指紋模塊檢測、錄入指紋,將比對的數據顯示在液晶屏幕上.本系統擁有一次最多錄入三個指紋的能力。
該系統的主要功能有以下幾個方面:
1.錄入指紋:系統預先要有錄入指紋的功能,即將個人的指紋通過指紋采集器采集用戶指紋的特征信息。
2.合成指紋模板并存儲:通過光電轉換后,將指紋特征值和對應的 ID 號存儲到存儲器中。上位機只要有上傳指紋的命令,模塊可以立即將數據傳送到指定位置。
3.搜索指紋庫比對指紋:當有指紋錄入時,模塊會響應上位機指令搜索指紋庫比對指紋,同時液晶顯示比對結果,繼電器動作、發光二極管亮。
2.1.2 系統總體框架
系統的總體框架是指根據設計任務要求,對系統所需元件、設備參數進行必要的計算,通過認真研究、分析、比較選定設備型號,再將設備、元件通過可靠的接口電路聯系起來構成一個完整的系統。在系統的整體方案確定之前,先要明確設計要求,然后對系統硬件、軟件進行設計,其中包括繪制原理框圖、電路圖,對原理進行必要說明,綜合考慮系統的性能和穩定性要求,以保證所設計的系統達到預期的要求。通過查閱大量的文獻資料、綜合分析考慮 。主控芯片選用Atmeg16單片機。系統總體框圖如圖2-1所示:

file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsAC85.tmp.png
圖 2-1 系統總體框圖

系統主要由MCU、液晶屏、指紋模塊組成. 系統的工作方式主要是,當檢測到有按鍵按下時先由MCU通過串口通信控制指紋模塊對指紋進行采集、錄入、存儲、比對。然后,根據所得的數據對其它接口器件,如液晶屏、繼電器進行響應操作。
2.2  系統核心部件單片機
2.2.1 單片機的選擇
單片機微型計算機是微型計算機的一個重要分支,也是頗具生命力的機種。單片機微型計算機簡稱單片機,特別適用于控制領域,故又稱為微控制器。
通常,單片機由單塊集成電路芯片構成,內部包含有計算機的基本功能部件:中央處理器、存儲器和I/O接口電路等。因此,單片機只需要和適當的軟件及外部設備相結合,便可成為一個單片機控制系統。
20世紀末,電子技術獲得了飛速的發展,在其推動下,現代電子產品幾乎滲透了社會的各個領域,有力地推動了社會生產力的發展和社會信息化程度的提高,同時也使現代電子產品性能進一步提高,產品更新換代的節奏也越來越快。時間對人們來說總是那么寶貴,工作的忙碌性和繁雜性容易使人忘記當前的時間。忘記了要做的事情,當事情不是很重要的時候,這種遺忘無傷大雅。但是,一旦重要事情,一時的耽誤可能釀成大禍。
目前,單片機正朝著高性能和多品種方向發展趨勢將是進一步向著CMOS化、低功耗、小體積、大容量、高性能、低價格和外圍電路內裝化等幾個方面發展。單片機應用的重要意義還在于,它從根本上改變了傳統的控制系統設計思想和設計方法。從前必須由模擬電路或數字電路實現的大部分功能,現在已能用單片機通過軟件方法來實現了。這種軟件代替硬件的控制技術也稱為微控制技術,是傳統控制技術的一次革命。
單片機經過1、2、3代的發展,正朝著多功能、高性能、低電壓、低功耗、低價格、大存儲容量、強I/O功能及較好的結構兼容性方向發展。其發展趨勢不外乎以下幾個方面:
1.多功能     
單片機中盡可能地把所需要的存儲器和I/O口都集成在一塊芯片上,使得單片機可以實現更多的功能。比如A/D、PWM、PCA(可編程計數器陣列)、WDT(監視定時器---看家狗)、高速I/O口及計數器的捕獲/比較邏輯等。
有的單片機針對某一個應用領域,集成了相關的控制設備,以減少應用系統的芯片數量。例如,有的芯片以MEG16為核心,集成了USB控制器、SMART CARD接口、MP3解碼器、CAN或者I*I*C總線控制器等,LED、LCD或VFD顯示驅動器也開始集成在8位單片機中。
2.高效率和高性能
為了提高執行速度和執行效率,單片機開始使用RISC、流水線和DSP的設計技術,使單片機的性能有了明顯的提高,表現為:單片機的時鐘頻率得到提高;同樣頻率的單片機運行效率也有了很大的提升;由于集成度的提高,單片機的尋址能力、片內ROM(FLASH)和RAM的容量都突破了以往的數量和限制。
由于系統資源和系統復雜程度的增加,開始使用高級語言(如C語言)來開發單片機的程序。使用高級語言可以降低開發 難度,縮短開發周期,增強軟件的可讀性和可移植性,便于改進和擴充功能。
AVR 內核單片機具有豐富的指令集和32個通用工作寄存器。所有的寄存器都直接與算邏單元(ALU) 相連接,使得一條指令可以在一個時鐘周期內同時訪問兩個獨立的寄存器。這種結構大大提高了代碼效率,并且具有比普通的CISC 微控制器最高至10 倍的數據吞吐率。ATmega16L 有如下特點:
.16K字節的系統內可編程Flash(具有同時讀寫的能力,即RWW);
.512字節EEPROM,1K 字節SRAM;
.32 個通用I/O 口線;
.32 個通用工作寄存器;               
.用于邊界掃描的JTAG 接口,支持片內調試與編程;
.三個具有比較模式的靈活的定時器/ 計數器(T/C);
.片內/外中斷,片內經過標定的RC 振蕩器;
.可編程串行USART,有起始條件檢測器的通用串行接口;
.8路10位具有可選差分輸入級可編程增益(TQFP 封裝) 的ADC;
.具有片內振蕩器的可編程看門狗定時器;
.一個SPI 串行端口;
.四通道PWM,兩路8位,兩路16位;
.六個可以通過軟件進行選擇的省電模式:空閑模式、ADC 噪聲抑制模式、省電模式、掉電模式、Standby 模式以及擴展的Standby 模式;
.速度等級:0 - 8 MHz;
.工作電壓:2.7 - 5.5V;
.工作于空閑模式時CPU 停止工作,而USART、兩線接口、A/D 轉換器、SRAM、T/C、SPI 端口以及中斷系統繼續工作;
.掉電模式時晶體振蕩器停止振蕩,所有功能除了中斷和硬件復位之外都停止工作;
.在省電模式下,異步定時器繼續運行,允許用戶保持一個時間基準,而其余功能模塊處于休眠狀態;
.ADC 噪聲抑制模式時終止CPU 和除了異步定時器與ADC 以外所有I/O 模塊的工作,以降低ADC 轉換時的開關噪聲;
.Standby 模式下只有晶體或諧振振蕩器運行,其余功能模塊處于休眠狀態,使得器件只消耗極少的電流,同時具有快速啟動能力;
擴展Standby 模式下則允許振蕩器和異步定時器繼續工作。
本芯片是以Atmel 高密度非易失性存儲器技術生產的。片內ISP Flash 允許程序存儲器通過ISP 串行接口,或者通用編程器進行編程,也可以通過運行于AVR 內核之中的引導程序進行編程。引導程序可以使用任意接口將應用程序下載到應用Flash存儲區(Application Flash Memory)。在更新應用Flash存儲區時引導Flash區(Boot Flash Memory)的程序繼續運行,實現了RWW 操作。
通過將8 位RISC CPU 與系統內可編程的Flash 集成在一個芯片內,ATmega16 成為一個功能強大的單片機,為許多嵌入式控制應用提供了靈活而低成本的解決方案。
下面是基于八位AVR單片機芯片ATMEGA16的主控系統方案:
2.2.2 ATMEG16單片機的介紹
ATMEG 16的管腳說明如圖2-2所示:




file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsAC86.tmp.png
圖2-2 DIP封裝 ATMEG 16單片機引腳結構圖

1 VCC為數字電路的電源,GND為地。
2. 端口A(PA7-PA0)作為A/D轉換器的模擬輸入端,是8位雙向I/O口,具有編程的內部上拉電阻。其輸出緩沖器具有對稱的驅動特性,可以輸出和吸收大電流。作為輸入使用時,若內部上拉電阻使能,端口被外部拉低時將輸出電流。在復位過程中,即使系統時鐘還未起振,端口A處于高阻狀態。
3. 端口B(PB7-PB0)為8位雙向I/O口,具有可編程的內部上拉電阻。其輸出緩沖器具有對稱的驅動特性,可以輸出和吸收大電流。作為輸入使用時,若內部上拉電阻使能,端口被外部電路拉低時將輸出電流。在復位過程中,即使系統始終還未起振,端口B處于高阻狀態。端口B也可以用做其他不同的特殊功能。
4. 端口C(PC7-PC0)為8位雙向I/O口,具有可編程的內部上拉電阻。其輸出緩沖器具有對稱的驅動特性,可以輸出和吸收大電流。作為輸入使用時,若內部上拉電阻使能,端口被外部電路拉低時將輸出電流。在復位過程中,即使系統始終還未起振,端口C處于高阻狀態。如果JTAG接口使能,即使復位出現引腳PC5(TD1)、PC3(TMS)與PC2(TCK)的上拉電阻被激活。端口C也可以用做其他不同的特殊功能。
5. 端口D(PD7-PD0)為8位雙向I/O口,具有可編程的內部上拉電阻。其輸出緩沖器具有對稱的驅動特性,可以輸出和吸收大電流。作為輸入使用時,若內部上拉電阻使能,端口被外部電路拉低時將輸出電流。在復位過程中,即使系統始終還未起振,端口D處于高阻狀態。端口D也可以用做其他不同的特殊功能。
6. RESET為復位輸入引腳,持續時間超過最小門限時間的低電平將引起復位。
7 XTAL1為晶振反相放大器的輸入端和內部時鐘操作電路的輸入端。
8 XTAL2為晶振反相放大器的輸出端。
9.  AVCC是端口A與A/D轉換器的電源。不使用ADC時,該引腳應該直接與Vcc連接。使用ADC時應通過一個低通濾波器與Vcc連接。
10.AREF是A/D的模擬基準輸入引腳。
2.2.3 單片機的復位電路
復位是單片機的初始化操作,其作用是使CPU中的各個部件都處于一個確定的初始狀態,并從這個狀態開始工作。
ATmega16有5個復位源:
1. JTAG AVR復位:復位寄存器為1時MCU復位。
2. 上電復位:電源電壓低于上電復位門限 VPOT時,MCU復位。
3. 看門狗復位:看門狗使能并且看門狗定時器溢出時復位發生。
4. 外部復位:引腳 RESET上的低電平持續時間大于最小脈沖寬度時MCU復位。
5. 掉電檢測復位:掉電檢測功能使能,且電源電壓低于掉電檢測電壓時復位。
ATmega16單片機5個復位源中,最常用的是外部復位和看門狗復位電路。外部復位電路由外加于RESET 引腳的低電平產生。當復位低電平持續時間大于最小脈沖寬度時即觸發復位過程,即使此時并沒有時鐘信號在運行。當外加信號達到復位門限電壓VTOUT延時周期開始。延時結束后MCU即啟動。外部復位時序圖如圖2-3所示,外部復位原理圖如圖2-4所示:

file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsAC96.tmp.jpg

2-3 外部電路復位時序圖
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsAC97.tmp.jpg
2-4 外部復位原理圖

2.2.4 ATMEG16最小系統及晶振的選擇
ATmega16芯片有如下幾種通過Flash熔絲位進行選擇的時鐘源。時鐘輸入到AVR時鐘發生器,再分配到相應的模塊。
表2—1 熔絲配置模式
器件時鐘選項
CKSEL3..0
外部晶體/陶瓷振蕩器
1111 – 1010
外部低頻晶振
1001
外部RC振蕩器
1000 – 0101
標定的內部RC振蕩器
0100 – 0001
外部時鐘
0000
          注:此選項不適用于晶體,只能用于陶瓷諧振器。
晶體振蕩電路:XTAL1XTAL2分別為用作片內振蕩器的反向放大器的輸入和輸出,如圖2-5所示,這個振蕩器可以使用石英晶體,也可以使用陶瓷諧振器。熔絲位CKOPT用來選擇這兩種放大器模式的其中之一。當CKOPT被編程時振蕩器在輸出引腳產生滿幅度的振蕩。這種模式適合于噪聲環境,以及需要通過XTAL2驅動第二個時鐘緩沖器的情況。而且這種模式的頻率范圍比較寬。當保持CKOPT為未編程狀態時,振蕩器的輸出信號幅度比較小。其優點是大大降低了功耗,但是頻率范圍比較窄,而且不能驅動其他時鐘緩沖器。對于諧振器,CKOPT未編程時的最大頻率為8 MHz,CKOPT編程時為16 MHz。C1C2的數值要一樣,不管使用的是晶體還是諧振器。最佳的數值與使用的晶體或諧振器有關,還與雜散電容和環境的電磁噪聲有關為了保證系統穩定性和串口傳輸質量所以選用外部晶振,晶振選用7.3728M。

file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsACB7.tmp.png
             2-5 ATMEG16最小系統

2.3  液晶顯示模塊
顯示模塊采用HS12864-15C系列中文圖形系列液晶模塊。由控制器ST7920控制與驅動。
2.3.1 HS12864-15C系列液晶的特點
1. HS12864-15系列硬件特性如下:
.提供8位,4位并行接口及傳行接口可選
.自動電源啟動復位功能
.內部自建振蕩源
.64*16位字符顯示RAM(DDRAM最多16字符*4行)
.2M位中文字型ROM(CGROM),總共8192個中文字型
2. HS12864-15系列軟件特性如下:
.文字與圖形混合顯示功能
.畫面清除功能
.光標歸位功能
.顯示開/關功能
.反白顯示功能
.垂直畫面旋轉功能
.休眠模式
2.3.2 HS12864-15C系列液晶的引腳功能
引腳PSB為芯片的傳輸方式控制端;引腳 E 為讀寫使能信號,它是在下降沿時數據被鎖存入HS12864液晶的;在E高電平期間,數據被讀出;R/W 為讀寫選擇信號,當它為一時為讀選通,為零時為寫選通;DB0-DB7為數據總線RST為復位信號。復位信號有效時,關閉液晶顯示,使顯示起始行為0,RST可跟MCU連,由MCU控制;也可直接接VDD,使之不起作用。引腳功能如表2-1所示:
2-1 HS12864-15C的引腳功能
引腳符號
狀態
引腳名稱
功能
PSB
輸入
數據傳輸方式
PSB=1為并行傳輸;PSB=0為串行傳輸
E
輸入
讀寫使能信號
[size=10.5000pt]在E下降沿,數據被鎖存(寫)入HS12864-15C;在E高電平期間,數據被讀出
R/W
輸入
讀寫選擇信號
R/W=1為讀選通,R/W=0為寫選通
RS
輸入
數據、指令選擇信號
RS=1為數據操作
RS=0為寫指令或讀狀態
DB0-DB7
三態
數據總線


RST
輸入
復位信號
復位信號有效時,關閉液晶顯示,使顯示起始行為0[size=10.5000pt],RST可跟MCU相連,由M[size=10.5000pt]CU控制;也可直接接VDD,使之不起作用。





2.3.3 液晶顯示HS12864-15C的指令系統
1.清除顯示
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
0
0
0
0
0
0
0
0
0
1

2.顯示開/關指令
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
0
0
0
0
0
0
1
D
C
B
控制整體顯示開關,游標開關,游標位置顯示反白開關;
D=1,整體顯示開;D=0,整體顯示關;
C=1,游標顯示開;C=0,游標顯示關;
B=1,游標位置顯示反白開;B=0,游標位置顯示反白關;

3.讀取忙狀態
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
0
1
BF
A6
A5
A4
A3
A2
A1
A0
讀取忙狀態以確定內部動作是否完成,同時可以讀出地址計數器AC的值

4.寫數據
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
1
0
寫數據
讀、寫數據指令每執行完一次讀、寫操作,列地址就自動增一,必須注意的是,進行讀操作之前,必須有一次空讀操作,緊接著再讀才會讀出所要讀的單元中的數據。

5.讀數據
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
1
1
                讀 顯 示 數 據
讀、寫數據指令每執行完一次讀、寫操作,列地址就自動增一,必須注意的是,進行讀操作之前,必須有一次空讀操作,緊接著再讀才會讀出所要讀的單元中的數據。

2.4  電源和指紋模塊
指紋模塊采用深圳市指昂科技有限公司生產的ZAZ-010系列獨立式指紋識別模塊,以高速DSP處理器為核心。主要技術指標如下
供電電壓:DC 3.6-6.0V
供電電流:工作電流:100mA(典型值)
峰值電流:150mA
指紋圖像錄入時間:<0.5 秒
窗口面積 14 *18 mm
匹配方式:
比對方式(1:1)
搜索方式(1:N)
特征文件: 256 字節
模板文件: 512 字節
存儲容量: 100枚
安全等級: 五級(從低到高:1、2、3、4、5)
認假率(FAR):<0.001%
拒真率(FRR):<0.1%
搜索時間: 1.0 秒 (1:1000 時,均值)
上位機接口: UART(TTL 邏輯電平)
通訊波特率(UART): (9600*N)bps
其中N=1~12 (默認值N=6,即57600bps)
2.4.1 ZAZ-010系列獨立式指紋識別模塊引腳功能
模塊中引腳1與電源相連,引腳2接單片機的RXD端,引腳3接單片機的TXD端,引腳4懸空,引腳5接地。表2-2如下:
表2-2指紋識別模塊引腳功能
引腳號
名稱
類型
功能描述
1
Vin
in
電源正輸入端
2
TD
out
串行數據輸出。TTL 邏輯電平
3
RD
in
串行數據輸入。TTL 邏輯電平
4
NC
未定義,懸空。
5
GND
信號地。內部與電源地連接



2.4.2 ZAZ-010系列指紋識別模塊指令系統
模塊通過串行通訊接口,可直接與采用3.3v或者5v電源的單片機進行通訊。模塊數據發送端接上位機接收端,模塊數據接收腳接上位機數據發送端。
錄入指紋圖像指令:
指令包格式:

2bytes
4bytes
1 byte
2 bytes
1 byte
2bytes
包頭
模塊地址
包標識
包長度
指令碼
校驗和
0xEF01
Xxxx
01H
03H
01H
05H
應答包格式:
2bytes
4bytes
1 byte
2 bytes
1 byte
2bytes
包頭
模塊地址
包標識
包長度
確認碼
校驗和
0xEF01
Xxxx
07H
03H
xxH
SUM
注:確認碼=00H 表示錄入成功;
確認碼=01H 表示收包有錯;
確認碼=02H 表示傳感器上無手指;
確認碼=03H 表示錄入不成功;

圖像生成特征 Img2Tz指令:
指令包格式:
2bytes
4bytes
1 byte
2 bytes
1 byte
1 byte
2 bytes
包頭
模塊地址
包標識
包長度
指令碼
緩沖區號
校驗和
0xEF01
Xxxx
01H
04H
02H
BufferID
SUM
應答包格式:
2bytes
4bytes
1 byte
2 bytes
1 byte
2bytes
包頭
模塊地址
包標識
包長度
確認碼
校驗和
0xEF01
Xxxx
07H
03H
xxH
SUM
注:確認碼=00H 表示生成特征成功;
確認碼=01H 表示收包有錯;
確認碼=06H 表示指紋圖像太亂而生不成特征;
確認碼=07H 表示指紋圖像正常,但特征點太少而生不成特征;
確認碼=15H 表示圖像緩沖區內沒有有效原始圖而生不成圖像;

特征合成模板RegMode1指令:
功能說明:將CharBuffer1與CharBuffer2中的特征文件合成特征模板。
指令包格式:
2bytes
4bytes
1 byte
2 bytes
1 byte
2bytes
包頭
模塊地址
包標識
包長度
指令碼
校驗和
0xEF01
Xxxx
01H
03H
05H
09H
應答包格式:
2bytes
4bytes
1 byte
2 bytes
1 byte
2bytes
包頭
模塊地址
包標識
包長度
確認碼
校驗和
0xEF01
Xxxx
07H
03H
xxH
SUM
注:確認碼=00H 表示合并成功;
確認碼=01H 表示收包有錯;
確認碼=0aH 表示合并失。▋擅吨讣y不屬于同一手指);

存儲模板 Store指令:
指令包格式:
2bytes
4bytes
1byte
2 bytes
1 byte
1 byte
2 bytes
2bytes
包頭
模塊地址
包標識
包長度
指令碼
緩沖區號
位置號
校驗和
0xEF01
Xxxx
01H
06H
06H
BufferID
PageID
SUM
應答包格式:
2bytes
4bytes
1 byte
2 bytes
1 byte
2bytes
包頭
模塊地址
包標識
包長度
確認碼
校驗和
0xEF01
Xxxx
07H
03H
xxH
SUM
注:確認碼=00H 表示儲存成功;
確認碼=01H 表示收包有錯;



搜索指紋Search指令:
指令包格式:
2bytes
4bytes
1byte
2bytes
1byte
1byte
2bytes
2bytes
2bytes
包頭
模塊地址
包標識
包長度
指令碼
緩沖區號
參數
參數
校驗和
0xEF01
Xxxx
01H
08H
04H
ID
StarPage
PageNum
SUM
應答包格式:
2bytes
4bytes
1byte
2bytes
1byte
2bytes
2bytes
2bytes
包頭
模塊地址
包標識
包長度
確認碼
頁碼
得分
校驗和
0xEF01
Xxxx
07H
07H
xxH




SUM
注:確認碼=00H 表示搜索到;
確認碼=09H 表示沒有搜索;
2.4.3 電源模塊
電源模塊可以直接提供正5V的直流電壓,但是由于在一些工業環境中并不提供直流電源,而都是交流電源,為確保其實用性,在電源這一部分,提供了整流穩壓電路,可以把交流電壓變成5V的電壓,為整個電路板提供電源。
從圖2-6可以看出,當開關按下時,電路接通,先通過一個整流電路,使交流電壓變成直流電壓。為了保證其輸出的電壓是5V,在后面接一個穩壓電路,由一個7805穩壓器和一個發光二極管組成,發光二極管作為電源導通的指示燈。當電源導通時二極管發光。其中電容C1起濾波作用,電容C2是抑制高平信號。電容C3, C4直接接地,起到抗干擾的作用,能使電壓穩定在5V。有了電源模塊避免了因沒有直流電源而無法使用的問題,使這個儀表能夠在更多的環境中使用。電源模塊電路圖如圖2-6所示:









file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsACD8.tmp.png





























2-6 電源模塊電路圖
3 系統軟件的設計
3.1  系統程序工作分析
在本文的電路板中,單片機是作為控制器嵌入到系統中。應用程序的開發主要分為兩大部分,即對ZAZ-010指紋識別模塊的的應用程序開發以及對HS12864液晶、按鍵程序的開發。因此,要實現其應用,需要對其進行聯合調試。電路軟件應用開發根據所設計的硬件。程序開發的方式將主要建立一系列的C語言函數子程序供主程序的隨時調用。即ZAZ-010指紋識別模塊或液晶電路分別編制C語言函數子程序。因此,需要有專門的開發工具。本設計中,采用AVRStudio4.0單片機軟件開發環境對單片機進行編程,由于該編譯器支持模塊化程序設計,因此可以先將源程序劃分為幾個模塊分別編寫,然后再由編譯器生成一個最終文件. 該開發環境可以對程序進行軟件仿真調試,因此可以方便地進行程序的編寫和調試。調試通過的代碼文件通過開發板下載到單片機。單片機在上電后,主程序應該完成相應的初始化工作。依據電路的功能要求,主程序必須對液晶初始化、同時對按鍵進行檢測,如果有對應的按鍵按下。執行相應的操作,單片機通過串行接口對指紋模塊進行讀寫。
3.2  設計前準備工作
由于使用串口和模塊通訊,所以必須先約定好單片機和模塊的的串口工作速度和數據包格式。
UART數據格式定位為:8位數據位、1位停止位、無奇偶校驗位,數據傳輸速率為57600bps。
通訊數據包格式定義為:
單片機發送串行數據包格式如圖3-1 MCU發送數據包格式
D7
D6
D5
D4
D3
D2
D1
D0
發送數據共11-14個字節,前6個字節是模塊的包頭和模塊地址為固定值,后5-8個字節是傳輸的模塊的命令。同時根據外部晶振和系統默認的傳輸速率算出控制串口的各寄存器的初始值。參考meg16資料后編寫了以下一段串口初始化。
各寄存器設置的程序.
如下面的一段程序既是對個寄存器的初始值的設置
void UART_Init(void)
{
UCSRB=0x00;//disable while setting baud rate
UCSRA=0x00;//Bit1為1則倍速發送
UCSRC=0x06;
UBRRL=0x07;//波特率:57600Bps
UBRRH=0x00;//誤差率:0.000%
UCSRB=0x18;
}
:選用外部7.3728M晶振.

3.3  單片機的程序設計
根據上節分析,制定如下圖的程序流程圖。主程序主要由液晶顯示、通訊子、按鍵程序組成。主程序的工作流程描述如下:首先初始化各種硬件功能模塊進行初始化。包括開機液晶顯示、鍵盤掃描、指紋模塊建立通信。
主程序設計流程如圖3-1所示:




















file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsACD9.tmp.png
程序的巡檢過程: 首先對各模塊進行初始化,檢測在有無按鍵按下,如果按下判斷是那一個按鍵,并作出判斷是否調用相應子程序;當按鍵1按下后,調用通信模塊子程序,錄入指紋并將其存入模塊緩沖區,同理當按鍵2按下后,效果相同。
依次當按鍵3按下時,將指紋模塊兩緩沖區中的指紋特征文件合成特征模板并存儲與指紋模板庫中,當4按鍵按下后搜索指紋并比對.當指紋模塊中有指紋存儲時直接按4鍵同樣也可進行比對。
程序關鍵的就是對指紋模塊的通信控制, 考慮到處理過程太過冗長,限于篇幅只能將其省略,如需查看,可以看附錄1。其它命令發送子函數因大部分的命令大體格式基本相同。
3.3.1  鍵盤管理程序設計流程
鍵盤模塊的工作流程圖如圖3-2所示:



file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsACDA.tmp.png
                        3-2 鍵盤模塊流程圖
3.3.2  LCD顯示模塊程序設計流程
顯示模塊主要完成數據的顯示功能。首先當模塊接受指令前,單片機必須確認模塊內部處于非忙碌狀態,然后根據接受到指令顯示相關的內容在屏幕上。

3.3.3  指紋通信模塊的程序設計流程
串口通信數據發送、接收流程圖如圖3-3:


file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsACEA.tmp.png
3-3 串口通信數據發送、接收流程圖




4 實物的制作與調試
4.1  電路的焊接        
1.焊前準備
首先要熟悉所焊印制電路板的裝配圖,并按圖紙配料,檢查元器件型號、規格及數量是否符合圖紙要求,并做好裝配前元器件引線成型等準備工作。
2.焊接順序
元器件裝焊順序依次為:電阻器、電容器、二極管、三極管、集成電路、大功率管,其它元器件為先小后大。
3.對元器件焊接要求
(1)電阻器焊接
按圖將電阻器準確裝人規定位置。要求標記向上,字向一致。裝完同一種規格后再裝另一種規格,盡量使電阻器的高低一致。焊完后將露在印制電路板表面多余引腳齊根剪去。
(2)電容器焊接
將電容器按圖裝人規定位置,并注意有極性電容器其 “ + ” 與 “ - ” 極不能接錯,電容器上的標記方向要易看可見。先裝玻璃釉電容器、有機介質電容器、瓷介質電容器,最后裝電解電容器。
(3)二極管的焊接
二極管焊接要注意以下幾點:第一,注意陽極陰極的極性,不能裝錯;第二,型號標記要易看可見;第三,焊接立式二極管時,對最短引線焊接時間不能超過 2S 。
(4)三極管焊接
注意 e 、 b 、 c 三引線位置插接正確;焊接時間盡可能短,焊接時用鑷子夾住引線腳,以利散熱。焊接大功率三極管時,若需加裝散熱片,應將接觸面平整、打磨光滑后再緊固,若要求加墊絕緣薄膜時,切勿忘記加薄膜。管腳與電路板上需連接時,要用塑料導線。
(5)集成電路
焊接首先按圖紙要求,檢查型號、引腳位置是否符合要求。焊接時先焊邊沿的二只引腳,以使其定位,然后再從左到右自上而下逐個焊接。對于電容器、二極管、三極管露在印制電路板面上多余引腳均需齊根剪去。

4.2  電路和程序的調試
4.2.1 單片機的程序下載
程序存儲器的更新以頁的方式進行。在用臨時頁緩沖器存儲的數據對一頁存儲器進行編程時,首先要將這一頁擦除。SPM指令以一次一個字的方式將數據寫入臨時頁緩沖器。臨時頁緩沖器的寫入可以在頁擦除命令之前完成,也可以在頁擦除和頁寫操作之間完成。通過電腦上的下載軟件將*.HEX文件傳輸到(如圖4-1所示)USB下載線板上的ATmega8芯片里,程序代碼在這里經過處理后從固定的I/O管腳中輸出燒寫到單片機的Flash存儲器中。此外單片機一般采用5V以下的電源供電,USB接口也采用5V電源,所以,該下載線還可以通過電腦向單片機提供工作電源。該下載線采用先進的USB2.0接口技術解決了筆記本不帶并口的遺憾,還有它小巧精致,攜帶方便,下載程序速度快等優點得到了眾多編程愛好者的青睞而被廣泛的使用著

file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsACEB.tmp.png
                    4-1 USB下載線實物圖

4.2.2  串口調試
使用串口調試助手進行測試
串口調試程序見附錄1:
測試結果如圖4-2所示:
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsACEC.tmp.jpg
圖4-2 串口通信測試結果圖

4.2.3  液晶鍵盤調試
液晶鍵盤測試程序見附錄2:
液晶鍵盤測試程序結果如圖 4-3所示:
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsACED.tmp.png
             4-3 液晶鍵盤測試結果


   
根據設計要求,本設計已經基本完成題目要求但還存在不足之處。由于單片機flash容量有限,在指紋存儲數目上較少,只能錄入三個指紋 ,并進行比對。
通過方案論證、資料查詢及電路設計和反復調試,不斷的解決電路調試過程中的問題,最終在規定的時間內完成了設計任務。本設計由于水平有限,電路及程序設計還有需要改進的地方,在今后的學習和研究中,將繼續改進完善。
另外在調試過程中,以保證作品實現功能準確為前提,盡量做到電路簡單、美觀、效果好、成本低,以增強其實用價值。
本設計最終可以實現三個指紋錄入、比對和模擬開鎖的過程,但存儲指紋數目有待進一步的研究開發。





















參考文獻
[1] 楊若冰,杜燕.指紋識別技術與產業分析,2006年
[2]張成,周媛媛等.指紋采集技術及其產品發展趨勢.電子技術應用,2004年
[3] 柴曉光,岑寶熾.民用指紋識別技術,北京:人民郵電出版社,2004
[4] 丁化成,耿德根等.AVR單片機應用設計,北京:北京航空航天大學出版社,2002
[5] 張毅剛.單片機原理與應用,北京:高等教育出版社,2006
[6] 張天凡.51單片機C語言開發詳解,北京:電子工業出版社,2008
[7] 溫正,何嘉揚等.AVR單片機開發從入門到精通,中國電力出版,2009
[8] 李泓.AVR單片機入門與實踐,北京航空航天大學,2008
[9] 佟長福. AVR單片機GCC程序設計, 北京航空航天大學出版社, 2006
[10] 張軍,宋濤.AVR單片機C語言程序設計實例精粹, 電子工業出版社, 2009年01月
[11] 嚴天峰.單片機應用系統設計與仿真調試,北京航天航空大學出版社,2005
[12] 周立民.單片機應用系統設計.北京:北京航空航天大學出版社,1990.
[13] 張維振.無線電設備裝接調試與檢測維修實用手冊[M],北京:銀聲音像出版社,2004
[14] 李貴山,楊建平等.微型計算機測控技術。北京:機械工業出版社,2002.
[15] 張錫富.傳感器.北京:機械工業出版社,2004.
[16] 曹承志.微型計算機控制技術.北京:機械工業出版社,2001.
[17] 黃賢武.傳感器實用電路設計.成都:電子科技大學出版社,1998.
[18] 李貴山,周征等.檢測與控制技術.西安:西安電子科技大學出版社,2006.








附錄1:串口調試子程序
串口調試子程序
#include<avr/io.h>
#include<util/delay.h>
//通信協議定義
unsigned char FP_Pack_Head[6] = {0xEF,0x01,0xFF,0xFF,0xFF,0xFF};  //協議包頭
unsigned char FP_Get_Img[6] = {0x01,0x00,0x03,0x01,0x0,0x05};    //獲得指紋圖像
unsigned char a[6] ={};
unsigned char b[6] ={};
//初始化 UART 子程序
void UART_Init(void)
{
    UCSRB  =  0x00;     //disable while setting baud rate
    UCSRA  =  0x00;     //Bit11則倍速發送
    UCSRC  =  0x06;  
    UBRRL  =  0x07;     //波特率:57600 Bps
    UBRRH  =  0x00;     //誤差率:0.000%
    UCSRB  =  0x18;
}

//發送一個位
void UART_Send_Byte(unsigned char ucData)
{
  while(!(UCSRA&(1<<UDRE))); //等待緩沖區為空
  UDR = ucData;
}
unsigned char UART_Receive_Byte(void)
{
  while(!(UCSRA & ( 1<<RXC )) );

  return UDR;
}
//_獲得指紋圖像命令
void Cmd_Get_Img(void)
{
    unsigned char i;
    for(i=0;i<6;i++)
    UART_Send_Byte(FP_Pack_Head);
    for(i=0;i<6;i++)
    UART_Send_Byte(FP_Get_Img);
    for(i=0;i<6;i++) //發送包頭
    a =UART_Receive_Byte();
    for(i=0;i<6;i++) //發送命令 0x1d
    b = UART_Receive_Byte();
    for(i=0;i<6;i++)
    UART_Send_Byte(a);
    for(i=0;i<6;i++)
    UART_Send_Byte(b);
}
int main()
{
UART_Init();
Cmd_Get_Img();
}
附錄2:整體源程序
整體源程序
#include<avr/io.h>
#include<util/delay.h>
//#include<avr/pgmspace.h>                 
#define uchar unsigned char
#define uint unsigned int
#define key1 0x01
#define key2 0x02
#define key3 0x04
#define key4 0x08
static uchar k=0;
uchar name00[]={"                "};
uchar name01[]={"    歡迎使用    "};
uchar name02[]={"單片機指紋密碼鎖"};
uchar name03[]={"                "};
uchar name04[]={"  指紋采集開始  "};
uchar name05[]={"  指紋對比開始  "};
uchar name06[]={"  指紋存儲開始  "};
uchar name07[]={"    一次采集    "};
uchar name08[]={"    二次采集    "};
uchar name09[]={"    錄入成功    "};
uchar name10[]={"    錄入失敗    "};
uchar name11[]={"    收包有錯    "};
uchar name12[]={"傳感器上無手指  "};
uchar name13[]={"  生成特征成功  "};
uchar name14[]={"圖想亂生不成特征"};
uchar name15[]={"圖象正常特征點少"};
uchar name16[]={"指紋模板合并成功"};
uchar name17[]={"指紋模板合并失敗"};
uchar name18[]={"  非同一手指    "};
uchar name19[]={"    存儲成功    "};
uchar name20[]={"  寫指紋庫出錯  "};
uchar name21[]={"    指紋匹配    "};
uchar name22[]={"  指紋不匹配    "};
uchar name23[]={"    密碼正確    "};
uchar name24[]={"    密碼不正確    "};
uchar FP_1[6]={};
uchar FP_2[6]={};
uchar FP_Pack_Head[6]={0xEF,0x01,0xFF,0xFF,0xFF,0xFF};  //協議包頭
uchar FP_Get_Img[6]={0x01,0x00,0x03,0x01,0x0,0x05};    //獲得指紋圖像
uchar FP_Search_0_9[11]={0x01,0x0,0x08,0x04,0x01,0x0,0x0,0x0,0x13,0x0,0x21}; //搜索0-9號指紋
uchar FP_Img_To_Buffer1[7]={0x01,0x0,0x04,0x02,0x01,0x0,0x08}; //將圖像放入到BUFFER1
uchar FP_Img_To_Buffer2[7]={0x01,0x0,0x04,0x02,0x02,0x0,0x09}; //將圖像放入到BUFFER2
uchar FP_Reg_Model[6]={0x01,0x0,0x03,0x05,0x0,0x09}; //BUFFER1BUFFER2合成特征模版
volatile uchar  FP_Save_Finger1[9]={0x01,0x00,0x06,0x06,0x01,0x00,0x0B,0x00,0x19};//BUFFER1中的特征碼存放到指定的位置
volatile uchar  FP_Save_Finger2[9]={0x01,0x00,0x06,0x06,0x01,0x00,0x0C,0x00,0x1A};//BUFFER1中的特征碼存放到指定的位置
volatile uchar  FP_Save_Finger3[9]={0x01,0x00,0x06,0x06,0x01,0x00,0x0D,0x00,0x1B};//BUFFER1中的特征碼存放到指定的位置
uchar yb=0x80;
//初始化 UART 子程序
void UART_Init(void)
{
    UCSRB  =  0x00;     //disable while setting baud rate
    UCSRA  =  0x00;     //Bit11則倍速發送
    UCSRC  =  0x06;     //傳送一楨數據位為8
    UBRRL  =  0x07;     //波特率:57600 Bps
    UBRRH  =  0x00;     //誤差率:0.000%
    UCSRB  =  0x18;     
}
//發送八位數據
void UART_Send_Byte( uchar ucData)
{
  while(!(UCSRA&(1<<UDRE))); //等待緩沖區為空
  UDR = ucData;
}
//接收八位數據
uchar  UART_Receive_Byte(void)
{
  while(!(UCSRA&(1<<RXC)));//等待緩沖區為空
return UDR;
}
//_獲得指紋圖像命令
void Cmd_Get_Img(void)
{
    uchar i,j;
    for(i=0;i<6;i++) //發送包頭與模塊地址
    UART_Send_Byte(FP_Pack_Head);
    for(i=0;i<6;i++) //發送命令 0x1d
    UART_Send_Byte(FP_Get_Img);
    for(i=0;i<6;i++)
    FP_1=UART_Receive_Byte();
        for(i=0;i<6;i++)
    FP_2=UART_Receive_Byte();
    j=FP_2[3];
   if (j==0x00)
  {_delay_ms(100000);
   reset ();
   display6();}
   if (j==0x01)
   {reset();
    wr_com(yb);
   outChinese(0x90,8,name11);}
   if (j==0x02)
   {_delay_ms(100000);
    reset();
    display7();}
        if (j==0x03)
   { reset();
    wr_com(yb);
   outChinese(0x90,8,name10);}
}
//講圖像轉換成特征碼存放在Buffer1
void Cmd_Img_To_Buffer1(void)
{
                uchar i,j;
               for(i=0;i<6;i++)    //發送包頭與模塊地址
                 {
                   UART_Send_Byte(FP_Pack_Head);   
                        }
                        for(i=0;i<7;i++)   //發送命令 將圖像轉換成 特征碼 存放在 CHAR_buffer1
             {
                         UART_Send_Byte(FP_Img_To_Buffer1);
                        }
            for(i=0;i<6;i++)
            {
                        FP_1=UART_Receive_Byte();}
                        for(i=0;i<6;i++)
          {
                    FP_2=UART_Receive_Byte();}
           j=FP_2[3];
         if (j==0x00)
    {_delay_ms(100000);
      reset ();
      display8();}
           if (j==0x06)
          {_delay_ms(100000);
      reset ();
      display9();}
          if (j==0x07)
          {_delay_ms(100000);
      reset ();
      display10();}
}
//將圖像轉換成特征碼存放在Buffer2
void Cmd_Img_To_Buffer2(void)
{
           uchar i,j;
           for(i=0;i<6;i++)    //發送包頭
                 {
                   UART_Send_Byte(FP_Pack_Head);   
                        }
                      for(i=0;i<7;i++)   //發送命令 將圖像轉換成 特征碼 存放在 CHAR_buffer2
             {
                         UART_Send_Byte(FP_Img_To_Buffer2);
                        }
            for(i=0;i<6;i++)
           {
                        FP_1=UART_Receive_Byte();}
                        for(i=0;i<6;i++)
          {
                    FP_2=UART_Receive_Byte();}  
                  j=FP_2[3];
         if (j==0x00)
    {_delay_ms(100000);
      reset ();
      display8();}
           if (j==0x06)
          {_delay_ms(100000);
      reset ();
      display9();}
          if (j==0x07)
          {_delay_ms(100000);
      reset ();
      display10();}
}
//BUFFER1 BUFFER2 中的特征碼合并成指紋模版
void Cmd_Reg_Model(void)
{
    uchar i,j;
    for(i=0;i<6;i++) //發送包頭與模塊地址
    {
      UART_Send_Byte(FP_Pack_Head);   
    }
    for(i=0;i<6;i++) //命令合并指紋模版
    {
      UART_Send_Byte(FP_Reg_Model);   
    }
    for(i=0;i<6;i++)
           {
                        FP_1=UART_Receive_Byte();}
        for(i=0;i<6;i++)
          {
                    FP_2=UART_Receive_Byte(); }
                  j=FP_2[3];
if (j==0x00)
{_delay_ms(400000);
      reset ();
      display11();}
if (j==0x0a)
{_delay_ms(400000);
      reset ();
      display12();
           while(1);}
}
//將并成后的指紋模版存儲到指紋模塊flash模板庫中
void  Store_Char_Model(void)
{   uchar i,j;
    for(i=0;i<6;i++) //發送包頭與模塊地址
    {
      UART_Send_Byte(FP_Pack_Head);   
    }
   if(k==0)
  { for(i=0;i<9;i++) //命令存儲指紋模版
    {
      UART_Send_Byte( FP_Save_Finger1  );
       }
    }
        if(k==1)
   { for(i=0;i<9;i++) //命令存儲指紋模版
    {
      UART_Send_Byte( FP_Save_Finger2  );
        }
    }
        if(k==2)
   { for(i=0;i<9;i++) //命令存儲指紋模版
    {
      UART_Send_Byte( FP_Save_Finger3  );
       }
        }
    for(i=0;i<6;i++)
          {
                        FP_1=UART_Receive_Byte();}
        for(i=0;i<6;i++)
          {
                    FP_2=UART_Receive_Byte(); }
                  j=FP_2[3];
if(j==0x00)
{_delay_ms(400000);
      reset ();
      display13();}
if(j==0x18)
{_delay_ms(300000);
      reset ();
      display14();}
}
//搜索與BUFFER1中特征碼相符合的指紋模版
void  search_Char_Mode(void)   
{   uchar i,j;
    for(i=0;i<6;i++) //發送包頭與模塊地址
    {
      UART_Send_Byte(FP_Pack_Head);   
    }
    for(i=0;i<11;i++) //命令搜索指紋模版
    {
      UART_Send_Byte(FP_Search_0_9);
    }
for(i=0;i<6;i++)
           {
                        FP_1=UART_Receive_Byte();}
        for(i=0;i<10;i++)
          {
                    FP_2=UART_Receive_Byte(); }
                  j=FP_2[3];
if(j==0x00)
{_delay_ms(100000);
      reset ();
      display15();}
if(j==0x09)
{_delay_ms(100000);
      reset ();
      display16();}
void keyboard( void)
{  unsigned char Keyvalue;//鍵盤值
//端口初始化
DDRC=~_BV(PC0)& ~_BV(PC1)& ~_BV(PC2)& ~_BV(PC3);
while(1)
{  Keyvalue=(PINC&0x0F);
if (Keyvalue!=0x0f)
{//有鍵按下
_delay_ms(20);
Keyvalue=(PINC&0x0F);
if (Keyvalue==0X0F)
  break;//如果延時去抖后,沒有檢測到鍵按下,退出本次循環
//如果有按鍵
if(! (Keyvalue& key1))
{reset ();
display2();
UART_Init();
Cmd_Get_Img();
Cmd_Img_To_Buffer1();
}//按鍵1的處理部分
if(! (Keyvalue& key2))
{ reset ();
  display3();
UART_Init();
Cmd_Get_Img();
Cmd_Img_To_Buffer2();
}//按鍵2的處理部分
if(! (Keyvalue& key3))
{ reset ();
display4();
UART_Init();
Cmd_Reg_Model();
Store_Char_Model();
k++;         }//按鍵3的處理部分
if(! (Keyvalue& key4))
{ reset ();
display5();
UART_Init();
Cmd_Get_Img();
Cmd_Img_To_Buffer1();
search_Char_Mode();
          }//按鍵4的處理部分
       }
_delay_ms(20);
     }
}
void check_busy (void)                  //讀取忙碌狀態
{
  DDRA=0;
  PORTA=0xff;
  PORTB&=0xfb;                          //RS=0
  PORTB|=0x02;                          //RW=1;
  PORTB|=0x01;PORTB|=0x01;              //E=1;
  while((PINA&0x80)==0x80);
  PORTB&=0xfe;
                                        //E =0;
}
void wr_com(unsigned char value)        //寫指令,寫指令時必須為RS=0;RW=0;
{check_busy();
PORTB&=0xfe;                           //E=0;
PORTB&=0xfb;                           //RS=0
PORTB&=0xfd;                           //RW=0;
DDRA=0xff;
PORTA=value;
PORTB|=0x01;                           //E=1;
_delay_us(20);                          //如果沒有延時就必須要加查忙指令
PORTB&=0xfe;
DDRA=0x00;                            //E=0;
}
void wr_data(unsigned char sj)          //寫數據,寫數據時必須為 RS=1;RW=0;
{check_busy();
PORTB&=0xfe;                           //E=0;
PORTB|=0x04;                           //RS=1;
PORTB&=0xfd;                           //RW=0;
DDRA=0xff;
PORTA=sj;
PORTB|=0x01;                           //E=1;
_delay_us(20);                          //如果沒有延時就必須要加查忙指令
PORTB&=0xfe;
DDRA=0x00;                            ////E=0;
}
void reset (void)
{
wr_com(0x01);//清屏
wr_com(0x08);//關顯示
wr_com(0x03);//歸位
wr_com(0x30);//功能設置
wr_com(0x0f);//開顯示
wr_com(0x01);//清屏
}
//******************************************************************/
//outChinese 為函數名
//place 為顯示地址的首地址
//unit  字符長度
//charcode[]  要顯示數據的內容
void outChinese(unsigned char place,unsigned char unit,unsigned char charcode[] )
{
unsigned char i;
wr_com(place);
for(i=0;i<unit*2;i++)//一個漢字為兩個字符
wr_data(charcode);
}
void display1(void)
{wr_com(yb);
//ydgb();
outChinese(0x80,8,name00);//第一行:80-87H
outChinese(0x90,8,name01);//第二行:90-97H
outChinese(0x88,8,name02);//第三行:88-8FH
outChinese(0x98,8,name03);//第四行:98-9FH
}
void display2(void)
{wr_com(yb);
outChinese(0x80,8,name00);//第一行:80-87H
outChinese(0x90,8,name04);//第二行:90-97H
outChinese(0x88,8,name07);//第三行:88-8FH
outChinese(0x98,8,name03);//第四行:98-9FH
}
void display3(void)
{wr_com(yb);
outChinese(0x80,8,name00);//第一行:80-87H
outChinese(0x90,8,name04);//第二行:90-97H
outChinese(0x88,8,name08);//第三行:88-8FH
outChinese(0x98,8,name03);//第四行:98-9FH
}
void display4(void)
{wr_com(yb);
outChinese(0x80,8,name00);//第一行:80-87H
outChinese(0x90,8,name01);//第二行:90-97H
outChinese(0x88,8,name06);//第三行:88-8FH
outChinese(0x98,8,name03);//第四行:98-9FH
}
void display5(void)
{wr_com(yb);
outChinese(0x80,8,name00);//第一行:80-87H
outChinese(0x90,8,name01);//第二行:90-97H
outChinese(0x88,8,name05);//第三行:88-8FH
outChinese(0x98,8,name03);//第四行:98-9FH
}
void display6(void)
{wr_com(yb);
outChinese(0x80,8,name00);//第一行:80-87H
outChinese(0x90,8,name09);//第二行:90-97H
outChinese(0x88,8,name00);//第三行:88-8FH
outChinese(0x98,8,name03);//第四行:98-9FH
}
void display7(void)
{wr_com(yb);
outChinese(0x80,8,name00);//第一行:80-87H
outChinese(0x90,8,name12);//第二行:90-97H
outChinese(0x88,8,name00);//第三行:88-8FH
outChinese(0x98,8,name03);//第四行:98-9FH
}
void display8(void)
{wr_com(yb);
outChinese(0x80,8,name00);//第一行:80-87H
outChinese(0x90,8,name13);//第二行:90-97H
outChinese(0x88,8,name00);//第三行:88-8FH
outChinese(0x98,8,name03);//第四行:98-9FH
}
void display9(void)
{wr_com(yb);
outChinese(0x80,8,name00);//第一行:80-87H
outChinese(0x90,8,name14);//第二行:90-97H
outChinese(0x88,8,name00);//第三行:88-8FH
outChinese(0x98,8,name03);//第四行:98-9FH
}
void display10(void)
{wr_com(yb);
outChinese(0x80,8,name00);//第一行:80-87H
outChinese(0x90,8,name15);//第二行:90-97H
outChinese(0x88,8,name00);//第三行:88-8FH
outChinese(0x98,8,name03);//第四行:98-9FH
}
void display11(void)
{wr_com(yb);
outChinese(0x80,8,name00);//第一行:80-87H
outChinese(0x90,8,name16);//第二行:90-97H
outChinese(0x88,8,name00);//第三行:88-8FH
outChinese(0x98,8,name03);//第四行:98-9FH
}
void display12(void)
{wr_com(yb);
outChinese(0x80,8,name00);//第一行:80-87H
outChinese(0x90,8,name17);//第二行:90-97H
outChinese(0x88,8,name18);//第三行:88-8FH
outChinese(0x98,8,name03);//第四行:98-9FH
}
void display13(void)
{wr_com(yb);
outChinese(0x80,8,name00);//第一行:80-87H
outChinese(0x90,8,name19);//第二行:90-97H
outChinese(0x88,8,name00);//第三行:88-8FH
outChinese(0x98,8,name03);//第四行:98-9FH
}
void display14(void)
{wr_com(yb);
outChinese(0x80,8,name00);//第一行:80-87H
outChinese(0x90,8,name20);//第二行:90-97H
outChinese(0x88,8,name00);//第三行:88-8FH
outChinese(0x98,8,name03);//第四行:98-9FH
}
void display15(void)
{wr_com(yb);
outChinese(0x80,8,name00);//第一行:80-87H
outChinese(0x90,8,name21);//第二行:90-97H
outChinese(0x88,8,name23);//第三行:88-8FH
outChinese(0x98,8,name03);//第四行:98-9FH
}
void display16(void)
{wr_com(yb);
outChinese(0x80,8,name00);//第一行:80-87H
outChinese(0x90,8,name22);//第二行:90-97H
outChinese(0x88,8,name24);//第三行:88-8FH
outChinese(0x98,8,name03);//第四行:98-9FH
}
int main()
{
DDRB=0xff;                   //控制字
PORTB=0xff;
DDRA=0xff;                   //數據
PORTA=0xff;
PORTB|=0x08;                 //PSB=1
PORTB&=0xef;                 //PSB=1
_delay_us(20);
PORTB|=0x10;                 //PSB=1
reset ();
display1();
while(1)
{ keyboard();}
}





























硬件整體電路圖
   
畢業設計是我大學本科學習的過程向學校、社會交出的一張總結答卷。它不僅是我對大學五年所學知識的總結,也是把所學知識融會貫通運用到實踐中的一次嘗試,是衡量我五年學習成果的一個必要標準。
通過此次的畢業設計,不僅使我深刻的鞏固以往的所學習本專業的知識,也實際熟練了本專業的技能操作。這讓我能夠深刻的體會到基礎的理論知識與實際實現還是存在的差異,實際應用中還要考慮各個方面的因素,這給我以后的學習和工作奠定了堅實的基礎。
在此我要感謝我的指導教師張根柱老師。從畢業設計的準備到結束,他在畢業設計過程中給予了我多方面的支持和幫助。還要感謝和我一起完成畢業設計的同學們,在這次設計中我們緊密合作、互相協商,不僅鍛煉了我們的溝通能力,而且培養了我們的團隊精神。
最后還要感謝我生活以及學習了五年的學院,在這次畢業設計中提供給我們良好的環境以及便利的條件,讓我們全心投入到這次畢業設計中。
再次感謝所有幫助過我的人們!并祝愿我們學院越來越美好!




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产激情一区二区三区 | 一区在线视频 | 99re在线视频 | 午夜影视网 | 精品成人佐山爱一区二区 | 国产精品123区 | 色视频网站免费 | 欧美亚洲国产日韩 | 成人精品鲁一区一区二区 | 午夜精品一区二区三区在线 | 国产成在线观看免费视频 | 精品网| 色999视频| 在线观看国产视频 | 一级欧美 | 婷婷一级片 | 福利片在线观看 | 精品欧美一区二区三区久久久 | 国产资源一区二区三区 | 国产在线不卡 | a黄毛片 | 三级视频在线观看 | 国产精品久久久 | 国产精品视频偷伦精品视频 | 国产三级 | 国产99久久精品 | 日韩淫片免费看 | 国产一区91精品张津瑜 | 中文字幕在线观看一区二区 | 黄色一级电影在线观看 | 手机av在线 | 国产精品一区二区三区四区 | 婷婷久久精品一区二区 | 成人在线视频免费观看 | 欧美精选一区二区 | 欧美中文字幕一区 | 精品国产一区二区三区免费 | 日韩欧美三区 | www.亚洲精品 | 国产精品久久久久久久久免费相片 | 欧美精品一区二区三 |