基于51單片機(jī)密碼鎖課程設(shè)計(jì)報(bào)告_第1頁
基于51單片機(jī)密碼鎖課程設(shè)計(jì)報(bào)告_第2頁
基于51單片機(jī)密碼鎖課程設(shè)計(jì)報(bào)告_第3頁
基于51單片機(jī)密碼鎖課程設(shè)計(jì)報(bào)告_第4頁
基于51單片機(jī)密碼鎖課程設(shè)計(jì)報(bào)告_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、一.設(shè)計(jì)目的在日常的生活和工作中,住宅與部門的安全防范、單位的文件檔案、財(cái)務(wù)報(bào)表以及一些個(gè)人資料的保存多以加鎖的辦法來解決。若使用傳統(tǒng)的機(jī)械式鑰匙開鎖,人們常需要攜帶多把鑰匙,使用極不方便,且鑰匙丟失后安全性即大打折扣。隨著科學(xué)技術(shù)的不斷發(fā)展,人們對日常生活中的安全保險(xiǎn)器件的要求越來越高。為了滿足人們對鎖的使用要求,增加其安全性,用密碼代替鑰匙的密碼鎖應(yīng)運(yùn)而生。密碼鎖具有安全性高、成本低、功耗低、易操作等優(yōu)點(diǎn)。在安全技術(shù)防范領(lǐng)域,具有防盜報(bào)警功能的電子密碼鎖逐漸代替?zhèn)鹘y(tǒng)的機(jī)械式密碼鎖,克服了機(jī)械式密碼鎖密碼量少,安全性能差的缺點(diǎn),使密碼鎖無論在技術(shù)上還是在性能上都大大提高一步。隨著大規(guī)模集成電

2、路技術(shù)的發(fā)展,特別是單片機(jī)的問世,出現(xiàn)了帶微處理器的只能密碼鎖,它除了具有電子密碼鎖的功能外,還引入了智能化管理、專家分析系統(tǒng)等功能,從而使密碼鎖具有很高的安全性、可靠性,應(yīng)用日益廣泛。本設(shè)計(jì)采用單片機(jī)為主控芯片,結(jié)合外圍電路,組成電子密碼鎖,用戶想要打開鎖,必先通過提供的鍵盤輸入正確的密碼才能將鎖打開,密碼輸入錯(cuò)誤就有提示,為了提高安全性,當(dāng)密碼輸入錯(cuò)誤次將報(bào)警。密碼可以由用戶自己修改設(shè)定,鎖開后才能修改密碼。修改密碼前必須再次輸入密碼,在輸入新密碼時(shí)候需要二次確認(rèn),以防止誤操作。二設(shè)計(jì)要求和方案選擇1、 方案:用at89c52設(shè)計(jì)的多功能密碼鎖。以單片機(jī)作為微控制器,可以實(shí)現(xiàn)基于以上優(yōu)點(diǎn),

3、按鍵有效指示、輸入錯(cuò)誤、控制開鎖、錯(cuò)誤報(bào)警、密碼修改等功能,工作穩(wěn)定可靠,保密性高,實(shí)用性強(qiáng)。at89c52晶振電路密碼存儲復(fù)位電路鍵盤輸入開鎖電路報(bào)警電路顯示電路電源輸入2、 電子密碼鎖總體設(shè)計(jì)三硬件部分at89c52簡介:單片機(jī)at89c52簡介at89c52是美國atmel公司生產(chǎn)的低電壓,高性能cmos 8位單片機(jī),片內(nèi)含4k bytes的可反復(fù)擦寫的只讀程序存儲器(eprom)和128bytes的隨機(jī)存取數(shù)據(jù)序存器(ram),器件采用atmel公司的高密度/非易失性存儲技術(shù)生產(chǎn),兼容標(biāo)準(zhǔn)mcs-51指令系統(tǒng),片內(nèi)置通用8位中央處理器(cpu)和flash存儲單元,at89c52單片機(jī)

