單片機密碼鎖掉電可記憶密碼_第1頁
單片機密碼鎖掉電可記憶密碼_第2頁
單片機密碼鎖掉電可記憶密碼_第3頁
單片機密碼鎖掉電可記憶密碼_第4頁
單片機密碼鎖掉電可記憶密碼_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、. /*功能鍵S1-S10數(shù)字鍵0-9S11-更改密碼S12-更改密碼完畢后確認(rèn)S13-重試密碼、重新設(shè)定S14-關(guān)閉密碼鎖初始密碼:000000 密碼位數(shù):6位程序功能:本程序結(jié)合了24C02存儲器的存儲功能,可以掉電保存密碼。第一次運行時,假設(shè)輸入000000原始密碼后無反響,可以試驗著將主程序中前面的一小段被注釋線屏蔽的程序前的注釋線刪掉,然后重新編譯下載可以將密碼復(fù)原為000000。此后,再將這小段程序屏蔽掉,再編譯下載。方可正常使用。 1、開鎖:下載程序后,直接按六次S1即代表數(shù)字1,8位LED亮,鎖被翻開,輸入密碼時,六位數(shù)碼管依次顯示小橫杠。 2、更改密碼:只有當(dāng)開鎖LED亮后,

2、該功能方可使用。首先按下更改密碼鍵S11,然后設(shè)置相應(yīng)密碼,此時六位數(shù)碼管會顯示設(shè)置密碼對應(yīng)的數(shù)字。最后設(shè)置完六位后,按下S12確認(rèn)密碼更改,此后新密碼即生效。 3、重試密碼:當(dāng)輸入密碼時,密碼輸錯后按下鍵S13,可重新輸入六位密碼。當(dāng)設(shè)置密碼時,設(shè)置中途想更改密碼,也可按下此鍵重新設(shè)置。 4、關(guān)閉密碼鎖:按下S14即可將翻開的密碼鎖關(guān)閉。推薦初級演示步驟:輸入原始密碼000000-按下更改密碼按鍵S11-按0到9設(shè)置密碼-按S12確認(rèn)密碼更改-按S14關(guān)閉密碼鎖-輸入新的密碼翻開密碼鎖*/#include#include #define uint unsigned int#define uc

3、har unsigned charuchar old1,old2,old3,old4,old5,old6; /原始密碼000000uchar new1,new2,new3,new4,new5,new6; /每次MCU采集到的密碼輸入uchar a=16,b=16,c=16,d=16,e=16,f=16; /送入數(shù)碼管顯示的變量uchar wei,key,temp;bit allow,genggai,ok,wanbi,retry,close; /各個狀態(tài)位sbit dula=P26;sbit wela=P27;sbit beep=P23;sbit sda=P20; /IO口定義sbit scl=

4、P21;unsigned char code table=0*3f,0*06,0*5b,0*4f,0*66,0*6d,0*7d,0*07,0*7f,0*6f,0*77,0*7c,0*39,0*5e,0*79,0*71,0*00,0*40;/*IIC芯片24C02存儲器驅(qū)動程序*/void nop()_nop_();_nop_();/24C02讀寫驅(qū)動程序/void delay1(unsigned int m)unsigned int n; for(n=0;nm;n+);void init() /24c02初始化子程序scl=1;nop();sda=1;nop();void start() /啟

5、動I2C總線sda=1;nop();scl=1;nop();sda=0;nop();scl=0;nop();void stop() /停頓I2C總線sda=0;nop();scl=1;nop();sda=1;nop();void writebyte(unsigned char j) /寫一個字節(jié)unsigned char i,temp; temp=j; for (i=0;i8;i+) temp=temp1; scl=0; nop(); sda=CY;/temp左移時,移出的值放入了CY中 nop(); scl=1;/待sda線上的數(shù)據(jù)穩(wěn)定后,將scl拉高 nop(); scl=0; nop()

6、; sda=1; nop();unsigned char readbyte() /讀一個字節(jié) unsigned char i,j,k=0; scl=0; nop(); sda=1; for (i=0;i8;i+) nop(); scl=1; nop(); if(sda=1) j=1; elsej=0; k=(k1)|j; scl=0; nop();return(k);void clock() /I2C總線時鐘 unsigned char i=0; scl=1; nop(); while(sda=1)&(i0;j-) for(k=125;k0;k-);void display(uchar a,u

7、char b,uchar c,uchar d,uchar e,uchar f) dula=0; P0=tablea; dula=1; dula=0; wela=0; P0=0*fe; wela=1; wela=0; delay(5); P0=tableb; dula=1; dula=0; P0=0*fd; wela=1; wela=0; delay(5); P0=tablec; dula=1; dula=0; P0=0*fb; wela=1; wela=0; delay(5); P0=tabled; dula=1; dula=0; P0=0*f7; wela=1; wela=0; delay(

8、5); P0=tablee; dula=1; dula=0; P0=0*ef; wela=1; wela=0; delay(5); P0=tablef; dula=1; dula=0; P0=0*df; wela=1; wela=0; delay(5);void keyscan() P3=0*fe; temp=P3; temp=temp&0*f0; if(temp!=0*f0) delay(10); if(temp!=0*f0) temp=P3; switch(temp) case 0*ee: key=0; wei+; break; case 0*de: key=1; wei+; break;

