版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、一.設計目的在日常的生活和工作中,住宅與部門的安全防范、單位的文件檔案、財務報表以及一些個人資料的保存多以加鎖的辦法來解決。若使用傳統(tǒng)的機械式鑰匙開鎖,人們常需要攜帶多把鑰匙,使用極不方便,且鑰匙丟失后安全性即大打折扣。隨著科學技術的不斷發(fā)展,人們對日常生活中的安全保險器件的要求越來越高。為了滿足人們對鎖的使用要求,增加其安全性,用密碼代替鑰匙的密碼鎖應運而生。密碼鎖具有安全性高、成本低、功耗低、易操作等優(yōu)點。在安全技術防范領域,具有防盜報警功能的電子密碼鎖逐漸代替?zhèn)鹘y(tǒng)的機械式密碼鎖,克服了機械式密碼鎖密碼量少,安全性能差的缺點,使密碼鎖無論在技術上還是在性能上都大大提高一步。隨著大規(guī)模集成電
2、路技術的發(fā)展,特別是單片機的問世,出現了帶微處理器的只能密碼鎖,它除了具有電子密碼鎖的功能外,還引入了智能化管理、專家分析系統(tǒng)等功能,從而使密碼鎖具有很高的安全性、可靠性,應用日益廣泛。本設計采用單片機為主控芯片,結合外圍電路,組成電子密碼鎖,用戶想要打開鎖,必先通過提供的鍵盤輸入正確的密碼才能將鎖打開,密碼輸入錯誤就有提示,為了提高安全性,當密碼輸入錯誤次將報警。密碼可以由用戶自己修改設定,鎖開后才能修改密碼。修改密碼前必須再次輸入密碼,在輸入新密碼時候需要二次確認,以防止誤操作。二設計要求和方案選擇1、 方案:用AT89C52設計的多功能密碼鎖。以單片機作為微控制器,可以實現基于以上優(yōu)點,
3、按鍵有效指示、輸入錯誤、控制開鎖、錯誤報警、密碼修改等功能,工作穩(wěn)定可靠,保密性高,實用性強。AT89C52晶振電路密碼存儲復位電路鍵盤輸入開鎖電路報警電路顯示電路電源輸入2、 電子密碼鎖總體設計三硬件部分AT89C52簡介:單片機AT89C52簡介AT89C52是美國ATMEL公司生產的低電壓,高性能CMOS 8位單片機,片內含4K bytes的可反復擦寫的只讀程序存儲器(EPROM)和128bytes的隨機存取數據序存器(RAM),器件采用ATMEL公司的高密度/非易失性存儲技術生產,兼容標準MCS-51指令系統(tǒng),片內置通用8位中央處理器(CPU)和FLASH存儲單元,AT89C52單片機
4、為許多嵌入式控制系統(tǒng)提供了一種靈活行高且價廉的方案。主要特性: 與MCS-51 兼容 4K字節(jié)可編程FLASH存儲器(壽命:1000寫/擦循環(huán)) 全靜態(tài)工作:0Hz-24KHz 三級程序存儲器保密鎖定 128*8位內部RAM 32條可編程I/O線AT89C52 兩個16位定時器/計數器 5個中斷源 可編程串行通道 低功耗的閑置和掉電模式 片內振蕩器和時鐘電路1. 總電路圖 2. 鍵盤電路按鍵與家庭電話式的按鍵方式3. 復位電路4. 晶振電路5. 顯示電路顯示容量芯片工作電壓工作電流字符尺寸16*2個字符4.55.5V2.0mA(5v)3.95*4.35mm時刻顯示輸入輸出的內容以及操作過程。6
5、. 報警電路當輸入密碼錯誤次數大于等于3次時,會發(fā)出聲響報警。7. 開鎖電路四軟件設計1.程序設計流程圖修改密碼輸入新密碼修改密碼鍵上鎖上鎖鍵判斷按鍵結束開鎖正確?輸入密碼開始2.程序代碼#include <REG52.h>#include<intrins.h>#define LCM_Data P0#define uchar unsigned char #define uint unsignedint#define w 6/定義密碼位數sbit lcd1602_rs=P25;sbit lcd1602_rw=P26;sbit lcd1602_en=P27;sbitScl=
6、P34;/24C02串行時鐘sbitSda=P35;/24C02串行數據sbit ALAM = P21;/報警sbit KEY = P20;/開鎖sbitopen_led=P22;/開鎖指示燈bit operation=0;/操作標志位bit pass=0;/密碼正確標志bit ReInputEn=0;/重置輸入充許標志bit s3_keydown=0;/3秒按鍵標志位bit key_disable=0;/鎖定鍵盤標志unsigned char countt0,second;/t0中斷計數器,秒計數器void Delay5Ms(void);unsigned char code a=0xFE,0
7、xFD,0xFB,0xF7; /控盤掃描控制表unsigned char code b="0123456789"unsigned char code start_line= "password: "unsigned char code name = "=Coded Lock=" /顯示名稱unsigned char code Correct = " correct "/輸入正確unsigned char code Error = " error " /輸入錯誤unsigned char code
8、 codepass= " pass " unsigned char code LockOpen= " open "/OPENunsigned char code SetNew = "SetNewWordEnable"unsigned char code Input = "input: "/INPUTunsigned char code ResetOK = "ResetPasswordOK "unsigned char code initword= "Init password.&quo
9、t;unsigned char code Er_try= "error,try again!"unsigned char code again= "input again "unsigned char InputData6;/輸入密碼暫存區(qū)unsigned char CurrentPassword6=1,3,1,4,2,0; /當前密碼值unsigned char TempPassword6;unsigned char N=0;/密碼輸入位數記數unsigned char ErrorCont;/錯誤次數計數unsigned char CorrectCon
10、t;/正確輸入計數unsigned char ReInputCont; /重新輸入計數unsigned char code initpassword6=0,0,0,0,0,0;/=5ms延時=void Delay5Ms(void)unsignedintTempCyc = 5552;while(TempCyc-);/=400ms延時=void Delay400Ms(void)unsigned char TempCycA = 5;unsignedintTempCycB;while(TempCycA-) TempCycB=7269;while(TempCycB-); /=24C02=void mDe
11、lay(uint t) /延時 uchari;while(t-)for(i=0;i<125;i+);void Nop(void) /空操作_nop_();_nop_();_nop_();_nop_();/*起始條件*/void Start(void)Sda=1;Scl=1;Nop();Sda=0;Nop(); /*停止條件*/void Stop(void)Sda=0;Scl=1;Nop();Sda=1;Nop();/*應答位*/voidAck(void)Sda=0;Nop();Scl=1;Nop();Scl=0;/*反向應答位*/voidNoAck(void)Sda=1;Nop();Sc
12、l=1;Nop();Scl=0; /*發(fā)送數據子程序,Data為要求發(fā)送的數據*/void Send(uchar Data)ucharBitCounter=8;uchar temp;dotemp=Data;Scl=0;Nop();if(temp&0x80)=0x80)Sda=1;elseSda=0;Scl=1;temp=Data<<1;Data=temp;BitCounter-;while(BitCounter);Scl=0;/*讀一字節(jié)的數據,并返回該字節(jié)值*/uchar Read(void)uchar temp=0;uchar temp1=0;ucharBitCount
13、er=8;Sda=1;doScl=0;Nop();Scl=1;Nop();if(Sda)temp=temp|0x01;elsetemp=temp&0xfe;if(BitCounter-1)temp1=temp<<1;temp=temp1;BitCounter-;while(BitCounter);return(temp);voidWrToROM(uchar Data,ucharAddress,ucharNum)uchari;uchar *PData;PData=Data;for(i=0;i<Num;i+) Start();Send(0xa0);Ack();Send(A
14、ddress+i);Ack();Send(*(PData+i);Ack();Stop();mDelay(20); voidRdFromROM(uchar Data,ucharAddress,ucharNum)uchari;uchar *PData;PData=Data;for(i=0;i<Num;i+) Start();Send(0xa0);Ack();Send(Address+i);Ack();Start();Send(0xa1);Ack(); *(PData+i)=Read();Scl=0;NoAck();Stop(); /=LCD1602=#define yi 0x80 /LCD第
15、一行的初始位置,因為LCD1602字符地址首位D7恒定為1(100000000=80)#define er 0x80+0x40 /LCD第二行初始位置(因為第二行第一個字符位置地址是0x40)/-延時函數,后面經常調用-void delay(uintxms)/延時函數,有參函數uintx,y;for(x=xms;x>0;x-)for(y=110;y>0;y-);/-寫指令-write_1602com(uchar com)/*液晶寫入指令函數*lcd1602_rs=0;/數據/指令選擇置為指令 .lcd1602_rw=0; /讀寫選擇置為寫P0=com;/送入數據delay(1);l
16、cd1602_en=1;/拉高使能端,為制造有效的下降沿做準備delay(1);lcd1602_en=0;/en由高變低,產生下降沿,液晶執(zhí)行命令/-寫數據-write_1602dat(uchardat)/*液晶寫入數據函數*lcd1602_rs=1;/數據/指令選擇置為數據lcd1602_rw=0; /讀寫選擇置為寫P0=dat;/送入數據delay(1);lcd1602_en=1; /en置高電平,為制造下降沿做準備delay(1);lcd1602_en=0; /en由高變低,產生下降沿,液晶執(zhí)行命令/-初始化-voidlcd_init(void)write_1602com(0x38);/
17、設置液晶工作模式,意思:16*2行顯示,5*7點陣,8位數據write_1602com(0x0c);/開顯示不顯示光標write_1602com(0x06);/整屏不移動,光標自動右移write_1602com(0x01);/清顯示/=將按鍵值編碼為數值=unsigned char coding(unsigned char m)unsigned char k;switch(m)case (0x18): k=1;break;case (0x28): k=2;break;case (0x48): k=3;break;case (0x88): k='A'break;case (0x1
18、4): k=4;break;case (0x24): k=5;break;case (0x44): k=6;break;case (0x84): k='B'break;case (0x12): k=7;break;case (0x22): k=8;break;case (0x42): k=9;break;case (0x82): k='C'break;case (0x11): k='*'break;case (0x21): k=0;break;case (0x41): k='#'break;case (0x81): k='
19、D'break;return(k);/=按鍵檢測并返回按鍵值=unsigned char keynum(void)unsigned char row,col,i;P1=0xf0;if(P1&0xf0)!=0xf0)Delay5Ms();Delay5Ms();if(P1&0xf0)!=0xf0)row=P10xf0; /確定行線i=0;P1=ai;/精確定位while(i<4)if(P1&0xf0)!=0xf0)col=(P1&0xff); /確定列線break; /已定位后提前退出 elsei+;P1=ai;elsereturn 0;while(P
20、1&0xf0)!=0xf0);return (row|col);/行線與列線組合后返回else return 0;/無鍵按下時返回0/=一聲提示音,表示有效輸入=voidOneAlam(void)ALAM=0;Delay5Ms(); ALAM=1;/=二聲提示音,表示操作成功=voidTwoAlam(void)ALAM=0;Delay5Ms(); ALAM=1;Delay5Ms();ALAM=0;Delay5Ms(); ALAM=1;/=三聲提示音,表示錯誤=voidThreeAlam(void)ALAM=0;Delay5Ms(); ALAM=1;Delay5Ms();ALAM=0;D
21、elay5Ms(); ALAM=1;Delay5Ms();ALAM=0;Delay5Ms(); ALAM=1;/=顯示輸入的N個數字,用H代替以便隱藏=voidDisplayOne(void)/DisplayOneChar(9+N,1,'*');write_1602com(yi+5+N);write_1602dat('*');/=顯示提示輸入=voidDisplayChar(void)unsigned char i;if(pass=1)/DisplayListChar(0,1,LockOpen);write_1602com(er);for(i=0;i<16
22、;i+)write_1602dat(LockOpeni);elseif(N=0)/DisplayListChar(0,1,Error);write_1602com(er);for(i=0;i<16;i+)write_1602dat(Errori);else/DisplayListChar(0,1,start_line);write_1602com(er);for(i=0;i<16;i+)write_1602dat(start_linei);voidDisplayInput(void)unsigned char i;if(CorrectCont=1)/DisplayListChar(
23、0,0,Input);write_1602com(er);for(i=0;i<16;i+)write_1602dat(Inputi);/=重置密碼=/=voidResetPassword(void)unsigned char i;unsigned char j;if(pass=0)pass=0;DisplayChar();ThreeAlam();elseif(ReInputEn=1)if(N=6)ReInputCont+;if(ReInputCont=2)for(i=0;i<6;)if(TempPasswordi=InputDatai)/將兩次輸入的新密碼作對比i+;else/Di
24、splayListChar(0,1,Error);write_1602com(er);for(j=0;j<16;j+)write_1602dat(Errorj);ThreeAlam();/錯誤提示pass=0;ReInputEn=0;/關閉重置功能,ReInputCont=0;DisplayChar();break; if(i=6)/DisplayListChar(0,1,ResetOK);write_1602com(er);for(j=0;j<16;j+)write_1602dat(ResetOKj);TwoAlam();/操作成功提示WrToROM(TempPassword,0
25、,6);/將新密碼寫入24C02存儲ReInputEn=0;ReInputCont=0;CorrectCont=0;elseOneAlam();/DisplayListChar(0, 1, again); /顯示再次輸入一次write_1602com(er);for(j=0;j<16;j+)write_1602dat(againj);for(i=0;i<6;i+)TempPasswordi=InputDatai;/將第一次輸入的數據暫存起來N=0;/輸入數據位數計數器清零 /=輸入密碼錯誤超過三過,報警并鎖死鍵盤=voidAlam_KeyUnable(void)P1=0x00;AL
26、AM=ALAM;Delay5Ms();/=取消所有操作=void Cancel(void)unsigned char i;unsigned char j;/DisplayListChar(0, 1, start_line); write_1602com(er);for(j=0;j<16;j+)write_1602dat(start_linej);TwoAlam();/提示音for(i=0;i<6;i+)InputDatai=0;KEY=1;/關閉鎖ALAM=1;/報警關operation=0;/操作標志位清零pass=0;/密碼正確標志清零ReInputEn=0;/重置輸入充許標志
27、清零ErrorCont=0;/密碼錯誤輸入次數清零CorrectCont=0;/密碼正確輸入次數清零ReInputCont=0;/重置密碼輸入次數清零 open_led=1;s3_keydown=0;key_disable=0;N=0;/輸入位數計數器清零/=確認鍵,并通過相應標志位執(zhí)行相應功能=void Ensure(void)unsigned char i,j;RdFromROM(CurrentPassword,0,6); /從24C02里讀出存儲密碼if(N=6) if(ReInputEn=0)/重置密碼功能未開啟for(i=0;i<6;)if(CurrentPasswordi=I
28、nputDatai)i+;elseErrorCont+;if(ErrorCont=3)/錯誤輸入計數達三次時,報警并鎖定鍵盤write_1602com(er);for(i=0;i<16;i+)write_1602dat(Errori);doAlam_KeyUnable();while(1);elseTR0=1;/開啟定時key_disable=1;/鎖定鍵盤pass=0;break;if(i=6)CorrectCont+;if(CorrectCont=1)/正確輸入計數,當只有一次正確輸入時,開鎖,/DisplayListChar(0,1,LockOpen);write_1602com(
29、er);for(j=0;j<16;j+)write_1602dat(LockOpenj);TwoAlam(); /操作成功提示音KEY=0;/開鎖pass=1;/置正確標志位TR0=1;/開啟定時open_led=0;/開鎖指示燈亮for(j=0;j<6;j+)/將輸入清除InputDatai=0;else/當兩次正確輸入時,開啟重置密碼功能/DisplayListChar(0,1,SetNew);write_1602com(er);for(j=0;j<16;j+)write_1602dat(SetNewj);TwoAlam();/操作成功提示ReInputEn=1;/允許重
30、置密碼輸入CorrectCont=0;/正確計數器清零else/=當第一次使用或忘記密碼時可以用131420對其密碼初始化=if(InputData0=1)&&(InputData1=3)&&(InputData2=1)&&(InputData3=4)&&(InputData4=2)&&(InputData5=0)WrToROM(initpassword,0,6); /強制將初始密碼寫入24C02存儲/DisplayListChar(0,1,initword);/顯示初始化密碼write_1602com(er);f
31、or(j=0;j<16;j+)write_1602dat(initwordj);TwoAlam();Delay400Ms();TwoAlam();N=0;else/DisplayListChar(0,1,Error);write_1602com(er);for(j=0;j<16;j+)write_1602dat(Errorj);ThreeAlam();/錯誤提示音pass=0;else/當已經開啟重置密碼功能時,而按下開鎖鍵,/DisplayListChar(0,1,Er_try);write_1602com(er);for(j=0;j<16;j+)write_1602dat
32、(Er_tryj);ThreeAlam();else/DisplayListChar(0,1,Error);write_1602com(er);for(j=0;j<16;j+)write_1602dat(Errorj);ThreeAlam();/錯誤提示音pass=0;N=0;/將輸入數據計數器清零,為下一次輸入作準備operation=1;/=主函數=void main(void)unsigned char KEY2,NUM,M;unsigned char i,j;P1=0xFF; TMOD=0x11;TL0=0xB0;TH0=0x3C;EA=1;ET0=1;TR0=0;Delay40
33、0Ms(); /啟動等待,等LCM講入工作狀態(tài)lcd_init(); /LCD初始化write_1602com(yi);/日歷顯示固定符號從第一行第0個位置之后開始顯示for(i=0;i<16;i+)write_1602dat(namei);/向液晶屏寫日歷顯示的固定符號部分write_1602com(er);/時間顯示固定符號寫入位置,從第2個位置后開始顯示for(i=0;i<16;i+)write_1602dat(start_linei);/寫顯示時間固定符號,兩個冒號write_1602com(er+9);/設置光標位置write_1602com(0x0f);/設置光標為閃爍
34、Delay5Ms(); /延時片刻(可不要)N=0;/初始化數據輸入位數while(1)if(key_disable=1)Alam_KeyUnable();elseALAM=1;/關報警KEY2=keynum();if(KEY2!=0)if(key_disable=1)second=0;elseNUM=coding(KEY2);switch(NUM)case ('A'): ; break;case ('B'):; break;case ('C'): ; break;case ('D'): ResetPassword();break
35、; /重新設置密碼case ('*'): Cancel();break; /取消當前輸入case ('#'): Ensure(); break; /確認鍵,default: /DisplayListChar(0,1,Input);write_1602com(er);for(i=0;i<16;i+)write_1602dat(Inputi);operation=0;if(N<6) /當輸入的密碼少于6位時,接受輸入并保存,大于6位時則無效。 OneAlam();/按鍵提示音/DisplayOneChar(6+N,1,'*');for(j
36、=0;j<=N;j+)write_1602com(er+6+j);write_1602dat(bNUM);Delay5Ms();Delay5Ms();write_1602com(er+6+j); write_1602dat('*');InputDataN=NUM;N+;else/輸入數據位數大于6后,忽略輸入OneAlam();for(j=0;j<=N;j+)write_1602com(er+6+j); write_1602dat('*');N=6;break; /*中斷服務函數*void time0_int(void) interrupt 1 TL0=0xB0;TH0=0x3C;/TR0=1;countt0+;if(countt0=20)countt0=0;second+;if(pass=1)if(second=1)open_led=1;/關指示燈TR0=0;/關定時器TL0=0xB0;TH0=0x3C;second=0;elseif(second=3)TR0=0;second=0;key_disab
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 16 太陽 教案 統(tǒng)編版五年級語文上冊
- 2024年九年級道德與法治下冊 第一單元 我們共同的世界 第一課 同住地球村 第2框 復雜多變的關系說課稿 新人教版
- 2 學會寬容 第一課時 說課稿-2023-2024學年道德與法治六年級下冊統(tǒng)編版
- 2025如何寫農村土地承包合同范文
- 2025服裝代理商合同協議書范本
- 2《花的學?!氛f課稿-2024-2025學年統(tǒng)編版語文三年級上冊
- 隧道拆除專項施工方案
- 2024年五年級數學上冊 二 小數乘法 2小數的乘法第2課時 小數乘小數說課稿 冀教版
- 軍訓訓合同范例
- 黔江辦公室鋁扣板施工方案
- 做投標文件培訓
- 9.4+跨學科實踐:制作簡易活塞式抽水機課件+-2024-2025學年人教版物理八年級下冊
- 建筑工程工作計劃
- 2025年中國國際投資促進中心限責任公司招聘管理單位筆試遴選500模擬題附帶答案詳解
- 瓶裝液化氣送氣工培訓
- 外科護理課程思政課程標準
- 船舶航行安全
- 道德經全文完整版本
- 9.2溶解度(第1課時飽和溶液不飽和溶液)+教學設計-2024-2025學年九年級化學人教版(2024)下冊
- 2024年審計局公務員招錄事業(yè)單位招聘考試招錄139人完整版附答案【研優(yōu)卷】
- 濰坊市人民醫(yī)院招聘真題
評論
0/150
提交評論