找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 6135|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)新型安全保險(xiǎn)柜鎖設(shè)計(jì)資料

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主

目前,人們對(duì)個(gè)人財(cái)產(chǎn)安全的要求越來越高,一種新型的較為安全的鎖具隨之產(chǎn)生,該類鎖具利用生物的指紋識(shí)別技術(shù)進(jìn)行解鎖。本次設(shè)計(jì)就是通過指紋識(shí)別技術(shù)為核心的電路設(shè)計(jì)。


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

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



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

為什么會(huì)出現(xiàn)這樣的問題,指紋電子密碼鎖與傳統(tǒng)的鎖具相比有下列的優(yōu)點(diǎn)與缺點(diǎn):

第一,在鎖具的設(shè)計(jì)方面上,傳統(tǒng)的鎖具設(shè)計(jì)單一,開鎖的方式是通過鐵質(zhì)的鑰匙,插入鎖孔來轉(zhuǎn)動(dòng)。

第二,對(duì)于鑰匙管理方面,傳統(tǒng)鎖具的鑰匙經(jīng)常被不法分子利用,他們通過跟蹤鑰匙的主人,然后偷竊他們的鑰匙,對(duì)鑰匙進(jìn)行復(fù)制,最后入侵他們的家里進(jìn)行偷竊。

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

第四,指紋密碼鎖相對(duì)于傳統(tǒng)的鎖具而言,其最大的優(yōu)勢(shì)在于能夠利用個(gè)人的獨(dú)一無二的指紋信息和其對(duì)應(yīng)的數(shù)字密碼進(jìn)行解鎖。能夠做到雙重保險(xiǎn),讓偷竊者無從下手。

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

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

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

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

   1.3指紋識(shí)別技術(shù)的介紹

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

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

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

本次設(shè)計(jì)主要是利用了單片機(jī)對(duì)指紋模塊、按鍵模塊、顯示模塊、電機(jī)開鎖模塊進(jìn)行控制的作品設(shè)計(jì)。是將我們學(xué)習(xí)過的單片機(jī)進(jìn)行生活運(yùn)用的設(shè)計(jì),本次設(shè)計(jì)考驗(yàn)了我們學(xué)習(xí)知識(shí),應(yīng)用知識(shí)的能力。

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



第二章 系統(tǒng)的方案選擇和驗(yàn)證   2.1單片機(jī)的選擇

我們?cè)趯W(xué)習(xí)過程中所遇到的單片機(jī)有51單片機(jī)、52單片機(jī)、ATmag16單片機(jī)、AVR單片機(jī),在這些單片機(jī)中,我選擇了52單片機(jī)來設(shè)計(jì)本次的設(shè)計(jì)。

原因如下:

第一,52單片機(jī)相對(duì)與51單片機(jī)來說,擁有更大的內(nèi)存,其內(nèi)部數(shù)據(jù)存儲(chǔ)器可以存儲(chǔ)256*8字節(jié),比51單片機(jī)擴(kuò)大了一倍。還增加了兩個(gè)中斷源,為程序的中斷控制提供了更多的選擇;能更好的兼容51單片機(jī)。

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

第三,52單片機(jī)與ATmag16單片機(jī)和51單片機(jī)獨(dú)特的地方就是有2個(gè)串行中斷接口,可以利用UART通道進(jìn)行編程。

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

圖2.1  52單片機(jī)引腳圖



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

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

   2.2指紋模塊的選擇與論證

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

我在網(wǎng)上幾家店進(jìn)行了對(duì)比,最終選擇了購(gòu)買PS1802指紋模塊,該模塊的組成圖片如下:

圖2-2   PS1802集成模塊實(shí)物圖


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

   2.3顯示模塊的選擇與論證

在平時(shí)的課程設(shè)計(jì)中,我接觸了一些顯示模塊,如VGS12864E、ICL7106、LCD1602、LCD12864。這些顯示模塊各有各的優(yōu)點(diǎn),根據(jù)本次設(shè)計(jì)的需要我選擇了LCD12864顯示模塊。該模塊鎖具有的優(yōu)勢(shì)如下:

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