9、 case 0*be: key=2; wei+; break; case 0*7e: key=3; wei+; break; while(temp!=0*f0) temp=P3; temp=temp&0*f0; beep=0; beep=1; P3=0*fd; temp=P3; temp=temp&0*f0; if(temp!=0*f0) delay(10); if(temp!=0*f0) temp=P3; switch(temp) case 0*ed: key=4; wei+; break; case 0*dd: key=5; wei+; break; case 0*bd: key=6; w

10、ei+; break; case 0*7d: key=7; wei+; break; while(temp!=0*f0) temp=P3; temp=temp&0*f0; beep=0; beep=1; P3=0*fb; temp=P3; temp=temp&0*f0; if(temp!=0*f0) delay(10); if(temp!=0*f0) temp=P3; switch(temp) case 0*eb: key=8; wei+; break; case 0*db: key=9; wei+; break; case 0*bb: genggai=1; wei=0; break; cas

11、e 0*7b: if(allow) ok=1; break; while(temp!=0*f0) temp=P3; temp=temp&0*f0; beep=0; beep=1; P3=0*f7; temp=P3; temp=temp&0*f0; if(temp!=0*f0) delay(10); if(temp!=0*f0) temp=P3; switch(temp) case 0*e7: retry=1; break; case 0*d7: close=1; break; while(temp!=0*f0) temp=P3; temp=temp&0*f0; beep=0; beep=1;

12、void shumima()/對按鍵采集來的數(shù)據(jù)進展分配if(!wanbi)switch(wei)case 1:new1=key; if(!allow)a=17; else a=key;break;case 2:new2=key;if(a=17) b=17;else b=key;break;case 3:new3=key; if(a=17) c=17;else c=key;break;case 4:new4=key;if(a=17) d=17;else d=key;break;case 5:new5=key; if(a=17) e=17;else e=key;break;case 6:new6

13、=key; if(a=17) f=17;else f=key;wanbi=1;break;void yanzheng() /驗證密碼是否正確if(wanbi) /只有當(dāng)六位密碼均輸入完畢前方進展驗證if(new1=old1)&(new2=old2)&(new3=old3)&(new4=old4)&(new5=old5)&(new6=old6)allow=1;/當(dāng)輸入的密碼正確,會得到allowe置一void main()init(); /初始化24C02/*下面的一小段程序的功能為格式化密碼存儲區(qū)。*當(dāng)24c02中這些存儲區(qū)由于其他程序的運行而導(dǎo)致*所存數(shù)據(jù)發(fā)生了變化,或者密碼遺忘時,*可以刪

14、掉其前面的注釋線,然后重新編譯下載。*而將密碼復(fù)原為000000后,請將下面的程序用*注釋屏蔽掉,重新編譯、下載,方可正常使用*/write24c02(110,0*00);/write24c02(111,0*00);/24c02的第110到115地址單元作為密碼存儲區(qū)/write24c02(112,0*00);/write24c02(113,0*00);/write24c02(114,0*00);/write24c02(115,0*00);/*/old1=read24c02(110); old2=read24c02(111);old3=read24c02(112);old4=read24c02

15、(113);old5=read24c02(114);old6=read24c02(115);while(1)keyscan();shumima();yanzheng();if(allow) /驗證完后,假設(shè)allow為1,則開鎖P1=0*00;if(!genggai)wanbi=0;if(genggai) /當(dāng)S16更改密碼鍵被按下,genggai會被置一if(allow) /假設(shè)已經(jīng)把鎖翻開,才有更改密碼的權(quán)限while(!wanbi)/當(dāng)新的六位密碼沒有設(shè)定完,則一直在這里循環(huán) keyscan();shumima();if(retry|close) /而當(dāng)探測到重試鍵S18或者關(guān)閉密碼鎖鍵

16、S19被按下時,則跳出wanbi=1;break;display(a,b,c,d,e,f);if(ok) /更改密碼時,當(dāng)所有六位新密碼均被按下時,可以按下此鍵,完畢密碼更改 /其他時間按下此鍵無效ok=0; wei=0;genggai=0;old1=new1;old2=new2;old3=new3; /此時,舊的密碼將被代替old4=new4;old5=new5;old6=new6;/新密碼寫入存儲區(qū)。write24c02(110,old1);write24c02(111,old2);write24c02(112,old3);write24c02(113,old4);write24c02(114,old5);write24c02(115,old6);a=16;b=16;c=16;d=16;e=16;f=16;if(retry)/當(dāng)重試按鍵S18被按下,retry會被置位retry=0; wei=0;wanbi=0;a=1

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。