版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 課 程 設(shè) 計(jì)</p><p> 課 程 名 稱: 單 片 機(jī) 原 理 與 應(yīng) 用 </p><p> 課 題 名 稱: 數(shù) 字 密 碼 鎖 設(shè) 計(jì) </p><p> 所在 學(xué)院 名稱: 湖南大學(xué)電氣與信息工程學(xué)院 </p><p><b> 目錄</b&g
2、t;</p><p> 一、 前言- 2 -</p><p> 二、 總體方案設(shè)計(jì)- 3 -</p><p> 2.1方案論證與比較- 3 -</p><p> 2.2方案選擇- 4 -</p><p> 三、 單元模塊設(shè)計(jì)- 4 -</p><p> 3.1硬件支持-
3、4 -</p><p> 3.2功能單元模塊設(shè)計(jì)- 4 -</p><p> 3.2.1 開(kāi)鎖機(jī)構(gòu)- 4 -</p><p> 3.2.2 矩陣鍵盤(pán)設(shè)計(jì)電路- 5 -</p><p> 3.2.3 聲音提示電路設(shè)計(jì)- 5 -</p><p> 3.2.4 顯示模塊設(shè)計(jì)- 6 -</p>
4、<p> 四、程序設(shè)計(jì)與系統(tǒng)仿真- 7 -</p><p> 4.1 模塊介紹- 7 -</p><p> 4.1.1 主程序模塊- 9 -</p><p> 4.1.2 密碼比較判斷模塊- 9 -</p><p> 4.1.3 鍵盤(pán)掃描模塊- 9 -</p><p> 4.1.4 修
5、改密碼模塊- 10 -</p><p> 五、系統(tǒng)功能- 12 -</p><p> 六.設(shè)計(jì)總結(jié)- 12 -</p><p> 七、附錄:源程序- 12 -</p><p><b> 一、 前言</b></p><p> 隨著社會(huì)物質(zhì)財(cái)富的日益增長(zhǎng)和人們生活水平的提高,安全成為
6、現(xiàn)代居民最關(guān)心的問(wèn)題之一。而鎖自古以來(lái)就是把守門(mén)的鐵將軍,人們對(duì)它要求甚高,即要求可靠地防盜,又要使用方便。傳統(tǒng)的門(mén)鎖既要備有大量的鑰匙,又要擔(dān)心鑰匙丟失后的麻煩。隨著單片機(jī)的問(wèn)世,出現(xiàn)了數(shù)字密碼鎖,其保密性高,使用靈活性好,安全系數(shù)高,故受到廣大用戶的青睞。</p><p> 數(shù)字密碼鎖通常使用ARM和單片機(jī)控制,單片機(jī)相對(duì)ARM實(shí)現(xiàn)較為簡(jiǎn)單,功能較為完善,因此使用單片機(jī)控制較多。用單片機(jī)控制的密碼鎖常使用匯
7、編語(yǔ)言編寫(xiě)程序,數(shù)碼管做顯示器 。但本設(shè)計(jì)使用移植性及可讀性強(qiáng)的C語(yǔ)言編寫(xiě);同時(shí)采用顯示清楚、功率消耗小而且壽命長(zhǎng)的1602A液晶顯示器。從經(jīng)濟(jì)實(shí)用的角度出發(fā),采用ADUC848單片機(jī)設(shè)計(jì)出一種具有密碼設(shè)置、報(bào)警等功能的數(shù)字密碼鎖,并通過(guò)Proteus軟件成功地進(jìn)行了仿真。</p><p><b> 任務(wù)及設(shè)計(jì)要求</b></p><p> 1.設(shè)計(jì)一多位電子密碼
8、鎖,輸入密碼用“F”表示,輸入密碼正確,綠燈亮(或顯示其它標(biāo)志、蜂鳴器替代),輸入密碼錯(cuò)誤,紅燈亮(或顯示其它標(biāo)志、蜂鳴器替代).</p><p> 2.具有確定鍵和取消鍵,在未確定之前可以取消,重新輸入.</p><p> 3.連續(xù)輸入三次錯(cuò)誤密碼,紅燈閃爍,報(bào)警電路動(dòng)作,鍵盤(pán)鎖定.</p><p> 4.具有密碼重置、修改功能.</p>&l
9、t;p> 5.具有密碼輸入等待操作時(shí)間限制功能,超過(guò)限定時(shí)間報(bào)警.</p><p> 6.顯示北京時(shí)間,時(shí)間可調(diào)整.</p><p> 7.可利用蜂鳴器添加提示音.</p><p><b> 二、 總體方案設(shè)計(jì)</b></p><p> 2.1方案論證與比較</p><p> 方
10、案一:以ADUC848單片機(jī)為數(shù)字密碼鎖系統(tǒng)核心,使用4*4矩陣鍵盤(pán)作為數(shù)據(jù)輸入方式,驅(qū)動(dòng)1602A顯示器提示程序運(yùn)行過(guò)程和開(kāi)鎖的步驟,利用AT24C02芯片實(shí)現(xiàn)掉電存儲(chǔ)。圖1為單片機(jī)控制密碼鎖的系統(tǒng)原理框圖。</p><p> 圖1 單片機(jī)控制密碼鎖的系統(tǒng)原理框圖</p><p> 方案二:以74LS112雙JK觸發(fā)器構(gòu)成的數(shù)字邏輯電路控制方案,如圖2。</p>&l
11、t;p> 圖2 數(shù)字邏輯控制方案數(shù)字密碼鎖原理框圖</p><p><b> 2.2方案選擇</b></p><p> 由于利用單片機(jī)靈活的編程設(shè)計(jì)和強(qiáng)大的I/O端口,及其控制的準(zhǔn)確性,不但能實(shí)現(xiàn)基本的密碼鎖功能,還可以增添掉電存儲(chǔ)、聲光提示等功能,故選用方案一。</p><p><b> 三、 單元模塊設(shè)計(jì)</
12、b></p><p><b> 3.1硬件支持</b></p><p> 使用的元器件有:核心芯片ADUC848、存儲(chǔ)芯片AT24C02、液晶顯示1602A、4×4矩陣鍵盤(pán)、報(bào)警蜂鳴器、發(fā)光二極管和三極管。</p><p> 3.2功能單元模塊設(shè)計(jì)</p><p> 3.2.1 開(kāi)鎖機(jī)構(gòu)</
13、p><p> 通過(guò)單片機(jī)送給開(kāi)鎖執(zhí)行機(jī)構(gòu),電路驅(qū)動(dòng)電磁鎖吸合,從而達(dá)到開(kāi)鎖的目的。如圖3所示,為密碼鎖開(kāi)鎖電路原理圖。</p><p> 當(dāng)用戶輸入的密碼正確時(shí),單片機(jī)便輸出開(kāi)門(mén)信號(hào),送到開(kāi)鎖驅(qū)動(dòng)電路,然后驅(qū)動(dòng)電磁鎖,達(dá)到開(kāi)門(mén)的目的。本次設(shè)計(jì)中,基于節(jié)省成本考慮,用發(fā)光二極管代替電磁鎖,信息通過(guò)LCD顯示,并利用蜂鳴器和二極管聲光指示。其中,綠發(fā)光二極管亮,表示開(kāi)鎖;否則,表示密碼輸入錯(cuò)誤
14、并開(kāi)啟報(bào)警電路。</p><p> 圖3 密碼鎖開(kāi)鎖電路原理圖</p><p> 3.2.2 矩陣鍵盤(pán)設(shè)計(jì)電路</p><p> 每一條水平(行線)與垂直線(列線)的交叉處不相通,而是通過(guò)一個(gè)按鍵來(lái)連通,利用這種行列式矩陣結(jié)構(gòu)只需要M條行線和N條列線,即可組成具有M×N個(gè)按鍵的鍵盤(pán)。由于本設(shè)計(jì)中要求使用16個(gè)按鍵輸入,為減少鍵盤(pán)與單片機(jī)接口時(shí)所占用
15、的I/O線的數(shù)目,故使用矩陣鍵盤(pán)。本設(shè)計(jì)中,矩陣鍵盤(pán)行線和單片機(jī)P1.0-P1.3相連,列線與單片機(jī)P1.4-P1.7相連。矩陣鍵盤(pán)設(shè)計(jì)電路圖,如圖4所示。</p><p> 鍵盤(pán)掃描采用行掃描法,即依次置行線中的每一行為低電平,其余均為高電平,掃描列線電平狀態(tài),為低電平即表示該鍵按下。</p><p> 圖4 矩陣鍵盤(pán)設(shè)計(jì)電路圖</p><p> 3.2.
16、3 聲音提示電路設(shè)計(jì)</p><p> 聲音提示電路采用小蜂鳴器提示。蜂鳴器能夠根據(jù)脈沖信號(hào),以及信號(hào)的頻率發(fā)出各種不同的聲音,這樣可以根據(jù)系統(tǒng)要求在密碼出入正確和密碼輸入錯(cuò)誤時(shí)發(fā)出不同的聲音提示,已達(dá)到報(bào)警的要求。蜂鳴器電路,如圖5所示。</p><p><b> 圖5 蜂鳴器電路</b></p><p> 3.2.4 顯示模塊設(shè)計(jì)&
17、lt;/p><p> 本設(shè)計(jì)中,顯示電路采用1602A液晶顯示器顯示。如下所示,圖6為1602A液晶顯示器的接口示意圖,表1為接口說(shuō)明。</p><p> 圖6 1602A液晶顯示器的接口示意圖</p><p><b> 表1 接口說(shuō)明</b></p><p> 本設(shè)計(jì)中液晶串口一共用到11根導(dǎo)線與單片機(jī)相連,
18、具體連接情況如表2顯示模塊與MCU連接說(shuō)明所示。</p><p> 表2 顯示模塊與MCU連接說(shuō)明</p><p> 四、程序設(shè)計(jì)與系統(tǒng)仿真</p><p><b> 4.1 模塊介紹</b></p><p> 與硬件電路相關(guān)聯(lián),本系統(tǒng)軟件包括主程序模塊、密碼比較判斷模塊、鍵盤(pán)掃描模塊、修改密碼模塊、1602A
19、液晶顯示模塊等。系統(tǒng)程序流程如圖9所示。</p><p> 圖9 系統(tǒng)程序流程圖</p><p> 4.1.1 主程序模塊</p><p> 主程序主要用于定義全局變量,給全局變量賦初值,初始化E2PROM,啟動(dòng)定時(shí)器以及從AT24C02中讀取密碼,為整個(gè)程序提供數(shù)據(jù);檢測(cè)按鍵;調(diào)用顯示等功能。</p><p> 4.1.2 密碼比
20、較判斷模塊</p><p> 該模塊的功能是將鍵盤(pán)輸入的密碼利用if語(yǔ)句與設(shè)定的密碼進(jìn)行逐個(gè)比較,若密碼完全正確則開(kāi)鎖;若不正確,則開(kāi)啟報(bào)警電路,復(fù)位后重新輸入密碼。其密碼輸入和比較判決流程圖如圖10所示。</p><p> 圖10 密碼輸入和比較判決流程圖</p><p> 4.1.3 鍵盤(pán)掃描模塊</p><p> 鍵盤(pán)使用矩陣
21、式鍵盤(pán),由行和列組成,CPU對(duì)所有鍵盤(pán)進(jìn)行監(jiān)視,從而實(shí)現(xiàn)逐列掃描鍵盤(pán)確定被按鍵的具體位置、判斷鍵盤(pán)上有無(wú)鍵按下、消除去抖動(dòng)、判斷閉合的鍵是否釋放等功能。如圖11所示,為鍵盤(pán)掃描流程圖。</p><p> 圖11 鍵盤(pán)掃描流程圖</p><p> 4.1.4 修改密碼模塊</p><p> 在密碼輸入正確情況下,可以按下“重置密碼”對(duì)密碼進(jìn)行重新設(shè)置,每設(shè)定一
22、位就將密碼送給AT24C02存儲(chǔ)起來(lái),當(dāng)設(shè)置6位密碼完畢后,系統(tǒng)將自動(dòng)跳到程序開(kāi)始,調(diào)用新設(shè)置的密碼。圖12為修改密碼流程圖。</p><p> 圖12 修改密碼流程圖</p><p><b> 五、系統(tǒng)功能</b></p><p> 本設(shè)計(jì)中系統(tǒng)可實(shí)現(xiàn)功能如下:</p><p> ?。?)通過(guò)切換,對(duì)輸入的1—
23、8位密碼進(jìn)行顯示或隱藏;</p><p> ?。?)通過(guò)發(fā)光二極管和蜂鳴器,對(duì)解密正確或者錯(cuò)誤進(jìn)行聲光報(bào)警;</p><p> (3)1—8位密碼修改;</p><p> (4)在密碼遺失情況下,通過(guò)初始密碼進(jìn)行密碼再設(shè)置;</p><p> ?。?)具有1-3次的解鎖次數(shù)任意設(shè)定功能;</p><p><b
24、> 六.設(shè)計(jì)總結(jié)</b></p><p> 作為一名電子信息工程的學(xué)生,通過(guò)本次課程設(shè)計(jì),我很好的了解了單片機(jī)C語(yǔ)言設(shè)計(jì)的思考模式,熟悉了C語(yǔ)言的編程規(guī)則,知道了如何去運(yùn)用一個(gè)完全陌生的單片機(jī),會(huì)根據(jù)單片機(jī)的不同結(jié)構(gòu)來(lái)采用不同的命令實(shí)現(xiàn)功能。在此次課程設(shè)計(jì)中我負(fù)責(zé)的模塊出現(xiàn)了問(wèn)題導(dǎo)致在數(shù)碼管上顯示狀態(tài)的時(shí)候混亂了,主要是因?yàn)檠訒r(shí)上沒(méi)有處理好,Aduc848的定時(shí)器處理時(shí)是要加上一定的延時(shí)來(lái)防
25、止沖突的。另外還有鍵盤(pán)的防抖模塊,一開(kāi)是沒(méi)有考慮好,所以鍵盤(pán)按下后顯示會(huì)亂變。綜上而言,通過(guò)此次課程設(shè)計(jì),我很好的學(xué)習(xí)了單片機(jī)的應(yīng)用以及其編程。</p><p><b> 七、附錄:源程序</b></p><p> #include <aduc848.h></p><p> #include<intrins.h>&
26、lt;/p><p> #define uint unsigned int</p><p> #define uchar unsigned char </p><p><b> /*狀態(tài)聲明*/</b></p><p> #define opened 0</p><p> #define ne
27、w1 15</p><p> #define new2 16</p><p> #define succed 5</p><p> #define fanin 10</p><p> #define null 11</p><p> #define error 12</p><p>
28、 #define different 13</p><p> #define tover 14</p><p><b> /*按鍵聲明*/</b></p><p> #define enter 10</p><p> #define back 11</p><p> #define tr
29、evise 12</p><p> #define revise 13</p><p> #define cancel 14</p><p> #define vain 15</p><p> #define off 16</p><p> #define end 17</p><p>
30、; #define finish 18</p><p><b> /*函數(shù)聲明*/</b></p><p> void p_base();</p><p> void p_revise();</p><p> void p_new1();</p><p> void p_new2();
31、</p><p> void p_trevise();</p><p> void p_show(); </p><p> uchar p_scan();</p><p> void p_record();</p><p> void p_delay(uint f_n);</p><p
32、> void p_state(uchar f_s);</p><p> uchar p_compare(uchar *f_k1,uchar *f_k2);</p><p> void p_copy(uchar *f_s,uchar *f_k);</p><p> /*I/O口聲明*/</p><p> sbit p00=P0^
33、0;</p><p> sbit p10=P1^0;</p><p> sbit p11=P1^1;</p><p> sbit p12=P1^2;</p><p> sbit p13=P1^3;</p><p> sbit p14=P1^4;</p><p> sbit p15=P
34、1^5;</p><p> sbit p16=P1^6;</p><p> sbit p17=P1^7;</p><p> sbit p20=P2^0;</p><p> sbit p21=P2^1;</p><p> sbit p22=P2^2;</p><p> sbit p23
35、=P2^3;</p><p> sbit p24=P2^4;</p><p> sbit p25=P2^5;</p><p> sbit p26=P2^6;</p><p> sbit p27=P2^7;</p><p> sbit p30=P3^0;</p><p> sbit p
36、31=P3^1;</p><p> sbit p32=P3^2;</p><p> sbit p33=P3^3;</p><p> sbit p34=P3^4;</p><p> sbit p35=P3^5;</p><p> sbit p36=P3^6;</p><p> sbit
37、 p37=P3^7;</p><p><b> /*變量聲明*/</b></p><p><b> uchar </b></p><p> bot,key1[9],key2[9],save[9],t[4],s,min,h,mino,mint,ho,ht,n1=1,n2=1,lock,minu,sign,tov,sta
38、te,n,sound,point=1, </p><p> showlist[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0x71,0xff,0x21,0x85,0xe1,0x7f,0x7d};</p><p><b> uint </b></p><p><b>
39、; ms;</b></p><p><b> /*主函數(shù)*/</b></p><p> void main()</p><p><b> {</b></p><p> EA=1; //開(kāi)總中斷</p><p> ET0=1; //開(kāi)內(nèi)部中斷0
40、</p><p> ET1=0;//關(guān)內(nèi)部中斷1</p><p> TMOD=0x11;</p><p> TH0=0xf9; //計(jì)數(shù)器0高八位</p><p> TL0=0xdb; //計(jì)數(shù)器0低八位</p><p> TR0=1; //計(jì)數(shù)器0開(kāi)始計(jì)數(shù)</p>&
41、lt;p> I2CCON=0xe8;</p><p><b> sound=0;</b></p><p> tov=1; //超時(shí)計(jì)數(shù)置為1</p><p> P1=0x00; //P1全置為0作為輸入</p><p> if(sign!=1)</p><p>
42、 p_new1(); //調(diào)用首次使用判斷函數(shù)</p><p> p_base();//調(diào)用基礎(chǔ)解鎖函數(shù)</p><p><b> }</b></p><p> /*基礎(chǔ)解鎖函數(shù)*/</p><p> void p_base() </p><p><b> {&
43、lt;/b></p><p> n=0; //密碼數(shù)組置首位</p><p> state=fanin; //指示管置為輸入狀態(tài)fanin</p><p> while(1) //無(wú)限循環(huán)</p><p><b> {</b></p><p><b>
44、if(n==0)</b></p><p> state=fanin;</p><p><b> else</b></p><p><b> state=n; </b></p><p> bot=p_scan();</p><p> if(n!=0&
45、;&tov==0)//判斷密碼數(shù)組是不是在首位,超時(shí)計(jì)數(shù)是否為0</p><p><b> { </b></p><p> p_state(tover);//調(diào)用指示管狀態(tài)閃爍函數(shù),置為用超時(shí)狀態(tài)tover</p><p> main(); //調(diào)用主函數(shù)</p><p><b>
46、 }</b></p><p> switch(bot)</p><p><b> {</b></p><p> case vain:</p><p><b> break;</b></p><p> case enter:</p><
47、;p> key1[n]=end; //把密碼后一位置為end</p><p> if(p_compare(key1,save)) //判斷輸入的密碼是否與原密碼相同</p><p><b> {</b></p><p> p_state(succed);//調(diào)用指示管狀態(tài)閃爍函數(shù),置為成功狀態(tài)succed</p
48、><p> lock=0;//鎖定鍵盤(pán)計(jì)數(shù)置為0</p><p> point=1; //多次密碼輸入錯(cuò)誤計(jì)數(shù)</p><p> state=opened;//指示管置為輸入狀態(tài)opened</p><p> while(1) </p><p> {bot=p_scan
49、();</p><p> switch(bot)</p><p><b> {</b></p><p><b> case off:</b></p><p><b> main();</b></p><p><b> br
50、eak;</b></p><p> case back:</p><p><b> while(1)</b></p><p><b> {</b></p><p> bot=p_scan();</p><p> switch(bot)<
51、/p><p><b> {</b></p><p><b> case off:</b></p><p><b> main();</b></p><p><b> break;</b></p><p> case enter
52、:</p><p><b> main();</b></p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }
53、</b></p><p><b> }</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> p_s
54、tate(error);//調(diào)用指示管狀態(tài)閃爍函數(shù),置為用錯(cuò)誤狀態(tài)error</p><p> p_record();//調(diào)用錯(cuò)誤計(jì)數(shù)函數(shù)</p><p> main(); //調(diào)用主函數(shù)</p><p><b> }</b></p><p><b> break;</b
55、></p><p> case cancel:</p><p><b> main();</b></p><p><b> break;</b></p><p> case back:</p><p> if(n!=0) //判斷當(dāng)前密碼是否為首位&
56、lt;/p><p> key1[n--]=end;//當(dāng)前密碼位置end,密碼退位</p><p><b> break;</b></p><p> case revise:</p><p> p_revise();</p><p><b> break;</b>
57、</p><p> case trevise:</p><p> p_trevise();</p><p><b> break;</b></p><p><b> default:</b></p><p> if(n+1==9)</p><
58、;p><b> {</b></p><p> p_state(error);</p><p><b> main();</b></p><p><b> }</b></p><p> key1[n++]=bot;</p><p>&l
59、t;b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> /*密碼修改模塊*/</p><p> void p_revise() </p><p><b>
60、; {</b></p><p><b> ET0=1;</b></p><p><b> ET1=0;</b></p><p><b> n=0;</b></p><p> p_state(fanin);</p><p> st
61、ate=fanin;</p><p><b> while(1)</b></p><p><b> {</b></p><p><b> if(n==0)</b></p><p> state=fanin;</p><p><b>
62、else</b></p><p><b> state=n;</b></p><p> bot=p_scan();</p><p> if(tov==0)</p><p><b> { </b></p><p> p_state(tover); <
63、;/p><p><b> main();</b></p><p><b> }</b></p><p> switch(bot)</p><p><b> {</b></p><p> case vain:</p><p>
64、<b> break;</b></p><p> case enter:</p><p> key1[n]=end;</p><p> if(p_compare(key1,save))</p><p><b> {</b></p><p><b> l
65、ock=0;</b></p><p><b> point=1;</b></p><p> p_state(succed);</p><p><b> p_new1();</b></p><p><b> }</b></p><p>
66、<b> else</b></p><p><b> {</b></p><p> p_state(error);;</p><p> p_record();</p><p><b> main();</b></p><p><b>
67、; } </b></p><p><b> break;</b></p><p> case cancel:</p><p><b> main();</b></p><p><b> break;</b></p><p> ca
68、se back: </p><p><b> if(n!=0)</b></p><p> key1[n--]=end;</p><p><b> break;</b></p><p> case revise:</p><p> p_revise();</p&
69、gt;<p><b> case off:</b></p><p><b> break;</b></p><p> case trevise:</p><p> p_trevise();</p><p><b> break;</b></p>
70、;<p><b> default:</b></p><p> if(n+1==9)</p><p><b> {</b></p><p> p_state(error);</p><p><b> main();</b></p>&
71、lt;p><b> }</b></p><p> key1[n++]=bot;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p>
72、/*首次使用設(shè)置密碼*/</p><p> void p_new1() </p><p><b> {</b></p><p><b> n=0;</b></p><p> state=new1;</p><p><b> while(1)&l
73、t;/b></p><p><b> {</b></p><p><b> if(n==0)</b></p><p> state=new1;</p><p><b> else</b></p><p> state=n; <
74、/p><p> if((tov==0&&sign==1)||(n!=0&&tov==0))</p><p><b> { </b></p><p> p_state(tover); </p><p><b> main();</b></p><
75、;p><b> }</b></p><p> bot=p_scan();</p><p> switch(bot)</p><p><b> {</b></p><p> case vain:</p><p><b> break;</b&g
76、t;</p><p> case enter:</p><p> key1[n]=end;</p><p><b> p_new2();</b></p><p><b> break;</b></p><p> case cancel:</p>&
77、lt;p><b> main();</b></p><p><b> break;</b></p><p> case back:</p><p><b> if(n!=0)</b></p><p> key1[n--]=end;</p><
78、p><b> break;</b></p><p> case revise:</p><p> if(sign==1)</p><p> p_revise();</p><p><b> break;</b></p><p> case trevis
79、e:</p><p> p_trevise();</p><p><b> break;</b></p><p><b> default:</b></p><p> if(n+1==9)</p><p><b> {</b></p
80、><p> p_state(error);</p><p><b> main();</b></p><p><b> }</b></p><p> key1[n++]=bot;</p><p><b> }</b></p><
81、;p><b> }</b></p><p><b> }</b></p><p> /*首次使用二次確定密碼*/</p><p> void p_new2() </p><p><b> {</b></p><p><b&g
82、t; n=0;</b></p><p> state=new2;</p><p><b> while(1)</b></p><p><b> {</b></p><p><b> if(n==0)</b></p><p>
83、state=new2;</p><p><b> else</b></p><p><b> state=n;</b></p><p> bot=p_scan();</p><p> if(tov==0)</p><p><b> { </b&g
84、t;</p><p> p_state(tover); </p><p><b> main();</b></p><p><b> }</b></p><p> switch(bot)</p><p><b> {</b></p>
85、<p> case vain:</p><p><b> break;</b></p><p> case enter:</p><p> key2[n]=end;</p><p> if(p_compare(key1,key2))</p><p><b>
86、{</b></p><p><b> sign=1;</b></p><p> p_copy(save,key2);</p><p><b> lock=0;</b></p><p> p_state(succed);</p><p><b&g
87、t; main();</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> p_state(different);</p><p><
88、;b> main();</b></p><p><b> }</b></p><p><b> break;</b></p><p> case cancel:</p><p><b> main();</b></p><p>
89、;<b> break;</b></p><p> case back: </p><p><b> if(n!=0)</b></p><p> key2[n--]=end;</p><p><b> break;</b></p><p>
90、 case revise:</p><p> if(sign==1)</p><p> p_revise();</p><p><b> break;</b></p><p><b> case off:</b></p><p><b> break;&l
91、t;/b></p><p> case trevise:</p><p> p_trevise();</p><p><b> break;</b></p><p> default:</p><p> if(n+1==9)</p><p>&l
92、t;b> {</b></p><p> p_state(error);</p><p><b> main();</b></p><p><b> }</b></p><p> key2[n++]=bot;</p><p><b>
93、}</b></p><p><b> }</b></p><p><b> }</b></p><p><b> /*鍵盤(pán)模塊*/</b></p><p> uchar p_scan() </p><p><b>
94、 { </b></p><p> uchar f_s=vain;</p><p> P2=P2&0xf0;</p><p> if(P1!=0xff)</p><p><b> {</b></p><p> p_delay(10);</p><p&
95、gt; if(P1!=0xff)</p><p><b> {</b></p><p><b> tov=1;</b></p><p> P2=P2&0xf0;</p><p> P2=P2|0x07;</p><p> switch(P1)</p&
96、gt;<p><b> {</b></p><p> case 0xfe:f_s=1;break;</p><p> case 0xfd:f_s=4;break;</p><p> case 0xfb:f_s=7;break;</p><p> case 0xf7:f_s=back;break;&
97、lt;/p><p><b> }</b></p><p> while(P1!=0xff)</p><p><b> {</b></p><p><b> sound=1;</b></p><p><b> }</b><
98、/p><p><b> sound=0;</b></p><p> P2=P2&0xf0;</p><p> P2=P2|0x0b;</p><p> switch(P1)</p><p><b> {</b></p><p> cas
99、e 0xfe:f_s=2;break;</p><p> case 0xfd:f_s=5;break;</p><p> case 0xfb:f_s=8;break;</p><p> case 0xf7:f_s=0;break;</p><p><b> }</b></p><p>
100、while(P1!=0xff)</p><p><b> {</b></p><p><b> sound=1;</b></p><p><b> }</b></p><p><b> sound=0;</b></p><p&g
101、t; P2=P2&0xf0;</p><p> P2=P2|0x0d;</p><p> switch(P1)</p><p><b> {</b></p><p> case 0xfe:f_s=3;break;</p><p> case 0xfd:f_s=6;break;&
102、lt;/p><p> case 0xfb:f_s=9;break;</p><p> case 0xf7:f_s=enter;break;</p><p><b> }</b></p><p> while(P1!=0xff)</p><p><b> {</b><
103、;/p><p><b> sound=1;</b></p><p><b> }</b></p><p><b> sound=0;</b></p><p> P2=P2&0xf0;</p><p> P2=P2|0x0e;</p&g
104、t;<p> switch(P1)</p><p><b> {</b></p><p> case 0xfe:f_s=cancel;break;</p><p> case 0xfd:f_s=off;break;</p><p> case 0xfb:f_s=revise;break;</
105、p><p> case 0xf7:f_s=trevise;break;</p><p><b> }</b></p><p> while(P1!=0xff)</p><p><b> {</b></p><p><b> sound=1;</b>
106、</p><p><b> }</b></p><p><b> sound=0;</b></p><p> p_delay(10);</p><p><b> }</b></p><p><b> }</b></p
107、><p> return f_s;</p><p><b> }</b></p><p> void time() interrupt 1 //定時(shí)器0中斷子函數(shù)</p><p><b> {</b></p><p><b> TH0=0xf9;<
108、;/b></p><p><b> TL0=0xdb;</b></p><p><b> TR0=1;</b></p><p><b> ms++;</b></p><p> ms=ms%1000;//1000毫秒后ms置為0</p><p&
109、gt; p_show(); //調(diào)用顯示函數(shù)</p><p> if(sound) //判斷聲音標(biāo)志sound是否為1</p><p> p26=!p26; //蜂鳴器交替 p26取反</p><p> if(ms==0) //判斷ms是否為0</p><p><b> {<
110、/b></p><p> tov++; //超時(shí)計(jì)數(shù)tov加1</p><p> tov=tov%11; //11秒后超時(shí)計(jì)數(shù)tov置為0</p><p> s++; //秒計(jì)數(shù)s加1</p><p> s=s%60; //60秒后秒計(jì)數(shù)s置為0</p><p&
111、gt; if(s==0)//判斷秒計(jì)數(shù)s是否為0</p><p><b> {</b></p><p> minu++;//鍵盤(pán)解鎖計(jì)時(shí)加1</p><p> minu=minu%30; //30分鐘后鍵盤(pán)解鎖計(jì)時(shí)</p><p> if(minu==0)</p>
112、<p><b> lock=0;</b></p><p><b> min++;</b></p><p> min=min%60;</p><p> mino=min%10;</p><p> mint=min/10;</p><p> if(min==
113、0)</p><p><b> {</b></p><p><b> h++;</b></p><p><b> h=h%24;</b></p><p><b> ho=h%10;</b></p><p><b>
114、 ht=h/10;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b&g
115、t; /*顯示模塊*/</b></p><p> void p_show() </p><p><b> {</b></p><p> switch(n1)</p><p><b> {</b></p><p><b> case
116、 1:</b></p><p><b> P3=0x80;</b></p><p> P0=showlist[ht];</p><p><b> n1++; </b></p><p><b> break;</b></p><p>
117、<b> case 2:</b></p><p><b> P3=0x20;</b></p><p> P0=showlist[mint];</p><p><b> n1++;</b></p><p><b> break;</b></p
118、><p><b> case 3:</b></p><p><b> P3=0x00;</b></p><p><b> p24=1;</b></p><p> P0=showlist[state]; </p><p><b> n1++
119、;</b></p><p> p00=point;</p><p><b> break;</b></p><p><b> case 4:</b></p><p><b> p24=0;</b></p><p><b>
120、 P3=0x08;</b></p><p> P0=showlist[mino];</p><p><b> n1++;</b></p><p><b> break;</b></p><p> case 5:</p><p><b>
121、 P3=0x40;</b></p><p> P0=showlist[ho];</p><p><b> p00=0;</b></p><p><b> n1=1;</b></p><p><b> }</b></p><p><
122、;b> }</b></p><p> /*時(shí)間修改模塊*/</p><p> void p_trevise() </p><p><b> {</b></p><p><b> n=3;</b></p><p><b> n
123、2=1;</b></p><p><b> ET0=0;</b></p><p><b> ET1=1;</b></p><p><b> TH1=0xf9;</b></p><p><b> TL1=0xdb;</b></p&g
124、t;<p><b> TR1=1;</b></p><p><b> p24=0;</b></p><p><b> P3=0x80;</b></p><p> P0=showlist[ht];</p><p><b> while(1)<
125、;/b></p><p><b> {</b></p><p> if(tov==0)</p><p><b> { </b></p><p> P0=showlist[tover];</p><p><b> P3=0x00;</b&
126、gt;</p><p> while(n--)</p><p><b> {</b></p><p><b> p24=1;</b></p><p><b> sound=1;</b></p><p> p_delay(99999);</
127、p><p><b> p24=0;</b></p><p><b> sound=0;</b></p><p> p_delay(99999);</p><p><b> }</b></p><p><b> main();</b&
128、gt;</p><p><b> }</b></p><p> if(bot!=finish)</p><p> bot=p_scan();</p><p> switch(bot)</p><p><b> {</b></p><p>
129、case vain:</p><p><b> break;</b></p><p> case finish:</p><p> if(t[1]+t[0]*10>=24||t[3]+t[2]*10>=60)</p><p><b> {</b></p><
130、p> P0=showlist[error];</p><p> while(n--)</p><p><b> {</b></p><p><b> p24=1;</b></p><p><b> sound=1;</b></p><p>
131、; p_delay(99999);</p><p><b> p24=0;</b></p><p><b> sound=0;</b></p><p> p_delay(99999);</p><p><b> }</b></p><p>&l
132、t;b> bot=vain;</b></p><p> p_trevise();</p><p><b> }</b></p><p><b> ht=t[0];</b></p><p><b> ho=t[1];</b></p>&l
133、t;p> mint=t[2];</p><p> mino=t[3];</p><p> h=ho+ht*10;</p><p> min=mino+mint*10;</p><p><b> s=1;</b></p><p><b> main();</b>
134、;</p><p><b> break;</b></p><p> case enter: </p><p><b> break;</b></p><p> case cancel:</p><p><b> main();</b><
135、/p><p><b> break;</b></p><p> case back: </p><p><b> break;</b></p><p> case revise:</p><p> if(sign==1)</p><p>
136、 p_revise();</p><p><b> break;</b></p><p><b> case off:</b></p><p><b> break;</b></p><p> case trevise:</p><p> p_
137、trevise();</p><p><b> break;</b></p><p><b> default:</b></p><p> switch(n2)</p><p><b> {</b></p><p><b> case
138、 4:</b></p><p><b> P3=0x08;</b></p><p> P0=showlist[bot];</p><p><b> t[3]=bot;</b></p><p><b> n2=1; </b></p><p
139、> bot=finish;</p><p> p_delay(99999);</p><p><b> P3=0x00;</b></p><p><b> break;</b></p><p> case 3: </p><p><b> P3
140、=0x20;</b></p><p> P0=showlist[bot];</p><p><b> t[2]=bot;</b></p><p><b> n2++;</b></p><p> p_delay(99999);</p><p> P0=sh
141、owlist[mino];</p><p><b> P3=0x08;</b></p><p><b> break;</b></p><p> case 2:</p><p><b> P3=0x40;</b></p><p> P0
142、=showlist[bot];</p><p><b> t[1]=bot;</b></p><p><b> n2++;</b></p><p> p_delay(99999);</p><p> P0=showlist[mint];</p><p><b&g
143、t; P3=0x20;</b></p><p><b> break;</b></p><p> case 1:</p><p><b> P3=0x80;</b></p><p> P0=showlist[bot];</p><p>&l
144、t;b> t[0]=bot;</b></p><p><b> n2++;</b></p><p> p_delay(99999);</p><p> P0=showlist[ho];</p><p><b> P3=0x40;</b></p><p&
145、gt;<b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> void atime() interrupt 3 //定時(shí)器1中斷</p&
146、gt;<p><b> {</b></p><p><b> TH1=0xf9;</b></p><p><b> TL1=0xdb;</b></p><p><b> TR1=1;</b></p><p><b> ms
147、++;</b></p><p><b> if(sound)</b></p><p><b> p26=!p26;</b></p><p> ms=ms%1000;</p><p><b> if(ms==0)</b></p><p>
148、;<b> {</b></p><p><b> tov++;</b></p><p> tov=tov%11;</p><p><b> }</b></p><p><b> }</b></p><p> /*錯(cuò)誤
149、記錄模塊*/</p><p> void p_record() //三次解鎖錯(cuò)誤則置狀態(tài)為error</p><p><b> {</b></p><p> lock++;//鍵盤(pán)鎖定計(jì)數(shù)加1</p><p> minu=0; //鍵盤(pán)解鎖計(jì)時(shí)置0</p><p&
150、gt; while(lock==3)//當(dāng)鍵盤(pán)鎖定計(jì)數(shù)為3時(shí)循環(huán)</p><p><b> {</b></p><p><b> sound=1;</b></p><p> point=0; //3次錯(cuò)誤標(biāo)志置為0,表示邏輯1</p><p> state=error;<
151、;/p><p> p_delay(99999);</p><p> state=null;</p><p> p_delay(99999);</p><p><b> }</b></p><p><b> }</b></p><p> /*狀
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機(jī)課程設(shè)計(jì)---數(shù)字密碼鎖
- 單片機(jī)課程設(shè)計(jì)-數(shù)字密碼鎖
- 單片機(jī)-密碼鎖課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)-密碼鎖
- 單片機(jī)課程設(shè)計(jì)--密碼鎖
- 單片機(jī)課程設(shè)計(jì)-密碼鎖
- 單片機(jī)課程設(shè)計(jì)---基于單片機(jī)的數(shù)字密碼鎖設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---密碼鎖
- 密碼鎖單片機(jī)課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)-密碼鎖
- 單片機(jī)課程設(shè)計(jì)--電子密碼鎖
- 單片機(jī)課程設(shè)計(jì)--電子密碼鎖
- 單片機(jī)課程設(shè)計(jì)電子密碼鎖
- 51單片機(jī)課程設(shè)計(jì)---密碼鎖
- 單片機(jī)課程設(shè)計(jì)報(bào)告--電子密碼鎖
- 單片機(jī)課程設(shè)計(jì)--電子密碼鎖報(bào)告
- 單片機(jī)課程設(shè)計(jì)---電子密碼鎖報(bào)告
- 課程設(shè)計(jì)報(bào)告---單片機(jī)實(shí)現(xiàn)密碼鎖
- 單片機(jī)課程設(shè)計(jì)---多功能密碼鎖
- 單片機(jī)課程設(shè)計(jì)--門(mén)禁電子密碼鎖
評(píng)論
0/150
提交評(píng)論