51單片機(jī)密碼鎖制作的程序和流程圖_第1頁
51單片機(jī)密碼鎖制作的程序和流程圖_第2頁
51單片機(jī)密碼鎖制作的程序和流程圖_第3頁
51單片機(jī)密碼鎖制作的程序和流程圖_第4頁
51單片機(jī)密碼鎖制作的程序和流程圖_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、51單片機(jī)密碼鎖制作的程序和流程圖(很詳細(xì))、基本組成:?jiǎn)纹瑱C(jī)小系統(tǒng)+4*4矩陣鍵盤+ 1 6 0 2顯示+ D C電機(jī) 基本電路:Word資料鍵盤和和顯示鍵盤接P1 口,液晶的電源的開、關(guān)通過 P2.7 口控制五善>.- D9U2 QPFoCOJPLERNhzD &EXT. 電機(jī)(控制口 P2.4)二、基本功能描述:1 .驗(yàn)證密碼、修改密碼a)鎖的初始密碼是123456(密碼最長(zhǎng)為10位,最短為1位)。2 .恢復(fù)初始密碼a)系統(tǒng)可以恢復(fù)初始密碼, 否則一旦忘記密碼而又不能恢復(fù)初始密碼,該鎖就永遠(yuǎn)打不開。但是又不能讓用戶自行修改密碼, 否則其他人也可以恢復(fù)該初始密碼, 使得鎖的安

2、全性 大大下降。3 .使系統(tǒng)進(jìn)入低功耗狀態(tài)a)在實(shí)際使用中,鎖只有在開門時(shí)才被使用。因而在大多數(shù)的時(shí)間里,應(yīng)該讓鎖進(jìn)入休 眠狀態(tài)、以降低功耗,這使系統(tǒng)進(jìn)入掉電狀態(tài),可以大大降低系統(tǒng)功耗。b)同時(shí)將LCD背光燈關(guān)閉4 . DC電機(jī)模擬開鎖動(dòng)作。a)DC電機(jī)啟動(dòng)時(shí)解除開鎖把手的鎖定,允許通過把手開鎖。DC電機(jī)不直接開鎖, 使得DC電機(jī)的功率不用太大,系統(tǒng)的組成和維護(hù)將變得簡(jiǎn)單,功耗也降了下來。三、密碼鎖特點(diǎn)說明:1.0輸入將被以字符形式輸入,最長(zhǎng)為10位。超過10位時(shí)系統(tǒng)將自動(dòng)截取前 10位、但不作密碼長(zhǎng)度溢出提示。2.0開鎖10秒后不允許更改密碼、并提示修改超時(shí)進(jìn)入初始態(tài),需要重新輸入密碼方可

3、再次修改密碼。3.0系統(tǒng)未使用存儲(chǔ)器存儲(chǔ)密碼故掉電后密碼自動(dòng)恢復(fù)為初始密碼。4.0若2分鐘內(nèi)無任何操作,系統(tǒng)自動(dòng)進(jìn)入省電模式運(yùn)行 ,同時(shí)關(guān)閉液晶顯示,以節(jié)省電 力。5.0輸入密碼正確后、電機(jī)允許開鎖時(shí)間為5秒,5秒后需要再次輸入密碼才可以再次開鎖。6.0修改密碼鍵和恢復(fù)初始密碼鍵最好置于室內(nèi)。這是Proteus仿真結(jié)果:LCD7LM016LPass!LL1 口 L0N*巴苫日mnJ岸 likd knT ,= ml CM L o CTij ml J 叫密碼正確時(shí)電機(jī)啟動(dòng)、電機(jī)將持續(xù) 5秒:開鎖辛 D10:-1M007.*TEXTm«"1 M. «'a 專TE