4、為許多嵌入式控制系統(tǒng)提供了一種靈活行高且價(jià)廉的方案。主要特性: 與mcs-51 兼容 4k字節(jié)可編程flash存儲器(壽命:1000寫/擦循環(huán)) 全靜態(tài)工作:0hz-24khz 三級程序存儲器保密鎖定 128*8位內(nèi)部ram 32條可編程i/o線at89c52 兩個(gè)16位定時(shí)器/計(jì)數(shù)器 5個(gè)中斷源 可編程串行通道 低功耗的閑置和掉電模式 片內(nèi)振蕩器和時(shí)鐘電路1. 總電路圖 2. 鍵盤電路按鍵與家庭電話式的按鍵方式3. 復(fù)位電路4. 晶振電路5. 顯示電路顯示容量芯片工作電壓工作電流字符尺寸16*2個(gè)字符4.55.5v2.0ma(5v)3.95*4.35mm時(shí)刻顯示輸入輸出的內(nèi)容以及操作過程。6

5、. 報(bào)警電路當(dāng)輸入密碼錯(cuò)誤次數(shù)大于等于3次時(shí),會發(fā)出聲響報(bào)警。7. 開鎖電路四軟件設(shè)計(jì)1.程序設(shè)計(jì)流程圖修改密碼輸入新密碼修改密碼鍵上鎖上鎖鍵判斷按鍵結(jié)束開鎖正確?輸入密碼開始2.程序代碼#include #include#define lcm_data p0#define uchar unsigned char #define uint unsignedint#define w 6/定義密碼位數(shù)sbit lcd1602_rs=p25;sbit lcd1602_rw=p26;sbit lcd1602_en=p27;sbitscl=p34;/24c02串行時(shí)鐘sbitsda=p35;/24c02

6、串行數(shù)據(jù)sbit alam = p21;/報(bào)警sbit key = p20;/開鎖sbitopen_led=p22;/開鎖指示燈bit operation=0;/操作標(biāo)志位bit pass=0;/密碼正確標(biāo)志bit reinputen=0;/重置輸入充許標(biāo)志bit s3_keydown=0;/3秒按鍵標(biāo)志位bit key_disable=0;/鎖定鍵盤標(biāo)志unsigned char countt0,second;/t0中斷計(jì)數(shù)器,秒計(jì)數(shù)器void delay5ms(void);unsigned char code a=0xfe,0xfd,0xfb,0xf7; /控盤掃描控制表unsigned

7、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 ; /輸入錯(cuò)誤unsigned char code codepass= pass ; unsigned char code lockopen= open ;/openunsigned char code setnew = set

8、newwordenable;unsigned char code input = input: ;/inputunsigned char code resetok = resetpasswordok ;unsigned char code initword= init password.;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,

9、2,0; /當(dāng)前密碼值unsigned char temppassword6;unsigned char n=0;/密碼輸入位數(shù)記數(shù)unsigned char errorcont;/錯(cuò)誤次數(shù)計(jì)數(shù)unsigned char correctcont;/正確輸入計(jì)數(shù)unsigned char reinputcont; /重新輸入計(jì)數(shù)unsigned char code initpassword6=0,0,0,0,0,0;/=5ms延時(shí)=void delay5ms(void)unsignedinttempcyc = 5552;while(tempcyc-);/=400ms延時(shí)=void delay40

10、0ms(void)unsigned char tempcyca = 5;unsignedinttempcycb;while(tempcyca-) tempcycb=7269;while(tempcycb-); /=24c02=void mdelay(uint t) /延時(shí) uchari;while(t-)for(i=0;i125;i+);void nop(void) /空操作_nop_();_nop_();_nop_();_nop_();/*起始條件*/void start(void)sda=1;scl=1;nop();sda=0;nop(); /*停止條件*/void stop(void)s

