版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 單片機課程設計報告</b></p><p> 題目:簡易電子密碼鎖設計</p><p> 專業(yè): 自動化 </p><p> 班級: 2013屆1班 </p><
2、p> 姓名: </p><p> 同組隊員: </p><p> 學號: </p><p> 日期: 2015
3、 年 3月 </p><p><b> 一.設計目的</b></p><p> 在日常的生活和工作中,住宅與部門的安全防范、單位的文件檔案、財務報表以及一些個人資料的保存多以加鎖的辦法來解決。若使用傳統(tǒng)的機械式鑰匙開鎖,人們常需要攜帶多把鑰匙,使用極不方便,且鑰匙丟失后安全性即大打折扣。隨著科學技術的不斷發(fā)展,人們對日常生活中的安全保險器件的要求越來越高。為了滿
4、足人們對鎖的使用要求,增加其安全性,用密碼代替鑰匙的密碼鎖應運而生。密碼鎖具有安全性高、成本低、功耗低、易操作等優(yōu)點。</p><p> 在安全技術防范領域,具有防盜報警功能的電子密碼鎖逐漸代替?zhèn)鹘y(tǒng)的機械式密碼鎖,克服了機械式密碼鎖密碼量少,安全性能差的缺點,使密碼鎖無論在技術上還是在性能上都大大提高一步。隨著大規(guī)模集成電路技術的發(fā)展,特別是單片機的問世,出現(xiàn)了帶微處理器的只能密碼鎖,它除了具有電子密碼鎖的功能
5、外,還引入了智能化管理、專家分析系統(tǒng)等功能,從而使密碼鎖具有很高的安全性、可靠性,應用日益廣泛。</p><p> 本設計采用單片機為主控芯片,結合外圍電路,組成電子密碼鎖,用戶想要打開鎖,必先通過提供的鍵盤輸入正確的密碼才能將鎖打開,密碼輸入錯誤就有提示,為了提高安全性,當密碼輸入錯誤次將報警。密碼可以由用戶自己修改設定,鎖開后才能修改密碼。修改密碼前必須再次輸入密碼,在輸入新密碼時候需要二次確認,以防止誤操
6、作。</p><p> 二.設計要求和方案選擇</p><p> 方案:用AT89C52設計的多功能密碼鎖。以單片機作為微控制器,可以實現(xiàn)基于以上優(yōu)點,按鍵有效指示、輸入錯誤、控制開鎖、錯誤報警、密碼修改等功能,工作穩(wěn)定可靠,保密性高,實用性強。</p><p><b> 電子密碼鎖總體設計</b></p><p>
7、;<b> 三.硬件部分</b></p><p> AT89C52簡介:</p><p> 單片機AT89C52簡介</p><p> AT89C52是美國ATMEL公司生產(chǎn)的低電壓,高性能CMOS 8位單片機,片內(nèi)含4K bytes的可反復擦寫的只讀程序存儲器(EPROM)和128bytes的隨機存取數(shù)據(jù)序存器(RAM),器件采用A
8、TMEL公司的高密度/非易失性存儲技術生產(chǎn),兼容標準MCS-51指令系統(tǒng),片內(nèi)置通用8位中央處理器(CPU)和FLASH存儲單元,AT89C52單片機為許多嵌入式控制系統(tǒng)提供了一種靈活行高且價廉的方案。</p><p><b> 主要特性:</b></p><p> ? 與MCS-51 兼容</p><p> ? 4K字節(jié)可編程FLAS
9、H存儲器(壽命:1000寫/</p><p><b> 擦循環(huán))</b></p><p> ? 全靜態(tài)工作:0Hz-24KHz</p><p> ? 三級程序存儲器保密鎖定</p><p> ? 128*8位內(nèi)部RAM</p><p> ? 32條可編程I/O線</p>&
10、lt;p> ? 兩個16位定時器/計數(shù)器</p><p><b> ? 5個中斷源</b></p><p><b> ? 可編程串行通道</b></p><p> ? 低功耗的閑置和掉電模式</p><p> ? 片內(nèi)振蕩器和時鐘電路</p><p><
11、;b> 總電路圖 </b></p><p><b> 鍵盤電路</b></p><p> 按鍵與家庭電話式的按鍵方式</p><p><b> 復位電路</b></p><p><b> 晶振電路</b></p><p>&l
12、t;b> 顯示電路</b></p><p> 時刻顯示輸入輸出的內(nèi)容以及操作過程。</p><p><b> 報警電路</b></p><p> 當輸入密碼錯誤次數(shù)大于等于3次時,會發(fā)出聲響報警。</p><p><b> 開鎖電路</b></p><
13、p><b> 四.軟件設計</b></p><p><b> 1.程序設計流程圖</b></p><p><b> 2.程序代碼</b></p><p> #include <REG52.h></p><p> #include<intrins
14、.h></p><p> #define LCM_Data P0</p><p> #define uchar unsigned char </p><p> #define uint unsignedint</p><p> #define w 6//定義密碼位數(shù)</p><p> sbi
15、t lcd1602_rs=P2^5;</p><p> sbit lcd1602_rw=P2^6;</p><p> sbit lcd1602_en=P2^7;</p><p> sbitScl=P3^4;//24C02串行時鐘</p><p> sbitSda=P3^5;//24C02串行數(shù)據(jù)</p>&l
16、t;p> sbit ALAM = P2^1;//報警</p><p> sbit KEY = P2^0;//開鎖</p><p> sbitopen_led=P2^2;//開鎖指示燈</p><p> bit operation=0;//操作標志位</p><p> bit pass=0;//密碼正
17、確標志</p><p> bit ReInputEn=0;//重置輸入充許標志</p><p> bit s3_keydown=0;//3秒按鍵標志位</p><p> bit key_disable=0;//鎖定鍵盤標志</p><p> unsigned char countt0,second;//t0中斷計
18、數(shù)器,秒計數(shù)器</p><p> void Delay5Ms(void);</p><p> unsigned char code a[]={0xFE,0xFD,0xFB,0xF7}; //控盤掃描控制表</p><p> unsigned char code b[]={"0123456789"};</p><p&g
19、t; unsigned char code start_line[]= {"password: "};</p><p> unsigned char code name[] = {"===Coded Lock==="}; //顯示名稱</p><p> unsigned char code Correct[] =
20、 {" correct "};//輸入正確</p><p> unsigned char code Error[] = {" error "}; //輸入錯誤</p><p> unsigned char code codepass[]= {" pass "
21、}; </p><p> unsigned char code LockOpen[]= {" open "};//OPEN</p><p> unsigned char code SetNew[] = {"SetNewWordEnable"};</p><p> unsigned char
22、code Input[] = {"input: "};//INPUT</p><p> unsigned char code ResetOK[] = {"ResetPasswordOK "};</p><p> unsigned char code initword[]= {"Init password
23、..."};</p><p> unsigned char code Er_try[]= {"error,try again!"};</p><p> unsigned char code again[]= {"input again "};</p><p> unsigned char Inp
24、utData[6];//輸入密碼暫存區(qū)</p><p> unsigned char CurrentPassword[6]={1,3,1,4,2,0}; //當前密碼值</p><p> unsigned char TempPassword[6];</p><p> unsigned char N=0;//密碼
25、輸入位數(shù)記數(shù)</p><p> unsigned char ErrorCont;//錯誤次數(shù)計數(shù)</p><p> unsigned char CorrectCont;//正確輸入計數(shù)</p><p> unsigned char ReInputCont; //重新輸入計數(shù)</p><p> unsigned cha
26、r code initpassword[6]={0,0,0,0,0,0};</p><p> //=====================5ms延時==============================</p><p> void Delay5Ms(void)</p><p><b> {</b></p><p
27、> unsignedintTempCyc = 5552;</p><p> while(TempCyc--);</p><p><b> }</b></p><p> //===================400ms延時==============================</p><p> v
28、oid Delay400Ms(void)</p><p><b> {</b></p><p> unsigned char TempCycA = 5;</p><p> unsignedintTempCycB;</p><p> while(TempCycA--)</p><p><
29、;b> {</b></p><p> TempCycB=7269;</p><p> while(TempCycB--);</p><p><b> }</b></p><p><b> }</b></p><p> //============
30、====================24C02======================================</p><p> void mDelay(uint t) //延時</p><p><b> { </b></p><p><b> uchari;</b></p><p
31、> while(t--)</p><p><b> {</b></p><p> for(i=0;i<125;i++)</p><p><b> {;}</b></p><p><b> }</b></p><p><b>
32、; }</b></p><p> void Nop(void) //空操作</p><p><b> {</b></p><p><b> _nop_();</b></p><p><b> _nop_();</b></p><p
33、><b> _nop_();</b></p><p><b> _nop_();</b></p><p><b> }</b></p><p><b> /*起始條件*/</b></p><p> void Start(void)</
34、p><p><b> {</b></p><p><b> Sda=1;</b></p><p><b> Scl=1;</b></p><p><b> Nop();</b></p><p><b> Sda=0;
35、</b></p><p><b> Nop();</b></p><p><b> }</b></p><p><b> /*停止條件*/</b></p><p> void Stop(void)</p><p><b>
36、 {</b></p><p><b> Sda=0;</b></p><p><b> Scl=1;</b></p><p><b> Nop();</b></p><p><b> Sda=1;</b></p><
37、p><b> Nop();</b></p><p><b> }</b></p><p><b> /*應答位*/</b></p><p> voidAck(void)</p><p><b> {</b></p><p
38、><b> Sda=0;</b></p><p><b> Nop();</b></p><p><b> Scl=1;</b></p><p><b> Nop();</b></p><p><b> Scl=0;</b&
39、gt;</p><p><b> }</b></p><p><b> /*反向應答位*/</b></p><p> voidNoAck(void)</p><p><b> {</b></p><p><b> Sda=1;<
40、/b></p><p><b> Nop();</b></p><p><b> Scl=1;</b></p><p><b> Nop();</b></p><p><b> Scl=0;</b></p><p>&
41、lt;b> }</b></p><p> /*發(fā)送數(shù)據(jù)子程序,Data為要求發(fā)送的數(shù)據(jù)*/</p><p> void Send(uchar Data)</p><p><b> {</b></p><p> ucharBitCounter=8;</p><p> u
42、char temp;</p><p><b> do</b></p><p><b> {</b></p><p> temp=Data;</p><p><b> Scl=0;</b></p><p><b> Nop();<
43、/b></p><p> if((temp&0x80)==0x80)</p><p><b> Sda=1;</b></p><p><b> else</b></p><p><b> Sda=0;</b></p><p><
44、;b> Scl=1;</b></p><p> temp=Data<<1;</p><p> Data=temp;</p><p> BitCounter--;</p><p><b> }</b></p><p> while(BitCounter);&
45、lt;/p><p><b> Scl=0;</b></p><p><b> }</b></p><p> /*讀一字節(jié)的數(shù)據(jù),并返回該字節(jié)值*/</p><p> uchar Read(void)</p><p><b> {</b></p
46、><p> uchar temp=0;</p><p> uchar temp1=0;</p><p> ucharBitCounter=8;</p><p><b> Sda=1;</b></p><p><b> do{</b></p><p&g
47、t;<b> Scl=0;</b></p><p><b> Nop();</b></p><p><b> Scl=1;</b></p><p><b> Nop();</b></p><p><b> if(Sda)</b&g
48、t;</p><p> temp=temp|0x01;</p><p><b> else</b></p><p> temp=temp&0xfe;</p><p> if(BitCounter-1)</p><p><b> {</b></p>
49、<p> temp1=temp<<1;</p><p> temp=temp1;</p><p><b> }</b></p><p> BitCounter--;</p><p><b> }</b></p><p> while(Bi
50、tCounter);</p><p> return(temp);</p><p><b> }</b></p><p> voidWrToROM(uchar Data[],ucharAddress,ucharNum)</p><p><b> {</b></p><p&
51、gt;<b> uchari;</b></p><p> uchar *PData;</p><p> PData=Data;</p><p> for(i=0;i<Num;i++)</p><p><b> {</b></p><p><b>
52、Start();</b></p><p> Send(0xa0);</p><p><b> Ack();</b></p><p> Send(Address+i);</p><p><b> Ack();</b></p><p> Send(*(PDa
53、ta+i));</p><p><b> Ack();</b></p><p><b> Stop();</b></p><p> mDelay(20);</p><p><b> }</b></p><p><b> }</b
54、></p><p> voidRdFromROM(uchar Data[],ucharAddress,ucharNum)</p><p><b> {</b></p><p><b> uchari;</b></p><p> uchar *PData;</p><
55、p> PData=Data;</p><p> for(i=0;i<Num;i++)</p><p><b> {</b></p><p><b> Start();</b></p><p> Send(0xa0);</p><p><b>
56、 Ack();</b></p><p> Send(Address+i);</p><p><b> Ack();</b></p><p><b> Start();</b></p><p> Send(0xa1);</p><p><b>
57、Ack();</b></p><p> *(PData+i)=Read();</p><p><b> Scl=0;</b></p><p><b> NoAck();</b></p><p><b> Stop();</b></p><
58、p><b> }</b></p><p><b> }</b></p><p> //=======================================LCD1602=============================</p><p> #define yi 0x80 </p>
59、<p> //LCD第一行的初始位置,因為LCD1602字符地址首位D7恒定為1(100000000=80)</p><p> #define er 0x80+0x40 </p><p> //LCD第二行初始位置(因為第二行第一個字符位置地址是0x40)</p><p> //----------------延時函數(shù),后面經(jīng)常調(diào)用-------
60、---------------</p><p> void delay(uintxms)//延時函數(shù),有參函數(shù)</p><p><b> {</b></p><p><b> uintx,y;</b></p><p> for(x=xms;x>0;x--)</p><
61、;p> for(y=110;y>0;y--);</p><p><b> }</b></p><p> //--------------------------寫指令---------------------------</p><p> write_1602com(uchar com)//****液晶寫入指令函數(shù)****&
62、lt;/p><p><b> {</b></p><p> lcd1602_rs=0;//數(shù)據(jù)/指令選擇置為指令 ......</p><p> lcd1602_rw=0; //讀寫選擇置為寫</p><p> P0=com;//送入數(shù)據(jù)</p><p><b> delay(1)
63、;</b></p><p> lcd1602_en=1;//拉高使能端,為制造有效的下降沿做準備</p><p><b> delay(1);</b></p><p> lcd1602_en=0;//en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令</p><p><b> }</b>&l
64、t;/p><p> //-------------------------寫數(shù)據(jù)-----------------------------</p><p> write_1602dat(uchardat)//***液晶寫入數(shù)據(jù)函數(shù)****</p><p><b> {</b></p><p> lcd1602_rs=
65、1;//數(shù)據(jù)/指令選擇置為數(shù)據(jù)</p><p> lcd1602_rw=0; //讀寫選擇置為寫</p><p> P0=dat;//送入數(shù)據(jù)</p><p><b> delay(1);</b></p><p> lcd1602_en=1; //en置高電平,為制造下降沿做準備</p><p
66、><b> delay(1);</b></p><p> lcd1602_en=0; //en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令</p><p><b> }</b></p><p> //-------------------------初始化-------------------------</p&
67、gt;<p> voidlcd_init(void)</p><p><b> {</b></p><p> write_1602com(0x38);//設置液晶工作模式,意思:16*2行顯示,5*7點陣,8位數(shù)據(jù)</p><p> write_1602com(0x0c);//開顯示不顯示光標</p><
68、;p> write_1602com(0x06);//整屏不移動,光標自動右移</p><p> write_1602com(0x01);//清顯示</p><p><b> }</b></p><p> //==============將按鍵值編碼為數(shù)值=========================</p>&l
69、t;p> unsigned char coding(unsigned char m)</p><p><b> {</b></p><p> unsigned char k;</p><p><b> switch(m)</b></p><p><b> {</b&
70、gt;</p><p> case (0x18): k=1;break;</p><p> case (0x28): k=2;break;</p><p> case (0x48): k=3;break;</p><p> case (0x88): k='A';break;</p><p>
71、case (0x14): k=4;break;</p><p> case (0x24): k=5;break;</p><p> case (0x44): k=6;break;</p><p> case (0x84): k='B';break;</p><p> case (0x12): k=7;break;<
72、;/p><p> case (0x22): k=8;break;</p><p> case (0x42): k=9;break;</p><p> case (0x82): k='C';break;</p><p> case (0x11): k='*';break;</p><p&g
73、t; case (0x21): k=0;break;</p><p> case (0x41): k='#';break;</p><p> case (0x81): k='D';break;</p><p><b> }</b></p><p> return(k);</
74、p><p><b> }</b></p><p> //=====================按鍵檢測并返回按鍵值===============================</p><p> unsigned char keynum(void)</p><p><b> {</b><
75、;/p><p> unsigned char row,col,i;</p><p><b> P1=0xf0;</b></p><p> if((P1&0xf0)!=0xf0)</p><p><b> {</b></p><p> Delay5Ms();<
76、;/p><p> Delay5Ms();</p><p> if((P1&0xf0)!=0xf0)</p><p><b> {</b></p><p> row=P1^0xf0; //確定行線</p><p><b> i=0;</b>&l
77、t;/p><p> P1=a[i];//精確定位</p><p> while(i<4)</p><p><b> {</b></p><p> if((P1&0xf0)!=0xf0)</p><p><b> {</b></p>&l
78、t;p> col=~(P1&0xff); //確定列線</p><p> break; //已定位后提前退出 </p><p><b> }</b></p><p><b> else</b></p><p><b> {</b>
79、;</p><p><b> i++;</b></p><p><b> P1=a[i];</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }<
80、/b></p><p><b> else</b></p><p><b> {</b></p><p><b> return 0;</b></p><p><b> }</b></p><p> while((P
81、1&0xf0)!=0xf0);</p><p> return (row|col);//行線與列線組合后返回</p><p><b> }</b></p><p> else return 0;//無鍵按下時返回0</p><p><b> }</b></p>
82、<p> //=======================一聲提示音,表示有效輸入========================</p><p> voidOneAlam(void)</p><p><b> {</b></p><p><b> ALAM=0;</b></p>&l
83、t;p> Delay5Ms();</p><p><b> ALAM=1;</b></p><p><b> }</b></p><p> //========================二聲提示音,表示操作成功========================</p><p>
84、voidTwoAlam(void)</p><p><b> {</b></p><p><b> ALAM=0;</b></p><p> Delay5Ms();</p><p><b> ALAM=1;</b></p><p> Delay
85、5Ms();</p><p><b> ALAM=0;</b></p><p> Delay5Ms();</p><p><b> ALAM=1;</b></p><p><b> }</b></p><p> //==============
86、==========三聲提示音,表示錯誤========================</p><p> voidThreeAlam(void)</p><p><b> {</b></p><p><b> ALAM=0;</b></p><p> Delay5Ms();</p&g
87、t;<p><b> ALAM=1;</b></p><p> Delay5Ms();</p><p><b> ALAM=0;</b></p><p> Delay5Ms();</p><p><b> ALAM=1;</b></p>&
88、lt;p> Delay5Ms();</p><p><b> ALAM=0;</b></p><p> Delay5Ms();</p><p><b> ALAM=1;</b></p><p><b> }</b></p><p> /
89、/=====================顯示輸入的N個數(shù)字,用H代替以便隱藏============================</p><p> voidDisplayOne(void)</p><p><b> {</b></p><p> //DisplayOneChar(9+N,1,'*');</p
90、><p> write_1602com(yi+5+N);</p><p> write_1602dat('*');</p><p><b> }</b></p><p> //=======================顯示提示輸入=========================</p>
91、;<p> voidDisplayChar(void)</p><p><b> {</b></p><p> unsigned char i;</p><p> if(pass==1)</p><p><b> {</b></p><p> //D
92、isplayListChar(0,1,LockOpen);</p><p> write_1602com(er);</p><p> for(i=0;i<16;i++)</p><p><b> {</b></p><p> write_1602dat(LockOpen[i]);</p>&
93、lt;p><b> }</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p><b> if(N==0)</b></p&g
94、t;<p><b> {</b></p><p> //DisplayListChar(0,1,Error);</p><p> write_1602com(er);</p><p> for(i=0;i<16;i++)</p><p><b> {</b></p
95、><p> write_1602dat(Error[i]);</p><p><b> }</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b><
96、;/p><p> //DisplayListChar(0,1,start_line);</p><p> write_1602com(er);</p><p> for(i=0;i<16;i++)</p><p><b> {</b></p><p> write_1602dat(s
97、tart_line[i]);</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> voidDispla
98、yInput(void)</p><p><b> {</b></p><p> unsigned char i;</p><p> if(CorrectCont==1)</p><p><b> {</b></p><p> //DisplayListChar(0
99、,0,Input);</p><p> write_1602com(er);</p><p> for(i=0;i<16;i++)</p><p><b> {</b></p><p> write_1602dat(Input[i]);</p><p><b> }&l
100、t;/b></p><p><b> }</b></p><p><b> }</b></p><p> //========================重置密碼==================================================</p><p>
101、//==================================================================================</p><p> voidResetPassword(void)</p><p><b> {</b></p><p> unsigned char i;</p&
102、gt;<p> unsigned char j;</p><p> if(pass==0)</p><p><b> {</b></p><p><b> pass=0;</b></p><p> DisplayChar();</p><p> Th
103、reeAlam();</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> if(ReInputEn==1)</p><p><b> {</b
104、></p><p><b> if(N==6)</b></p><p><b> {</b></p><p> ReInputCont++;</p><p> if(ReInputCont==2)</p><p><b> {</b&g
105、t;</p><p> for(i=0;i<6;)</p><p><b> {</b></p><p> if(TempPassword[i]==InputData[i])//將兩次輸入的新密碼作對比</p><p><b> i++;</b></p><p&g
106、t;<b> else</b></p><p><b> {</b></p><p> //DisplayListChar(0,1,Error);</p><p> write_1602com(er);</p><p> for(j=0;j<16;j++)</p>&l
107、t;p><b> {</b></p><p> write_1602dat(Error[j]);</p><p><b> }</b></p><p> ThreeAlam();//錯誤提示</p><p><b> pass=0;</b></p
108、><p> ReInputEn=0;//關閉重置功能,</p><p> ReInputCont=0;</p><p> DisplayChar();</p><p><b> break;</b></p><p><b> }</b></p>&l
109、t;p><b> } </b></p><p><b> if(i==6)</b></p><p><b> {</b></p><p> //DisplayListChar(0,1,ResetOK);</p><p> write_1602com(er);&l
110、t;/p><p> for(j=0;j<16;j++)</p><p><b> {</b></p><p> write_1602dat(ResetOK[j]);</p><p><b> }</b></p><p> TwoAlam();//操作成
111、功提示</p><p> WrToROM(TempPassword,0,6);//將新密碼寫入24C02存儲</p><p> ReInputEn=0;</p><p><b> }</b></p><p> ReInputCont=0;</p><p> CorrectCont=0;
112、</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> OneAlam();</p><p> //DisplayListChar(0, 1, again);
113、//顯示再次輸入一次</p><p> write_1602com(er);</p><p> for(j=0;j<16;j++)</p><p><b> {</b></p><p> write_1602dat(again[j]);</p><p><b> }
114、</b></p><p> for(i=0;i<6;i++)</p><p><b> {</b></p><p> TempPassword[i]=InputData[i];//將第一次輸入的數(shù)據(jù)暫存起來</p><p><b> }</b></p>
115、<p><b> }</b></p><p> N=0;//輸入數(shù)據(jù)位數(shù)計數(shù)器清零</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p>
116、<p><b> }</b></p><p> //=======================輸入密碼錯誤超過三過,報警并鎖死鍵盤======================</p><p> voidAlam_KeyUnable(void)</p><p><b> {</b></p>
117、<p><b> P1=0x00;</b></p><p><b> {</b></p><p> ALAM=~ALAM;</p><p> Delay5Ms();</p><p><b> }</b></p><p><b&
118、gt; }</b></p><p> //=======================取消所有操作============================================</p><p> void Cancel(void)</p><p><b> {</b></p><p>
119、 unsigned char i;</p><p> unsigned char j;</p><p> //DisplayListChar(0, 1, start_line); </p><p> write_1602com(er);</p><p> for(j=0;j<16;j++)</p><p>
120、;<b> {</b></p><p> write_1602dat(start_line[j]);</p><p><b> }</b></p><p> TwoAlam();//提示音</p><p> for(i=0;i<6;i++)</p><p&
121、gt;<b> {</b></p><p> InputData[i]=0;</p><p><b> }</b></p><p> KEY=1;//關閉鎖</p><p> ALAM=1;//報警關</p><p> operation=0;
122、//操作標志位清零</p><p> pass=0;//密碼正確標志清零</p><p> ReInputEn=0;//重置輸入充許標志清零</p><p> ErrorCont=0;//密碼錯誤輸入次數(shù)清零</p><p> CorrectCont=0;//密碼正確輸入次數(shù)清零</p><
123、;p> ReInputCont=0;//重置密碼輸入次數(shù)清零 </p><p> open_led=1;</p><p> s3_keydown=0;</p><p> key_disable=0;</p><p> N=0;//輸入位數(shù)計數(shù)器清零</p><p><b> }
124、</b></p><p> //==========================確認鍵,并通過相應標志位執(zhí)行相應功能===============================</p><p> void Ensure(void)</p><p><b> {</b></p><p> uns
125、igned char i,j;</p><p> RdFromROM(CurrentPassword,0,6); //從24C02里讀出存儲密碼</p><p><b> if(N==6)</b></p><p><b> {</b></p><p> if(ReInputEn==0)
126、//重置密碼功能未開啟</p><p><b> {</b></p><p> for(i=0;i<6;)</p><p><b> {</b></p><p> if(CurrentPassword[i]==InputData[i])</p>&l
127、t;p><b> {</b></p><p><b> i++;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p>
128、<p> ErrorCont++;</p><p> if(ErrorCont==3)//錯誤輸入計數(shù)達三次時,報警并鎖定鍵盤</p><p><b> {</b></p><p> write_1602com(er);</p><p> for(i=0;i<16;i++)</p&g
129、t;<p><b> {</b></p><p> write_1602dat(Error[i]);</p><p><b> }</b></p><p><b> do</b></p><p> Alam_KeyUnable();</p>
130、<p><b> while(1);</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> TR0=1;//開啟定時</p&g
131、t;<p> key_disable=1;//鎖定鍵盤</p><p><b> pass=0;</b></p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b>
132、</p><p><b> }</b></p><p><b> if(i==6)</b></p><p><b> {</b></p><p> CorrectCont++;</p><p> if(CorrectCont==1)//正確
133、輸入計數(shù),當只有一次正確輸入時,開鎖,</p><p><b> {</b></p><p> //DisplayListChar(0,1,LockOpen);</p><p> write_1602com(er);</p><p> for(j=0;j<16;j++)</p><p&g
134、t;<b> {</b></p><p> write_1602dat(LockOpen[j]);</p><p><b> }</b></p><p> TwoAlam(); //操作成功提示音</p><p> KEY=0;//開鎖</p>
135、<p> pass=1;//置正確標志位</p><p> TR0=1;//開啟定時</p><p> open_led=0;//開鎖指示燈亮</p><p> for(j=0;j<6;j++)//將輸入清除</p><p><b> {</b>&l
136、t;/p><p> InputData[i]=0;</p><p><b> }</b></p><p><b> }</b></p><p> else//當兩次正確輸入時,開啟重置密碼功能</p><p><b> {</b>&
137、lt;/p><p> //DisplayListChar(0,1,SetNew);</p><p> write_1602com(er);</p><p> for(j=0;j<16;j++)</p><p><b> {</b></p><p> write_1602dat(SetN
138、ew[j]);</p><p><b> }</b></p><p> TwoAlam();//操作成功提示</p><p> ReInputEn=1;//允許重置密碼輸入</p><p> CorrectCont=0;//正確計數(shù)器清零</p><p>
139、;<b> }</b></p><p><b> }</b></p><p><b> else</b></p><p> //=========================當?shù)谝淮问褂没蛲浢艽a時可以用131420對其密碼初始化============</p><
140、;p> {if((InputData[0]==1)&&(InputData[1]==3)&&(InputData[2]==1)&&(InputData[3]==4)&&(InputData[4]==2)&&(InputData[5]==0))</p><p><b> {</b></p>
141、<p> WrToROM(initpassword,0,6); //強制將初始密碼寫入24C02存儲</p><p> //DisplayListChar(0,1,initword);//顯示初始化密碼</p><p> write_1602com(er);</p><p> for(j=0;j<16;j++)</p>
142、<p><b> {</b></p><p> write_1602dat(initword[j]);</p><p><b> }</b></p><p> TwoAlam();</p><p> Delay400Ms();</p><p> Tw
143、oAlam();</p><p><b> N=0;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> //DisplayLi
144、stChar(0,1,Error);</p><p> write_1602com(er);</p><p> for(j=0;j<16;j++)</p><p><b> {</b></p><p> write_1602dat(Error[j]);</p><p><b&
145、gt; }</b></p><p> ThreeAlam();//錯誤提示音</p><p><b> pass=0;</b></p><p><b> }</b></p><p><b> }</b></p><p&g
146、t;<b> }</b></p><p> else//當已經(jīng)開啟重置密碼功能時,而按下開鎖鍵,</p><p><b> {</b></p><p> //DisplayListChar(0,1,Er_try);</p><p> write_1602com(er);<
147、;/p><p> for(j=0;j<16;j++)</p><p><b> {</b></p><p> write_1602dat(Er_try[j]);</p><p><b> }</b></p><p> ThreeAlam();</p>
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于51單片機密碼鎖課程設計報告
- 畢業(yè)設計基于51單片機密碼鎖課程設計
- 基于單片機密碼鎖課程設計
- 單片機密碼鎖課程設計
- 單片機密碼鎖畢業(yè)設計課程設計
- 單片機密碼鎖畢業(yè)設計課程設計
- 51單片機課程設計---密碼鎖
- 基于at89c51單片機密碼鎖設計
- 開題報告----基于單片機密碼鎖畢業(yè)設計
- 單片機密碼鎖畢業(yè)設計
- 單片機-密碼鎖課程設計
- 單片機課程設計-密碼鎖
- 單片機課程設計--密碼鎖
- 單片機課程設計-密碼鎖
- 單片機課程設計報告--電子密碼鎖
- 單片機課程設計--電子密碼鎖報告
- 單片機課程設計---電子密碼鎖報告
- 課程設計報告---單片機實現(xiàn)密碼鎖
- 單片機課程設計----電子密碼鎖報告
- 單片機課程設計---密碼鎖
評論
0/150
提交評論