4、XT這是鍵盤:開鎖鍵是接INTO引腳接的一個(gè)獨(dú)立按鍵,用于喚醒CPU工作、進(jìn)而開啟整個(gè)系統(tǒng) LCO1- lwo電)一 一,一 |二 : |Abandon chanSc«! 58SS2SS8 鱗嬖 " . U J L o| E 00 t S 4 , 44 -.改進(jìn):1.0密碼鎖的秘密沒有存儲(chǔ),因而在掉電時(shí)最新的密碼將丟失,重新上電后密碼將恢復(fù)成為初始密碼。這使得每次換電池或停電后密碼都得恢復(fù)一次,給使用帶來不便,但是為了要存儲(chǔ)一個(gè)最多只有十幾字節(jié)的密碼就增加一個(gè)存儲(chǔ)器、似乎不是很值,最好是所選的單片機(jī)自帶這樣的存儲(chǔ)器(容量很小、如32B)。當(dāng)然如 果電源來自市電的話,就不會(huì)經(jīng)

5、常掉電了。2.0系統(tǒng)的最好再增加電源監(jiān)測(cè)的設(shè)計(jì),在電池電力不夠時(shí)發(fā)出提示。 這時(shí)還可以增加備用電池,這樣就可以保證系統(tǒng)不會(huì)掉電。但是這些都要依賴于成本。3.0液晶的顯示最好采用中文。通過對(duì)1602的CGRAM的操作可以實(shí)現(xiàn)中文顯示使得用戶界面更好。主函數(shù):W拓化i訥色桁(赳匕 thk alhw-fl.小在fl作曲甫前 ZLlWNh4色就廳<UWKfFft 鵬_0則值,/收示箱八解好小呼汨常叫1 b-fi. f JTLBftMfwkI IJC-inhlc 即,邛0麗舒莪同mCStM】朱卿I、林 * *WHTmcn;rAJTf普印sbh M-F)也 4QASWdI i I'k n&#

6、39;i 1 / Aiefnjp-ke>tx>arrd irmtri< kl唁慎KUi肝加符口UL 1¥fjr 1 PAi?乜加:也搞!lla!iLi r«fcip. . J 力叢 i ll'U 工紳- ill ,nm:n| p1K0 l.華;” .7:IKI) II. -X :l: :l -)liincrl/'itHNK琳曾人行,通ItjZU(x6«n. lCirr rraier:; D llfcOE! !1時(shí);學(xué)心id,3於 kL.'f:.Wvk Jqx U(- Ibewr"也m«w能器電翱;4k

7、展自打“雙,n: & M L節(jié)演:網(wǎng)kitii>b_m 5 AHa電亂紀(jì)例情 kd d,l制。"退HE心悔隊(duì)M:甜卜杯用短產(chǎn)值;也如工,山、,開他一】l g “OyM;記汴模日喪門利然 士仔臨隊(duì)“,7助面看cpuHihlO;確認(rèn)固執(zhí)"豫通舟M年務(wù)bk_i 呷B中川口*里匕* & NiH裊/胸M點(diǎn)螂不科康也III體岷o-iy12|吟獷U III."t 耨索累 遍區(qū)“二仃.Mkkr z /小 mriic I2Q _上_(鋁i索JX_/確認(rèn)函數(shù)_ con巾rm()操作: 0_等'0'置于輸入table_input結(jié)尾(table_i

8、nput口的長(zhǎng)度返回值在length里面)根據(jù)操作標(biāo)識(shí)選擇任務(wù):1_確認(rèn)密碼:判定輸入密碼正確與否2修改密碼:確認(rèn)第一次輸入并保存要求第二次輸入比較兩次輸入是否相同根據(jù)比較結(jié)果選擇任務(wù):修改失敗,進(jìn)入輸入密碼態(tài)修改成功,將輸入復(fù)制到table_password口確認(rèn)函數(shù)_con巾rm()相關(guān)標(biāo)識(shí)位目錄:flag_display;/根據(jù)其值可以確定顯示信息flag_confirm;/確認(rèn)鍵根據(jù)此標(biāo)識(shí)判定任務(wù),默認(rèn)為0_即為確定密碼狀態(tài)flag_allow;/允許修改密碼標(biāo)識(shí),在密碼比較正確時(shí)置1flag_amend;/第一/二次輸入新密碼標(biāo)識(shí)flag_M;/允許電機(jī)開鎖標(biāo)識(shí)相關(guān)變量sbit M=