第二,ICL7106與LCD12864相比,因?yàn)槠鋬?nèi)部有3個(gè)1/2位A/D轉(zhuǎn)換器,因此,能夠直接驅(qū)動(dòng)LED數(shù)碼管。然而,在本次的設(shè)計(jì)中,顯示模塊只是應(yīng)用于屏幕的漢字顯示,方便對(duì)用戶的操作進(jìn)行提示,沒有用到LED數(shù)碼管,因此,沒有選擇ICL7106顯示模塊。

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

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

   2.4 數(shù)字按鍵部分介紹

在作品的設(shè)計(jì)中,當(dāng)輸入的指紋正確時(shí)還需要通過數(shù)字密碼來解鎖,因此就需要一個(gè)數(shù)字按鍵模塊。在單片機(jī)的學(xué)習(xí)中,我們學(xué)習(xí)矩陣鍵盤的應(yīng)用,為本次設(shè)計(jì)提供了靈感。本次設(shè)計(jì)采用了4*4個(gè)數(shù)的矩陣鍵盤,有0到9的數(shù)字按鍵和錄入鍵、刪除鍵、關(guān)門鍵、確定鍵幾部分組成。通過設(shè)置行線與列線的端口接入點(diǎn),來定義數(shù)字按鍵的行線與列線,經(jīng)過編寫程序?qū)π小⒘芯進(jìn)行電平高低的設(shè)置,通過高低電平的變化來確定按下的按鍵,最后在LCD12864液晶顯示屏上顯示后變成*號(hào),以保護(hù)用戶的密碼不被泄露。

   2.5報(bào)警部分芯片的選擇

當(dāng)用戶輸入的信息不正確時(shí),輸入指紋出錯(cuò)超過三次的情況下或者輸入數(shù)字密碼的次數(shù)也超過三次時(shí),系統(tǒng)便會(huì)發(fā)出警報(bào)聲,以提示用戶輸入的信息不正確。同時(shí)也警示不法分子,你不是合法用戶,沒有開門的權(quán)利。警報(bào)電路由2N3906三極管、電阻和蜂鳴器構(gòu)成,三極管2N3906是該電路主要芯片。三極管2N3906是分離式半導(dǎo)體類三級(jí)管,屬于PNP型,低電平導(dǎo)通,正好與蜂鳴器的電壓導(dǎo)通性質(zhì)一樣,當(dāng)?shù)碗娖酵ㄟ^時(shí),電路開始導(dǎo)通,驅(qū)動(dòng)蜂鳴器發(fā)出響聲。本次設(shè)計(jì)的報(bào)警電路如下所示:

圖2.3警報(bào)電路設(shè)計(jì)圖

   2.6存儲(chǔ)電路模塊的介紹

存儲(chǔ)模塊主要應(yīng)用E平方PROM通信協(xié)議進(jìn)行存儲(chǔ)的操作,在儀器儀表及工業(yè)自動(dòng)化控制中得到大量的應(yīng)用。現(xiàn)在市場(chǎng)上有多種多樣的存儲(chǔ)芯片,經(jīng)過方案對(duì)比發(fā)現(xiàn)24C02芯片是最符合本設(shè)計(jì)的設(shè)計(jì)思路,其引腳圖如下圖2-4所示:

圖2-4  24C02引腳圖

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



第三章 各模塊電路的介紹

設(shè)計(jì)中一共有七個(gè)電路模塊,它們分別是52單片機(jī)模塊、數(shù)字按鍵模塊、指紋識(shí)別模塊、LCD12864液晶顯示模塊、存儲(chǔ)模塊、電機(jī)模擬開鎖模塊和總體電源模塊。我們?cè)诒菊轮袑?duì)以上內(nèi)容進(jìn)行詳細(xì)介紹。

  3.1數(shù)字按鍵模塊電路的介紹

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

圖 3.1數(shù)字按鍵模塊電路

   3.2 指紋識(shí)別模塊電路的介紹

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

圖3.2指紋模塊電路圖

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

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

指紋模塊在識(shí)別模式下的工作過程:

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

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

圖3.3  LCD12864顯示模塊電路


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

   3.4存儲(chǔ)模塊電路的介紹

