單片機(jī)課程設(shè)計(jì)-數(shù)字密碼鎖_第1頁(yè)
已閱讀1頁(yè),還剩30頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論