9、P3A6;/ 電機(jī)控制口flag_confirm;/操作任務(wù)標(biāo)識(shí)位flag_compare;比較輸入與密碼|相等時(shí)返回1,否則返回0static flag_amend;/修改密碼時(shí)的標(biāo)識(shí)第一次輸入前=1,輸入后置2第二次輸入前=2,輸入后置0flag_display=0;/確認(rèn)鍵操作的返回值根據(jù)返回值可以確定顯示信息flag_allow;/允許改密碼標(biāo)識(shí),在密碼比較正確時(shí)置1,不正確時(shí)置0process_char()函數(shù):_M;DC 電機(jī)控制口process_char()函數(shù)二ength;跟蹤記錄輸入table_input11的字符長(zhǎng)度(<=10)lcd_display()函數(shù)中標(biāo)識(shí)位f

10、lag_display的值與意義:=0:不顯示|不刷新顯示=1:密碼錯(cuò)誤=2:密碼正確=3:請(qǐng)輸入新密碼=4:請(qǐng)?jiān)俅屋斎胄旅艽a=5:密碼修改成功=6:密碼修改失敗=7:顯示輸入密碼狀態(tài)_The password!=8:放棄修改密碼=9:已開鎖流圖不怎么清晰、不過下一篇就是程序了,可以從程序推出流圖。程序比較多,所以寫成了幾個(gè)文件,同時(shí)應(yīng)用了相當(dāng)多的標(biāo)識(shí)位來進(jìn)行信號(hào)傳遞。我覺得邊看程序邊畫它的流程圖會(huì)更好地幫助我們讀程序1.0 main.c 文件#include<reg52.h>#include<string.h>#include"mydefine_2.h”st

11、atic void delay(unsigned int N)/N ms 延時(shí) _12MHz/準(zhǔn)確性高unsigned int i=0,j=0;for(i=1;i<=N;i+)for(j=1;j<=355;j+);void clock()key_clock=0;delay(15);key_clock=1;void init()key_LCD=0;init_1602();TMOD=0x01;TH0=0x3C;/=(65535-5000)/256TL0=0xAF;/(65535-5000)%256EA=1;ET0=1;TR0=0;EA=1;外部中斷0喚醒CPU(空閑方式)EX0=1;I

12、T0=1;command(0x80);lcd_display(7);void main()init();while(1)temp=keyboard_matrix();/ 掃描輸入if(temp)/有按鍵輸入信息clock();/按鍵聲TR0=0;關(guān)閉計(jì)時(shí)timer=0;receive(temp);/ 輸入的字符串長(zhǎng)度為 length( <= 10)if(i!=length) 輸入時(shí)顯示"*"command(0xC0+length);/為顯示密碼輸入設(shè)定位置display,*');i=length;switch(temp)/根據(jù)按鍵號(hào)調(diào)用任務(wù)/修改密碼case

13、12: if(flag_allow) && (flag_amend=0) 輸入密碼正確的條件下可以更改tablejnput0='0'flag_display=3;/請(qǐng)輸入新密碼flag_confirm=1;/確認(rèn)鍵進(jìn)入確認(rèn)修改密碼功能flag_amend=1;/每次按下修改鍵時(shí)都是第一次輸入新密碼length=0;/重按修改鍵時(shí)也是第一次輸入新密碼i=0;elseflag_confirm=0;/ 恢復(fù)初始態(tài)flag_amend=0;lcd_display(1); 密碼不正確delay(500);flag_display=7;length=0;i=0;break;