經(jīng)過比較發(fā)現(xiàn)24C02芯片最符合本設(shè)計(jì)的設(shè)計(jì)思路,因?yàn)?4C02有256字節(jié),能存儲(chǔ)40組數(shù)字密碼,當(dāng)系統(tǒng)因?yàn)橐恍┎豢深A(yù)計(jì)的原因?qū)е聰嚯姡鎯?chǔ)模塊電路能把掉電前的數(shù)據(jù)保存下來,等到下次上電的時(shí)候,能繼續(xù)工作。芯片的工作電壓為1.8V到5.5V,串行接口,兼容I2C總線;能對(duì)硬件進(jìn)行寫保護(hù),具有高度的可靠性,擦寫壽命達(dá)到100萬次,是現(xiàn)代智能儀表的首選芯片之一。

存儲(chǔ)模塊電路圖如下:

圖 3.4 存儲(chǔ)模塊電路圖
   3.5電機(jī)模擬開鎖模塊電路的介紹

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

圖 3.5電機(jī)模擬開鎖電路圖

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


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

電路的正常運(yùn)轉(zhuǎn)需要電源,因此,本設(shè)計(jì)還需要一個(gè)穩(wěn)定的,實(shí)用的電源模塊對(duì)整個(gè)設(shè)計(jì)提供電源。因?yàn)楦麟娐沸枰碾妷翰煌,所以設(shè)置正負(fù)5V、正負(fù)12V、正負(fù)15V的電壓源。下圖3.6是總體電源電路:

圖3.6 總體電源模塊電路圖

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


第四章  系統(tǒng)的軟件調(diào)試
4.1開鎖電路調(diào)試及流程圖設(shè)計(jì)

以上介紹了設(shè)計(jì)的硬件電路部分,現(xiàn)在開始介紹設(shè)計(jì)中的軟件設(shè)計(jì)與調(diào)試過程,程序設(shè)計(jì)中,用了C語(yǔ)言來進(jìn)行編程,C語(yǔ)言是我們之前開設(shè)的一門課程之一,我們能夠運(yùn)用C語(yǔ)言來編寫程序,能夠比較熟練地應(yīng)用C語(yǔ)言去解決課程所要完成的課程設(shè)計(jì)要求。設(shè)計(jì)中本著程序語(yǔ)言簡(jiǎn)潔、能實(shí)現(xiàn)功能為前提,盡可能的使用一些我們所學(xué)過的知識(shí)去編寫,以達(dá)到學(xué)以致用的效果。接下來,可以通過下面的流程圖來展示。


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

4.2 設(shè)計(jì)中的特殊開鎖方式

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

第五章 作品總結(jié)
5.1作品設(shè)計(jì)過程

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

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





附錄一

系統(tǒng)整體電路圖:



附錄二
主程序:

  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;//錄入模式指示燈 在板子靠近單片機(jī)處
  12. sbit green= P3^6;//識(shí)別模式指示燈 在板子遠(yuǎn)離單片機(jī)處
  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. //默認(rèn)為識(shí)別模式
  22. //如果為1為錄入指紋模式,每錄入一次SaveNumber++
  23. unsigned char                             FifoNumber=0;
  24. unsigned char idata  FIFO[MAX_NUMBER+1]={0};

  25. void TxdByte(unsigned char dat)//串口發(fā)送信息,通過查詢方式發(fā)送一個(gè)字符
  26. {
  27.     TI = 0;                            //讓TI=0
  28.     SBUF = dat;              //讀入數(shù)據(jù)
  29.     while(!TI);              //等待發(fā)送完畢
  30.     TI = 0;                            //清零
  31. }
  32. uchar Command(unsigned char *p,unsigned char MaxTime) //命令解析,給模塊發(fā)送一個(gè)命令 *p 數(shù)組 MaxTime*17ms 循環(huán)時(shí)間
  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);//數(shù)據(jù)包包頭識(shí)別碼
  37.                  TxdByte(0x01);//數(shù)據(jù)包包頭識(shí)別碼
  38.                 i=*p;//數(shù)組的第"0"個(gè)元素、里面存放了本數(shù)組的長(zhǎng)度,把這個(gè)長(zhǎng)度給變量i,方便進(jìn)行操作
  39.                 p++;
  40.               p++;
  41.                 for (count=i-1; count!=1;count--)  //Sent command String
  42.                 {
  43.                             temp=*p++;//取第個(gè)"1"個(gè)元素的內(nèi)容,然后發(fā)送
  44.                   TxdByte(temp);//將數(shù)據(jù)發(fā)送出去
  45.               }               
  46.               //以上完成了對(duì)數(shù)組的全部發(fā)送
  47.                 result=TURE;//發(fā)送完成,結(jié)果為真 (真為1)               
  48.                 FifoNumber=0;
  49.                 for (count=MAX_NUMBER+1; count!=0; count--)//清空所有FIFO[]數(shù)組里面的內(nèi)容,寫入0X00
  50.               {
  51.                 FIFO[count-1]=0x00;                                             
  52.               }              //用于存貯所有接收到的數(shù)據(jù)
  53.                 if (result)   //如果result=TURE成立
  54.                  {                           
  55.                    result=FALSE;  //result清零
  56.                     start =FALSE;
  57.                                stop  =FALSE;
  58.                      count=0;
  59.                      clk0=0;              //清零CL0計(jì)數(shù)
  60.                            
  61. /////////////////////////do的內(nèi)容////////////////////////////////
  62.                             {            
  63.                                           restart0:                                                      
  64.                                      if (RI==1)//如果接收到數(shù)據(jù)
  65.                                                 {                                                        
  66.                                                                         tmpdat=SBUF;//先把接收到的數(shù)據(jù)放到tmpdat中
  67.                                         RI=0;
  68.                                         if ((tmpdat==0xef)&&(start==FALSE))//這個(gè)數(shù)據(jù)為第一個(gè)傳回來的數(shù)據(jù),也就是"指令應(yīng)答"的第一個(gè)字節(jié)
  69.                                                       {              
  70.                                                                                                   count=0;
  71.                             FIFO[0]=tmpdat;//讀入第一個(gè)應(yīng)答字節(jié)(0XEF),存在第"0"個(gè)元素中   
  72.                                                                                                   flag=1;                          
  73.                                                                                                   goto
  74.                                                                                                                 restart0;//可以用中斷方式進(jìn)行                                         
  75.                                                        }
  76.                                                                       if(flag==1)//第一個(gè)字節(jié)已經(jīng)回來,所以flag==1成立
  77.                                                                      
  78. ///////////////////////do的內(nèi)容結(jié)束//////////////////////////////               
  79.               while ((clk0<=MaxTime)&&(count<=MAX_NUMBER) && ( changeflag == 0 ));
  80.                             //由定時(shí)器以及最大接收數(shù)據(jù)來控制,保證不會(huì)在此一直循環(huán)                             
  81.         FifoNumber=count;              //保存接收到的數(shù)據(jù)個(gè)數(shù)
  82.               }
  83.    return (result);
  84. }
  85. bit VefPSW(void)//驗(yàn)證設(shè)備握手口令,成功返回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)//如果不成功,再驗(yàn)證一次,如果兩次不成功,返回失敗
  96.                   {
  97.                       return(0);  
  98.                             }
  99.               }
  100. }
  101. void Clear_All(void) //清空指紋庫(kù)  
  102. {                                                      
  103.       delay1ms(200);
  104.                 Command(DELE_all,50); //清空指紋庫(kù)                             
  105. }
  106. unsigned char ImgProcess(unsigned char BUFID)  //發(fā)獲取圖像并生成特征文件,存入BUFID中//輸入?yún)?shù)為緩沖區(qū)號(hào)
  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個(gè)指紋,如果返回255,表示這個(gè)指紋識(shí)別失敗
  121.                                           }   
  122.                      }
  123.                             i++;            
  124.     }
  125.    return 0;
  126. }

  127. bit savefingure(unsigned char ID)//保存指紋
  128. {
  129.               unsigned char i=0;
  130.               //現(xiàn)在開始進(jìn)行存儲(chǔ)指紋模板的操作
  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;              //校驗(yàn)和
  137.      if (Command(FIFO,70)==1)//不成功返回0              //此處進(jìn)行存放指紋模板的命
  138.               {
  139.                  return(1);
  140.               }

  141.               return (0) ; //不成功返回0
  142. }
  143. unsigned char enroll(void) //采集兩次指紋,生成1個(gè) 指紋模板
  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函數(shù)----返回0
  160.                                                                       return(0);
  161.             }
  162.         }
  163.                  }
  164.                  count=0;
  165.     buzzer=0;
  166.               delay1ms(100);
  167.               buzzer=1;
  168.               delay1ms(2000);//延時(shí)2S開始采集下一個(gè)特征
  169.               //開始采集第二個(gè)特征
  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//特征文件合并生成模板,結(jié)果存于ModelBuffer
  180.                                           {
  181.                                                         buzzer=0;
  182.                            delay1ms(100);
  183.                            buzzer=1;
  184.                                                         delay1ms(100);
  185.                                                         buzzer=0;
  186.                            delay1ms(100);              //響兩聲,表示生成一個(gè)模板成功
  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);              //識(shí)別模式
  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;     //定時(shí)器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波特率設(shè)置:9600
  228.     TR1=1;
  229.     TR0=1;// 開定時(shí)器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次,如果沒有一次成功,表示模塊通信不正常。只要成功就跳出此循環(huán)
  239.               {
  240.                             if(VefPSW())//與模塊握手通過,綠燈亮起。進(jìn)入識(shí)別模式
  241.                               {
  242.               display(3); //握手成功
  243.                                             red=0;
  244.                                             buzzer=0;
  245.                                             delay_1ms(1000);
  246.                                             buzzer=1;
  247.                                             delay_1ms(1000);              //顯示3秒握手狀態(tài)
  248.                         modecheck();              //顯示當(dāng)前是什么狀態(tài)
  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;//錄入一個(gè)指紋                                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;  //確認(rèn)摁鍵
  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為密碼錯(cuò)誤次數(shù),ii為密碼個(gè)數(shù)
  363.               initdisplay();                //顯示初始化
  364.               init_sys();              //開啟定時(shí)和中斷
  365.               woshou();              //握手狀態(tài)
  366.               init_24C02();//24C02初始化
  367.                
  368.     while(1)
  369.               {
  370.                             if( modeflag==0 )//識(shí)別模式
  371.                             {
  372.                               searchnum=search();  //識(shí)別指紋號(hào)
  373.                               if(searchnum>=1 && searchnum <= 162 )
  374.                               {            
  375.                                display(7); //識(shí)別成功                             
  376.                                             numshow(searchnum);//顯示搜索到的指紋號(hào)
  377.                                           buzzer=0;
  378.                                           delay1ms(100);
  379.                                           buzzer=1;//蜂鳴器響
  380.                                           //read_num(5); //指紋識(shí)別成功
  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;            //電機(jī)轉(zhuǎn)動(dòng)
  407.                                                                                        cc=0;
  408.                                                                                        red=0;
  409.                                                                                        //relay=0;
  410.                                                                                        delay1ms(2000);
  411.                                                                                        delay1ms(2000);
  412.                                                                                        delay1ms(1000);
  413.                                                                                        //relay=1;
  414.                                                                                        red=1;                          //關(guān)燈
  415.                                                                                         buzzer=0;           //蜂鳴器響起
  416.                                                                                                   delay1ms(10000);
  417.                                                                                                   buzzer=1;                                           //蜂鳴器關(guān)閉
  418.                                                                                                   dianji=1;                                             //電機(jī)關(guān)閉                                
  419.                          }
  420.                                                         else
  421.                                                             {
  422.                                                               write_12864com(0x98+3); //調(diào)用12864寫命令
  423.                                                                         for(ii=0;ii<6;ii++)                //清6個(gè)密碼
  424.                                                                         {
  425.                                                                         write_12864dat(' ');              //調(diào)用12864寫數(shù)據(jù)
  426.                                                                         delay1ms(1);
  427.                                                                         passwd[ii]=0;                 //              清零密碼
  428.                                                                         }
  429.                                                               cc++;
  430.                                                                          if(cc>=3)                            //密碼輸入錯(cuò)誤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;       //密碼錯(cuò)誤
  443.                                                             }
  444.                                                         }
  445.                                           }            
  446.                               }            
  447.                               if(searchnum==255)//指紋識(shí)別失敗
  448.                               {
  449.                                  //蜂鳴器響三聲
  450.                                           //read_num(6); //指紋識(shí)別失敗
  451.                                           display(8);//指紋識(shí)別失敗
  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)              // 等待摁下錄入一個(gè)指紋鍵
  467.                        {
  468.                                                                       display(12);//輸入密碼
  469.                                                                       key_sm();//
  470.                                                                       if(bb==1)//輸完6位且已經(jīng)摁下確認(rèn)鍵
  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]))//核對(duì)的是最高權(quán)限密碼passwd3密,清除指紋庫(kù)和密碼                                                                                                   
  472.                                                                                         {                                                                                                               
  473.                                                                                                                     Clear_All();//清除指紋庫(kù)
  474.                    write_add(0x00,0x00);//把24c02里面的指紋號(hào)也清零
  475.                                                                                                                 display(17);//清空指紋庫(kù)
  476.                                                                                                                delay1ms(5000);
  477.                                                                                                                display(16);       //"        號(hào)"            
  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]))//核對(duì)的是最高權(quán)限密碼passwd2密碼                                                                                      
  485.                             {  SaveNumber=read_add(0x00);  //把上一次的指紋號(hào)讀出來
  486.                                                                                                      display(10);//請(qǐng)錄入指紋,在第三行顯示
  487.                                                         if(savefingure(SaveNumber+1)==1)                                  if( SaveNumber<162 )//模塊握手成功
  488.                                                                                                                 {
  489.                                                         if(enroll()==1)//              采集兩次生成一個(gè)指紋模板
  490.                                                                                                                              {
  491.                                           SaveNumber=read_add(0x00);  //把上一次的指紋號(hào)讀出來,
  492.                                                         if(savefingure(SaveNumber+1)==1)//保存也成功
  493.                                                                                     //if(flag_1                                                                           {                           
  494.                                                         display(14);//錄入成功
  495.                                                         SaveNumber=read_add(0x00);  //把上一次的指紋號(hào)讀出來,
  496.                                                         SaveNumber++;//指紋個(gè)數(shù)加1                                                                                                              
  497.                                                         zhiwen++;              //指紋個(gè)數(shù)加1
  498.                                                         delay1ms(1000);
  499.                                                         numshow(SaveNumber);//顯示錄入指紋號(hào)
  500.                                                         write_add(0x00,SaveNumber);
  501.                                                         bb=0;
  502.                                              display(9);//請(qǐng)?jiān)O(shè)置密碼,在第三
  503.                                                         delay1ms(1000);
  504.                                                         display( 15);//請(qǐng)輸入密碼,在第三行顯示
  505.                                                         while(bb==0)//等待密碼再次輸入完,摁下確認(rèn)鍵
  506.                                                         key_sm();                //輸入密碼
  507.                                                         for(ii=0;ii<6;ii++)
  508.                                                         {                                                                                         write_add((SaveNumber-1)*6+1+ii,passwd[ii]);//把數(shù)據(jù)密碼存到24c02里面去
  509.                                                         delay1ms(10);
  510.                                                         passwd[ii]=0;                            //密碼保存成功                                                                                                   }
  511.                                              display(13);                            //密碼設(shè)置成功
  512.                                              delay1ms(3000);
  513.                                                         display(15);        //
  514.                                                         display(16);       //"        號(hào)"
  515.                                                         aa=1;
  516.                                                         bb=0;
  517.                                                         flag_1=0;
  518.                                                                                                                }                                                                                                
  519.                                                                                     }
  520.                                                                                                   else
  521. {
  522.              display(6);//錄入失敗
  523.              delay1ms(1000);
  524.              display(11);//請(qǐng)復(fù)位
  525.              aa=1;
  526.              bb=0;
  527.          }
  528.     }
  529.         else
  530. {
  531.                                                         display(6);//錄入失敗
  532.              delay1ms(1000);
  533.              display(11);//請(qǐng)復(fù)位
  534.              aa=1;
  535.              bb=0;

  536.               }
  537.                  }
  538.                     }
  539.                        }
  540.                          }
  541.                             }
  542.                                }
  543.               ////////////////////////////中斷////////////////////////////////
  544. void  Timer0(void) interrupt 1//定時(shí)器
  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.                            
復(fù)制代碼

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

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表