11、da=0;scl=1;nop();sda=1;nop();/*應(yīng)答位*/voidack(void)sda=0;nop();scl=1;nop();scl=0;/*反向應(yīng)答位*/voidnoack(void)sda=1;nop();scl=1;nop();scl=0; /*發(fā)送數(shù)據(jù)子程序,data為要求發(fā)送的數(shù)據(jù)*/void send(uchar data)ucharbitcounter=8;uchar temp;dotemp=data;scl=0;nop();if(temp&0x80)=0x80)sda=1;elsesda=0;scl=1;temp=data1;data=temp;bitcou

12、nter-;while(bitcounter);scl=0;/*讀一字節(jié)的數(shù)據(jù),并返回該字節(jié)值*/uchar read(void)uchar temp=0;uchar temp1=0;ucharbitcounter=8;sda=1;doscl=0;nop();scl=1;nop();if(sda)temp=temp|0x01;elsetemp=temp&0xfe;if(bitcounter-1)temp1=temp1;temp=temp1;bitcounter-;while(bitcounter);return(temp);voidwrtorom(uchar data,ucharaddress

13、,ucharnum)uchari;uchar *pdata;pdata=data;for(i=0;inum;i+) start();send(0xa0);ack();send(address+i);ack();send(*(pdata+i);ack();stop();mdelay(20); voidrdfromrom(uchar data,ucharaddress,ucharnum)uchari;uchar *pdata;pdata=data;for(i=0;i0;x-)for(y=110;y0;y-);/-寫指令-write_1602com(uchar com)/*液晶寫入指令函數(shù)*lcd1

14、602_rs=0;/數(shù)據(jù)/指令選擇置為指令 .lcd1602_rw=0; /讀寫選擇置為寫p0=com;/送入數(shù)據(jù)delay(1);lcd1602_en=1;/拉高使能端,為制造有效的下降沿做準(zhǔn)備delay(1);lcd1602_en=0;/en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令/-寫數(shù)據(jù)-write_1602dat(uchardat)/*液晶寫入數(shù)據(jù)函數(shù)*lcd1602_rs=1;/數(shù)據(jù)/指令選擇置為數(shù)據(jù)lcd1602_rw=0; /讀寫選擇置為寫p0=dat;/送入數(shù)據(jù)delay(1);lcd1602_en=1; /en置高電平,為制造下降沿做準(zhǔn)備delay(1);lcd1602_en=0

15、; /en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令/-初始化-voidlcd_init(void)write_1602com(0x38);/設(shè)置液晶工作模式,意思:16*2行顯示,5*7點(diǎn)陣,8位數(shù)據(jù)write_1602com(0x0c);/開顯示不顯示光標(biāo)write_1602com(0x06);/整屏不移動,光標(biāo)自動右移write_1602com(0x01);/清顯示/=將按鍵值編碼為數(shù)值=unsigned char coding(unsigned char m)unsigned char k;switch(m)case (0x18): k=1;break;case (0x28): k=2;bre

16、ak;case (0x48): k=3;break;case (0x88): k=a;break;case (0x14): 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=#;brea

17、k;case (0x81): k=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(i4)if(p1&0xf0)!=0xf0)col=(p1&0xff); /確定列線break; /已定位后提前退出 elsei+;p1=ai;elsereturn 0;while(p1&0xf0)

18、!=0xf0);return (row|col);/行線與列線組合后返回else return 0;/無鍵按下時(shí)返回0/=一聲提示音,表示有效輸入=voidonealam(void)alam=0;delay5ms(); alam=1;/=二聲提示音,表示操作成功=voidtwoalam(void)alam=0;delay5ms(); alam=1;delay5ms();alam=0;delay5ms(); alam=1;/=三聲提示音,表示錯(cuò)誤=voidthreealam(void)alam=0;delay5ms(); alam=1;delay5ms();alam=0;delay5ms();

19、alam=1;delay5ms();alam=0;delay5ms(); alam=1;/=顯示輸入的n個(gè)數(shù)字,用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;i16;i+)write_1602dat(lockopeni);elseif

20、(n=0)/displaylistchar(0,1,error);write_1602com(er);for(i=0;i16;i+)write_1602dat(errori);else/displaylistchar(0,1,start_line);write_1602com(er);for(i=0;i16;i+)write_1602dat(start_linei);voiddisplayinput(void)unsigned char i;if(correctcont=1)/displaylistchar(0,0,input);write_1602com(er);for(i=0;i16;i+

21、)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;i6;)if(temppasswordi=inputdatai)/將兩次輸入的新密碼作對比i+;else/displaylistchar(0,1,error);write_1602com(er);for(j=0;

22、j16;j+)write_1602dat(errorj);threealam();/錯(cuò)誤提示pass=0;reinputen=0;/關(guān)閉重置功能,reinputcont=0;displaychar();break; if(i=6)/displaylistchar(0,1,resetok);write_1602com(er);for(j=0;j16;j+)write_1602dat(resetokj);twoalam();/操作成功提示wrtorom(temppassword,0,6);/將新密碼寫入24c02存儲reinputen=0;reinputcont=0;correctcont=0;e

23、lseonealam();/displaylistchar(0, 1, again); /顯示再次輸入一次write_1602com(er);for(j=0;j16;j+)write_1602dat(againj);for(i=0;i6;i+)temppasswordi=inputdatai;/將第一次輸入的數(shù)據(jù)暫存起來n=0;/輸入數(shù)據(jù)位數(shù)計(jì)數(shù)器清零 /=輸入密碼錯(cuò)誤超過三過,報(bào)警并鎖死鍵盤=voidalam_keyunable(void)p1=0x00;alam=alam;delay5ms();/=取消所有操作=void cancel(void)unsigned char i;unsign

24、ed char j;/displaylistchar(0, 1, start_line); write_1602com(er);for(j=0;j16;j+)write_1602dat(start_linej);twoalam();/提示音for(i=0;i6;i+)inputdatai=0;key=1;/關(guān)閉鎖alam=1;/報(bào)警關(guān)operation=0;/操作標(biāo)志位清零pass=0;/密碼正確標(biāo)志清零reinputen=0;/重置輸入充許標(biāo)志清零errorcont=0;/密碼錯(cuò)誤輸入次數(shù)清零correctcont=0;/密碼正確輸入次數(shù)清零reinputcont=0;/重置密碼輸入次數(shù)清零

25、 open_led=1;s3_keydown=0;key_disable=0;n=0;/輸入位數(shù)計(jì)數(shù)器清零/=確認(rèn)鍵,并通過相應(yīng)標(biāo)志位執(zhí)行相應(yīng)功能=void ensure(void)unsigned char i,j;rdfromrom(currentpassword,0,6); /從24c02里讀出存儲密碼if(n=6) if(reinputen=0)/重置密碼功能未開啟for(i=0;i6;)if(currentpasswordi=inputdatai)i+;elseerrorcont+;if(errorcont=3)/錯(cuò)誤輸入計(jì)數(shù)達(dá)三次時(shí),報(bào)警并鎖定鍵盤write_1602com(er)

26、;for(i=0;i16;i+)write_1602dat(errori);doalam_keyunable();while(1);elsetr0=1;/開啟定時(shí)key_disable=1;/鎖定鍵盤pass=0;break;if(i=6)correctcont+;if(correctcont=1)/正確輸入計(jì)數(shù),當(dāng)只有一次正確輸入時(shí),開鎖,/displaylistchar(0,1,lockopen);write_1602com(er);for(j=0;j16;j+)write_1602dat(lockopenj);twoalam(); /操作成功提示音key=0;/開鎖pass=1;/置正確

27、標(biāo)志位tr0=1;/開啟定時(shí)open_led=0;/開鎖指示燈亮for(j=0;j6;j+)/將輸入清除inputdatai=0;else/當(dāng)兩次正確輸入時(shí),開啟重置密碼功能/displaylistchar(0,1,setnew);write_1602com(er);for(j=0;j16;j+)write_1602dat(setnewj);twoalam();/操作成功提示reinputen=1;/允許重置密碼輸入correctcont=0;/正確計(jì)數(shù)器清零else/=當(dāng)?shù)谝淮问褂没蛲浢艽a時(shí)可以用131420對其密碼初始化=if(inputdata0=1)&(inputdata1=3)&(

28、inputdata2=1)&(inputdata3=4)&(inputdata4=2)&(inputdata5=0)wrtorom(initpassword,0,6); /強(qiáng)制將初始密碼寫入24c02存儲/displaylistchar(0,1,initword);/顯示初始化密碼write_1602com(er);for(j=0;j16;j+)write_1602dat(initwordj);twoalam();delay400ms();twoalam();n=0;else/displaylistchar(0,1,error);write_1602com(er);for(j=0;j16;j+

29、)write_1602dat(errorj);threealam();/錯(cuò)誤提示音pass=0;else/當(dāng)已經(jīng)開啟重置密碼功能時(shí),而按下開鎖鍵,/displaylistchar(0,1,er_try);write_1602com(er);for(j=0;j16;j+)write_1602dat(er_tryj);threealam();else/displaylistchar(0,1,error);write_1602com(er);for(j=0;j16;j+)write_1602dat(errorj);threealam();/錯(cuò)誤提示音pass=0;n=0;/將輸入數(shù)據(jù)計(jì)數(shù)器清零,為下

30、一次輸入作準(zhǔn)備operation=1;/=主函數(shù)=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;delay400ms(); /啟動等待,等lcm講入工作狀態(tài)lcd_init(); /lcd初始化write_1602com(yi);/日歷顯示固定符號從第一行第0個(gè)位置之后開始顯示for(i=0;i16;i+)write_1602dat(namei);/向液晶屏寫日歷顯示的固定符號部分write_1602com(er);/

31、時(shí)間顯示固定符號寫入位置,從第2個(gè)位置后開始顯示for(i=0;i16;i+)write_1602dat(start_linei);/寫顯示時(shí)間固定符號,兩個(gè)冒號write_1602com(er+9);/設(shè)置光標(biāo)位置write_1602com(0x0f);/設(shè)置光標(biāo)為閃爍delay5ms(); /延時(shí)片刻(可不要)n=0;/初始化數(shù)據(jù)輸入位數(shù)while(1)if(key_disable=1)alam_keyunable();elsealam=1;/關(guān)報(bào)警key2=keynum();if(key2!=0)if(key_disable=1)second=0;elsenum=coding(key2)

32、;switch(num)case (a): ; break;case (b):; break;case (c): ; break;case (d): resetpassword();break; /重新設(shè)置密碼case (*): cancel();break; /取消當(dāng)前輸入case (#): ensure(); break; /確認(rèn)鍵,default: /displaylistchar(0,1,input);write_1602com(er);for(i=0;i16;i+)write_1602dat(inputi);operation=0;if(n6) /當(dāng)輸入的密碼少于6位時(shí),接受輸入并保

33、存,大于6位時(shí)則無效。 onealam();/按鍵提示音/displayonechar(6+n,1,*);for(j=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/輸入數(shù)據(jù)位數(shù)大于6后,忽略輸入onealam();for(j=0;j=n;j+)write_1602com(er+6+j); write_1602dat(*);n=6;break; /*中斷服務(wù)函數(shù)*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;/關(guān)指示燈tr0=0;/關(guān)定時(shí)器tl0=0xb0;th0=0x3c;second=0;elseif(second=3)tr0=0;second=0;key_disable=0;s3_keydown=0;tl0=0xb0;th0=0x3c;else tr0=1;五.調(diào)試及運(yùn)行結(jié)果1、 使用keil生成hex文件2、 使用proteus仿真使

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論