14、case 11: /取消command(0xC0+length);/ 擦出顯示display。');/顯示后光標(biāo)J1示地址又加了 1command(0xC0+length);/重置光標(biāo)_顯示地址|實(shí)為將光標(biāo)拉回來 i=0;if(length > 0)length-;/input口 位置后退一位break;case 10: confirm。;/ 確定i=0;break;case 13: /修改密碼的過程中取消修改密碼|將系統(tǒng)置于初始態(tài)即可if(flag_amend=1) | (flag_amend=2)flag_amend=0;flag_confirm=0;lcd_display(

15、8);delay(500);flag_display=7;length=0;i=0;break;lcd_display(flag_display);elseTR0=1;開始計(jì)時(shí)等待DC_Moter();resume_password();if(flag_clear)恢復(fù)密碼和開鎖鍵_外部中斷有效時(shí)重新計(jì)時(shí)flag_clear=0;timer=0;if(timer=100)/10 秒后不允許更改密碼flag_allow=0;flag_amend=0;flag_confirm=0;length=0;i=0;lcd_display;/顯示初始態(tài),以提示修改超時(shí)if(timer=1200)/ =2分鐘

16、后休眠|空閑方式TR0=0;timer=0;clear_system();/恢復(fù)初始態(tài)i=0;key_clock=0;delay(250);key_clock=1;PCON|=0x01;lcd_display;/喚醒CPU后顯示初始態(tài)void int0() interrupt 0key_LCD=0;/開液晶電源key_clock=0;delay(250);key_clock=1;flag_clear=1;void Timer0() interrupt 1 /50msTH0=0x3C;/(65535-50000)/256TL0=0xAF;/(65535-50000)%256 timer+;2.0

17、 負(fù)責(zé)實(shí)現(xiàn)具體操作的 process_char.c文件#include<reg52.h>#include<string.h>#include"mydefine.h"sbit key_self=P2A1;/獨(dú)立按鍵,用于恢復(fù)初始密碼sbit key_LED=P2A0;sbit key_M=P2A4;/DC 電機(jī)控制 口sbit key_LCD=P2A7;/ 液晶電源控制口extern bit flag_clear;/恢復(fù)密碼和開鎖鍵_外部中斷的有效標(biāo)識(shí)extern unsigned int timer;/定時(shí)器0計(jì)數(shù)時(shí)段標(biāo)記_50ms 一次定時(shí)中斷ex

18、tern unsigned char length=0;/ 跟蹤記錄輸入 table_input11的字符長(zhǎng)度 (<=10)extern unsigned char flag_display=0;/根據(jù)其值可以確定顯示信息extern unsigned char flag_confirm=0;/確認(rèn)鍵根據(jù)此標(biāo)識(shí)判定任務(wù),默認(rèn)為0即為確定密碼狀態(tài)extern unsigned char flag_allow=0;/允許修改密碼標(biāo)識(shí),在密碼比較正確時(shí)置 1extern unsigned char flag_amend=0;/ 第一/二次輸入新密碼標(biāo)識(shí)unsigned char flag_M=

19、0;/允許電機(jī)開鎖標(biāo)識(shí)extern void command(unsigned char command);extern void display(unsigned char date);/向I2C地址為address處寫入數(shù)據(jù)dateextern void whte_12c(unsigned char address,unsigned char date);讀出I2C地址為address處的數(shù)據(jù)extern unsigned char read_12c(unsigned char address);static void delay(unsigned int N)/N ms 延時(shí) /準(zhǔn)確性高

20、unsigned int i=0,j=0;for(i=1;i<=N;i+)for(j=1;j<=355;j+);/休眠前清除table_input中的值extern void clear_system()table_input0='0'/ 恢復(fù)初始態(tài)length=0;flag_allow=0;flag_confirm=0;flag_amend=0;flag_clear=0;key_LCD=1;關(guān)液晶電源接收鍵盤輸入|以字符形式存入table_input11extern void receive(unsigned char temp)按鍵在松手時(shí)讀取按鍵號(hào),故不會(huì)重復(fù)

