版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 課 程 設 計</p><p> 課 程 名 稱: 單 片 機 原 理 與 應 用 </p><p> 課 題 名 稱: 數(shù) 字 密 碼 鎖 設 計 </p><p> 所在 學院 名稱: 湖南大學電氣與信息工程學院 </p><p><b> 目錄</b&g
2、t;</p><p> 一、 前言- 2 -</p><p> 二、 總體方案設計- 3 -</p><p> 2.1方案論證與比較- 3 -</p><p> 2.2方案選擇- 4 -</p><p> 三、 單元模塊設計- 4 -</p><p> 3.1硬件支持-
3、4 -</p><p> 3.2功能單元模塊設計- 4 -</p><p> 3.2.1 開鎖機構- 4 -</p><p> 3.2.2 矩陣鍵盤設計電路- 5 -</p><p> 3.2.3 聲音提示電路設計- 5 -</p><p> 3.2.4 顯示模塊設計- 6 -</p>
4、<p> 四、程序設計與系統(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 鍵盤掃描模塊- 9 -</p><p> 4.1.4 修
5、改密碼模塊- 10 -</p><p> 五、系統(tǒng)功能- 12 -</p><p> 六.設計總結- 12 -</p><p> 七、附錄:源程序- 12 -</p><p><b> 一、 前言</b></p><p> 隨著社會物質財富的日益增長和人們生活水平的提高,安全成為
6、現(xiàn)代居民最關心的問題之一。而鎖自古以來就是把守門的鐵將軍,人們對它要求甚高,即要求可靠地防盜,又要使用方便。傳統(tǒng)的門鎖既要備有大量的鑰匙,又要擔心鑰匙丟失后的麻煩。隨著單片機的問世,出現(xiàn)了數(shù)字密碼鎖,其保密性高,使用靈活性好,安全系數(shù)高,故受到廣大用戶的青睞。</p><p> 數(shù)字密碼鎖通常使用ARM和單片機控制,單片機相對ARM實現(xiàn)較為簡單,功能較為完善,因此使用單片機控制較多。用單片機控制的密碼鎖常使用匯
7、編語言編寫程序,數(shù)碼管做顯示器 。但本設計使用移植性及可讀性強的C語言編寫;同時采用顯示清楚、功率消耗小而且壽命長的1602A液晶顯示器。從經濟實用的角度出發(fā),采用ADUC848單片機設計出一種具有密碼設置、報警等功能的數(shù)字密碼鎖,并通過Proteus軟件成功地進行了仿真。</p><p><b> 任務及設計要求</b></p><p> 1.設計一多位電子密碼
8、鎖,輸入密碼用“F”表示,輸入密碼正確,綠燈亮(或顯示其它標志、蜂鳴器替代),輸入密碼錯誤,紅燈亮(或顯示其它標志、蜂鳴器替代).</p><p> 2.具有確定鍵和取消鍵,在未確定之前可以取消,重新輸入.</p><p> 3.連續(xù)輸入三次錯誤密碼,紅燈閃爍,報警電路動作,鍵盤鎖定.</p><p> 4.具有密碼重置、修改功能.</p>&l
9、t;p> 5.具有密碼輸入等待操作時間限制功能,超過限定時間報警.</p><p> 6.顯示北京時間,時間可調整.</p><p> 7.可利用蜂鳴器添加提示音.</p><p><b> 二、 總體方案設計</b></p><p> 2.1方案論證與比較</p><p> 方
10、案一:以ADUC848單片機為數(shù)字密碼鎖系統(tǒng)核心,使用4*4矩陣鍵盤作為數(shù)據(jù)輸入方式,驅動1602A顯示器提示程序運行過程和開鎖的步驟,利用AT24C02芯片實現(xiàn)掉電存儲。圖1為單片機控制密碼鎖的系統(tǒng)原理框圖。</p><p> 圖1 單片機控制密碼鎖的系統(tǒng)原理框圖</p><p> 方案二:以74LS112雙JK觸發(fā)器構成的數(shù)字邏輯電路控制方案,如圖2。</p>&l
11、t;p> 圖2 數(shù)字邏輯控制方案數(shù)字密碼鎖原理框圖</p><p><b> 2.2方案選擇</b></p><p> 由于利用單片機靈活的編程設計和強大的I/O端口,及其控制的準確性,不但能實現(xiàn)基本的密碼鎖功能,還可以增添掉電存儲、聲光提示等功能,故選用方案一。</p><p><b> 三、 單元模塊設計</
12、b></p><p><b> 3.1硬件支持</b></p><p> 使用的元器件有:核心芯片ADUC848、存儲芯片AT24C02、液晶顯示1602A、4×4矩陣鍵盤、報警蜂鳴器、發(fā)光二極管和三極管。</p><p> 3.2功能單元模塊設計</p><p> 3.2.1 開鎖機構</
13、p><p> 通過單片機送給開鎖執(zhí)行機構,電路驅動電磁鎖吸合,從而達到開鎖的目的。如圖3所示,為密碼鎖開鎖電路原理圖。</p><p> 當用戶輸入的密碼正確時,單片機便輸出開門信號,送到開鎖驅動電路,然后驅動電磁鎖,達到開門的目的。本次設計中,基于節(jié)省成本考慮,用發(fā)光二極管代替電磁鎖,信息通過LCD顯示,并利用蜂鳴器和二極管聲光指示。其中,綠發(fā)光二極管亮,表示開鎖;否則,表示密碼輸入錯誤
14、并開啟報警電路。</p><p> 圖3 密碼鎖開鎖電路原理圖</p><p> 3.2.2 矩陣鍵盤設計電路</p><p> 每一條水平(行線)與垂直線(列線)的交叉處不相通,而是通過一個按鍵來連通,利用這種行列式矩陣結構只需要M條行線和N條列線,即可組成具有M×N個按鍵的鍵盤。由于本設計中要求使用16個按鍵輸入,為減少鍵盤與單片機接口時所占用
15、的I/O線的數(shù)目,故使用矩陣鍵盤。本設計中,矩陣鍵盤行線和單片機P1.0-P1.3相連,列線與單片機P1.4-P1.7相連。矩陣鍵盤設計電路圖,如圖4所示。</p><p> 鍵盤掃描采用行掃描法,即依次置行線中的每一行為低電平,其余均為高電平,掃描列線電平狀態(tài),為低電平即表示該鍵按下。</p><p> 圖4 矩陣鍵盤設計電路圖</p><p> 3.2.
16、3 聲音提示電路設計</p><p> 聲音提示電路采用小蜂鳴器提示。蜂鳴器能夠根據(jù)脈沖信號,以及信號的頻率發(fā)出各種不同的聲音,這樣可以根據(jù)系統(tǒng)要求在密碼出入正確和密碼輸入錯誤時發(fā)出不同的聲音提示,已達到報警的要求。蜂鳴器電路,如圖5所示。</p><p><b> 圖5 蜂鳴器電路</b></p><p> 3.2.4 顯示模塊設計&
17、lt;/p><p> 本設計中,顯示電路采用1602A液晶顯示器顯示。如下所示,圖6為1602A液晶顯示器的接口示意圖,表1為接口說明。</p><p> 圖6 1602A液晶顯示器的接口示意圖</p><p><b> 表1 接口說明</b></p><p> 本設計中液晶串口一共用到11根導線與單片機相連,
18、具體連接情況如表2顯示模塊與MCU連接說明所示。</p><p> 表2 顯示模塊與MCU連接說明</p><p> 四、程序設計與系統(tǒng)仿真</p><p><b> 4.1 模塊介紹</b></p><p> 與硬件電路相關聯(lián),本系統(tǒng)軟件包括主程序模塊、密碼比較判斷模塊、鍵盤掃描模塊、修改密碼模塊、1602A
19、液晶顯示模塊等。系統(tǒng)程序流程如圖9所示。</p><p> 圖9 系統(tǒng)程序流程圖</p><p> 4.1.1 主程序模塊</p><p> 主程序主要用于定義全局變量,給全局變量賦初值,初始化E2PROM,啟動定時器以及從AT24C02中讀取密碼,為整個程序提供數(shù)據(jù);檢測按鍵;調用顯示等功能。</p><p> 4.1.2 密碼比
20、較判斷模塊</p><p> 該模塊的功能是將鍵盤輸入的密碼利用if語句與設定的密碼進行逐個比較,若密碼完全正確則開鎖;若不正確,則開啟報警電路,復位后重新輸入密碼。其密碼輸入和比較判決流程圖如圖10所示。</p><p> 圖10 密碼輸入和比較判決流程圖</p><p> 4.1.3 鍵盤掃描模塊</p><p> 鍵盤使用矩陣
21、式鍵盤,由行和列組成,CPU對所有鍵盤進行監(jiān)視,從而實現(xiàn)逐列掃描鍵盤確定被按鍵的具體位置、判斷鍵盤上有無鍵按下、消除去抖動、判斷閉合的鍵是否釋放等功能。如圖11所示,為鍵盤掃描流程圖。</p><p> 圖11 鍵盤掃描流程圖</p><p> 4.1.4 修改密碼模塊</p><p> 在密碼輸入正確情況下,可以按下“重置密碼”對密碼進行重新設置,每設定一
22、位就將密碼送給AT24C02存儲起來,當設置6位密碼完畢后,系統(tǒng)將自動跳到程序開始,調用新設置的密碼。圖12為修改密碼流程圖。</p><p> 圖12 修改密碼流程圖</p><p><b> 五、系統(tǒng)功能</b></p><p> 本設計中系統(tǒng)可實現(xiàn)功能如下:</p><p> ?。?)通過切換,對輸入的1—
23、8位密碼進行顯示或隱藏;</p><p> ?。?)通過發(fā)光二極管和蜂鳴器,對解密正確或者錯誤進行聲光報警;</p><p> ?。?)1—8位密碼修改;</p><p> ?。?)在密碼遺失情況下,通過初始密碼進行密碼再設置;</p><p> ?。?)具有1-3次的解鎖次數(shù)任意設定功能;</p><p><b
24、> 六.設計總結</b></p><p> 作為一名電子信息工程的學生,通過本次課程設計,我很好的了解了單片機C語言設計的思考模式,熟悉了C語言的編程規(guī)則,知道了如何去運用一個完全陌生的單片機,會根據(jù)單片機的不同結構來采用不同的命令實現(xiàn)功能。在此次課程設計中我負責的模塊出現(xiàn)了問題導致在數(shù)碼管上顯示狀態(tài)的時候混亂了,主要是因為延時上沒有處理好,Aduc848的定時器處理時是要加上一定的延時來防
25、止沖突的。另外還有鍵盤的防抖模塊,一開是沒有考慮好,所以鍵盤按下后顯示會亂變。綜上而言,通過此次課程設計,我很好的學習了單片機的應用以及其編程。</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; //開總中斷</p><p> ET0=1; //開內部中斷0
40、</p><p> ET1=0;//關內部中斷1</p><p> TMOD=0x11;</p><p> TH0=0xf9; //計數(shù)器0高八位</p><p> TL0=0xdb; //計數(shù)器0低八位</p><p> TR0=1; //計數(shù)器0開始計數(shù)</p>&
41、lt;p> I2CCON=0xe8;</p><p><b> sound=0;</b></p><p> tov=1; //超時計數(shù)置為1</p><p> P1=0x00; //P1全置為0作為輸入</p><p> if(sign!=1)</p><p>
42、 p_new1(); //調用首次使用判斷函數(shù)</p><p> p_base();//調用基礎解鎖函數(shù)</p><p><b> }</b></p><p> /*基礎解鎖函數(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) //無限循環(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ù)是否為0</p><p><b> { </b></p><p> p_state(tover);//調用指示管狀態(tài)閃爍函數(shù),置為用超時狀態(tài)tover</p><p> main(); //調用主函數(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);//調用指示管狀態(tài)閃爍函數(shù),置為成功狀態(tài)succed</p
48、><p> lock=0;//鎖定鍵盤計數(shù)置為0</p><p> point=1; //多次密碼輸入錯誤計數(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);//調用指示管狀態(tài)閃爍函數(shù),置為用錯誤狀態(tài)error</p><p> p_record();//調用錯誤計數(shù)函數(shù)</p><p> main(); //調用主函數(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) //判斷當前密碼是否為首位&
56、lt;/p><p> key1[n--]=end;//當前密碼位置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、/*首次使用設置密碼*/</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> /*鍵盤模塊*/</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 //定時器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(); //調用顯示函數(shù)</p><p> if(sound) //判斷聲音標志sound是否為1</p><p> p26=!p26; //蜂鳴器交替 p26取反</p><p> if(ms==0) //判斷ms是否為0</p><p><b> {<
110、/b></p><p> tov++; //超時計數(shù)tov加1</p><p> tov=tov%11; //11秒后超時計數(shù)tov置為0</p><p> s++; //秒計數(shù)s加1</p><p> s=s%60; //60秒后秒計數(shù)s置為0</p><p&
111、gt; if(s==0)//判斷秒計數(shù)s是否為0</p><p><b> {</b></p><p> minu++;//鍵盤解鎖計時加1</p><p> minu=minu%30; //30分鐘后鍵盤解鎖計時</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> /*時間修改模塊*/</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 //定時器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> /*錯誤
149、記錄模塊*/</p><p> void p_record() //三次解鎖錯誤則置狀態(tài)為error</p><p><b> {</b></p><p> lock++;//鍵盤鎖定計數(shù)加1</p><p> minu=0; //鍵盤解鎖計時置0</p><p&
150、gt; while(lock==3)//當鍵盤鎖定計數(shù)為3時循環(huán)</p><p><b> {</b></p><p><b> sound=1;</b></p><p> point=0; //3次錯誤標志置為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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機課程設計---數(shù)字密碼鎖
- 單片機課程設計-數(shù)字密碼鎖
- 單片機-密碼鎖課程設計
- 單片機課程設計-密碼鎖
- 單片機課程設計--密碼鎖
- 單片機課程設計-密碼鎖
- 單片機課程設計---基于單片機的數(shù)字密碼鎖設計
- 單片機課程設計---密碼鎖
- 密碼鎖單片機課程設計
- 單片機課程設計-密碼鎖
- 單片機課程設計--電子密碼鎖
- 單片機課程設計--電子密碼鎖
- 單片機課程設計電子密碼鎖
- 51單片機課程設計---密碼鎖
- 單片機課程設計報告--電子密碼鎖
- 單片機課程設計--電子密碼鎖報告
- 單片機課程設計---電子密碼鎖報告
- 課程設計報告---單片機實現(xiàn)密碼鎖
- 單片機課程設計---多功能密碼鎖
- 單片機課程設計--門禁電子密碼鎖
評論
0/150
提交評論