21、讀取按鍵值if(temp && length<=9)/ 如此,則無按鍵時(shí)執(zhí)行效率高switch(temp)case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9: table_inputlength+=temp+48;/ 以字符形式存入table_input11break;Word資料case 14: table_inputlength+=48;/ 字符 0/根據(jù)任務(wù)選擇顯示信息extern void lcd_display(unsigned char temp)unsigned char i=0,*p

22、=NULL;if(temp)switch(temp)/選擇顯示信息case 1: p=table_error;/ 密碼不正確 break;case 2: p=table_pass;/密碼正確break;case 3: p=table_new;/ 請(qǐng)輸入新密碼 break;case 4: p=table_again;/請(qǐng)?jiān)俅屋斎胄旅艽a break;case 5: p=table_changed;/ 密碼修改成功break;case 6: p=table_fail;/ 密碼修改失敗break;case 7: p=table_enter;/ 顯示輸入密碼:The password!break;cas

23、e 8: p=table_abandon;/ 放棄修改密碼break;case 9: p=table_close;/ 鎖閉break;case 10: p=table_resume;/ 鎖閉break;command(0x01);delay(1);command(0x80);while(*p!='0')display(*(p+);flag_display=0;/顯示后清0,避免重復(fù)顯示/確認(rèn)extern void confirm(void)unsigned char flag_compare=0;/用于記錄比較輸入與密碼的結(jié)果|相等時(shí)返回1,否則返回0unsigned char

24、 flag_compare_2=0;/用于記錄對(duì)兩次輸入的新密碼的比較結(jié)果|相等時(shí)返回1,否則返回0unsigned char i=0;if(length > 0)/輸入不為空table_inputlength='0'length=0;/輸入字符串長(zhǎng)度清0if(flag_confirm)修改密碼switch(flag_amend)case 1: strcpy(table_newpassword,table_input);/ 第一次輸入新密碼table_input1='0'/避免第一次輸入的內(nèi)容在放棄修改時(shí)再次被利用flag_amend=2;flag_dis

25、play=4;/請(qǐng)?jiān)俅屋斎朊艽abreak;case 2: flag_compare_2=strcmp(table_input,table_newpassword);/ 第二次輸入新密碼flag_amend=0;/清0,允許再次修改flag_confirm=0;/進(jìn)入初始之確認(rèn)密碼狀態(tài)if(!flag_compare_2)/兩次輸入相同=0strcpy(table_password,table_input);table_input1='0'/避免修改完成后再次被利用,造成重復(fù)修改,同時(shí)避免剛修改了就是pass狀態(tài)lcd_display(5);/ 修改成功delay(500);fl

26、ag_display=7;elselcd_display(6); 修改失敗delay(500);flag_display=7;break;else驗(yàn)證密碼flag_compare=strcmp(table_input,table_password);if(!flag_compare)/ 密碼正確=0flag_allow=1;/允許修改密碼flag_M=1;/允許開鎖flag_display=2;/ 密碼正確信息:Pass!table_input1='0'/改變輸入,使不致出亂else/密碼錯(cuò)誤flag_allow=0;/不允許修改密碼lcd_display(1);/ 密碼錯(cuò)誤信

27、息:Error!delay(500);flag_display=7;Word資料/電機(jī)控制extern void DC_Moter()if(flag_M)/允許開鎖flag_M=0;key_M=0;/ 開鎖key_LED=0;delay(1250);key_M=1;key_LED=1;timer=0;lcd_display(7);/ 進(jìn)入初始態(tài)恢復(fù)初始密碼extern void resume_password()Word資料if(!key_self)=0delay(3);if(!key_self)/=0while(!key_self) ;/=0strcpy(table_password,tab

28、le_original);flag_clear=1;lcd_display(10);delay(500);lcd_display;確認(rèn)函數(shù)_ con巾rm()操作:0_等'0'置于輸入table_input結(jié)尾(table_input口的長(zhǎng)度返回值在length里面)根據(jù)操作標(biāo)識(shí)選擇任務(wù):1_確認(rèn)密碼:判定輸入密碼正確與否2修改密碼:確認(rèn)第一次輸入并保存要求第二次輸入比較兩次輸入是否相同根據(jù)比較結(jié)果選擇任務(wù):修改失敗,進(jìn)入輸入密碼態(tài)修改成功,將輸入復(fù)制到table_password口確認(rèn)函數(shù)_con巾rm()相關(guān)標(biāo)識(shí)位目錄flag_display;根據(jù)其值可以確定顯示信息fla

29、g_confirm;/確認(rèn)鍵根據(jù)此標(biāo)識(shí)判定任務(wù),默認(rèn)為0_即為確定密碼狀態(tài)flag_allow;/允許修改密碼標(biāo)識(shí),在密碼比較正確時(shí)置1flag_amend;/第一/二次輸入新密碼標(biāo)識(shí)flag_M;/允許電機(jī)開鎖標(biāo)識(shí)相關(guān)變量sbit M=P3A6;/ 電機(jī)控制口flag_confirm;/操作任務(wù)標(biāo)識(shí)位flag_compare;比較輸入與密碼|相等時(shí)返回1,否則返回0static flag_amend;/修改密碼時(shí)的標(biāo)識(shí)第一次輸入前=1,輸入后置2第二次輸入前=2,輸入后置0flag_display=0;/確認(rèn)鍵操作的返回值根據(jù)返回值可以確定顯示信息flag_allow;/允許改密碼標(biāo)識(shí),在密

30、碼比較正確時(shí)置1,不正確時(shí)置0process_char()函數(shù):_M;/DC 電機(jī)控制口process_char()函數(shù)二ength;/跟蹤記錄輸入table_input11的字符長(zhǎng)度(<=10)lcd_display()函數(shù)中標(biāo)識(shí)位flag_display的值與意義:=0:不顯示|不刷新顯示=1:密碼錯(cuò)誤=2:密碼正確=3:請(qǐng)輸入新密碼=4:請(qǐng)?jiān)俅屋斎胄旅艽a=5:密碼修改成功=6:密碼修改失敗=7:顯示輸入密碼狀態(tài)_The password!=8:放棄修改密碼=9:已開鎖3.0定義各個(gè)數(shù)組的頭文件mydefine.hextern unsigned char table_input11=

31、0;/ 接收鍵盤輸入unsigned char table_password11="123456”;/ 密文unsigned char table_newpassword11="456" / 接收新密碼unsigned char code table_original11="123456”; / 初始密碼/顯示信息unsigned char code table_pass=”Pass!"/ 成功進(jìn)入unsigned char code table_error="Operate Error!"/ 密碼錯(cuò)誤信息unsigned

32、char code table_enter="The password:"/ 輸入密碼unsigned char code table_new="New password:"/ 輸入新密碼unsigned char code table_again="Enter again:" / 再次輸入新密碼unsigned char code table_changed="Changed!"/ 密碼修改成功unsigned char code table_fail="Fail changce!"/ 密碼修

33、改失敗unsigned char code table_abandon="Abandon changce!"/ 放棄修改密碼unsigned char code table_close="Locked!"/ 鎖閉unsigned char code table_resume="Resumed!"/ 恢復(fù)初始密碼4.0 頭文件 mydefine_2.h定義了各個(gè)外部文件向主函數(shù)用到的操作函數(shù)和外部變量#ifndef _mydefine_2_h_#define _mydefine_2_h_sbit key_LED=P2A0;sbit key_clock=P3A3;/ 蜂鳴器sbit key_LCD=P2A7;/ 液晶電源控制口extern bit flag_clear=0;/恢復(fù)密碼和開鎖鍵_外部中斷的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(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)論