0.png (53.64 KB, 下載次數: 46)
下載附件
2018-9-18 02:39 上傳
0.png (60.56 KB, 下載次數: 48)
下載附件
2018-9-18 02:43 上傳
0.png (16.17 KB, 下載次數: 45)
下載附件
2018-9-18 02:43 上傳
電子密碼鎖 【摘要】本文的電子密碼鎖利用數字邏輯電路,實現對門的電子控制,并且有各種附加電路保證電路能夠安全工作,具有極高的安全系數。 【關鍵詞】電子密碼鎖、電壓比較器、555單穩態電路、計數器、JK觸發器、UPS電源。 一、引言 隨著人們生活水平的提高,如何實現家庭防盜這一問題也變的尤其的突出,傳統的機械鎖由于其構造的簡單,被撬的事件屢見不鮮,電子鎖由于其保密性高,使用靈活性好,安全系數高,受到了廣大用戶的親呢。 設計本課題時構思了兩種方案:一種是用以AT89C2051為核心的單片機控制方案;另一種是用以74LS112雙JK觸發器構成的數字邏輯電路控制方案。考慮到單片機方案原理復雜,而且調試較為繁瑣,所以本文采用后一種方案。 二、總體方案設計 1、設計思路 共設了9個用戶輸入鍵,其中只有4個是有效的密碼按鍵,其它的都是干擾按鍵,若按下干擾鍵,鍵盤輸入電路自動清零,原先輸入的密碼無效,需要重新輸入;如果用戶輸入密碼的時間超過40秒(一般情況下,用戶不會超過40秒,若用戶覺得不便,還可以修改)電路將報警80秒,若電路連續報警三次,電路將鎖定鍵盤5分鐘,防止他人的非法操作。 2、總體方框圖 三、設計原理分析電路由兩大部分組成:密碼鎖電路和備用電源(UPS),其中設置UPS電源是為了防止因為停電 造成的密碼鎖電路失效,使用戶免遭麻煩。 密碼鎖電路包含:鍵盤輸入、密碼修改、密碼檢測、開鎖電路、執行電路、報警電路、鍵盤輸 次數鎖定電路。 1、鍵盤輸入、密碼修改、密碼檢測、開鎖及執行電路 . 其電路如下圖3-1-1所示: 圖3-1-1鍵盤輸入、密碼修改、密碼檢測、開鎖、執行電路 開關K1~K9是用戶的輸入密碼的鍵盤,用戶可以通過開關輸入密碼,開關兩端的電容是為了提高開關速度,電路先自動將IC1~IC4清零,由報警電路送來的清零信號經C25送到T11基極,使T11導通,其集電極輸出低電平,送往IC1~IC4,實現清零。 密碼修改電路由雙刀雙擲開關S1~S4組成(如圖3-1-2所示), 它是利用開關切換的原理實現密碼的修改。例如要設定密碼為1458,可以撥動開關S1向左,S2向右,S3向左,S4向右,即可實現密碼的修改,由于輸入的密碼要經過S1~S4的選擇,也就實現了密碼的校驗。本電路有16組的密碼可供修改。 圖3-1-2密碼修改電路 由兩塊74LS112(雙JK觸發器,包含IC1~IC4)組成密碼檢測電路。由于IC1處于計數狀態,當用戶按下第一個正確的密碼后,CLK端出現了一個負的下降沿,IC1計數,Q端輸出為高電平,用戶依次按下有效的密碼,IC2~IC3也依次輸出高電平,送入與門IC5,使其輸出開鎖的高電平信號送往IC13的2腳,執行電路動作,實現開鎖。 執行電路是由一塊555單穩態電路(IC13),以及由T10、 T11組成的達林頓管構成。若IC13的2腳輸入一高電平,則3腳輸出高電平,使T10導通,T11導通,電磁閥開啟,實現開門,同時T10集電極上接的D5(綠色發光二極管)發亮,表示開門,20秒后,555電路狀態翻轉,電磁閥停止工作,以節電。其中電磁閥并聯的電容C24使為了提高電磁閥的力矩。 2、報警電路 報警電路實現的功能是:當輸入密碼的時間超過40秒(一般情況下用戶輸入不會超過),電路報警80秒,防止他人惡意開鎖。 電路包含兩大部分,2分鐘延時和40秒延時電路。其工作原理是當用戶開始輸入密碼時,電路開始2分鐘計時,超出40秒,電路開始80秒的報警。圖如下3-2-1所示 圖3-2-1報警電路 有人走近門時,觸摸了TP端(TP端固定在鍵盤上,其靈敏度非常高,保證電路可靠的觸發),由于人體自身帶的電,使IC10的2腳出現低電平,使IC10的狀態發生翻轉,其3腳輸出高電平,T5導通(可以通過R12控制T1的基極電流),其集電極接的黃色發光二極管D3發光,表示現在電子鎖處于待命狀態,T6截止,C4開始通過R14充電(充電時間是40秒,此時為用戶輸入密碼的時間,即用戶輸入密碼的時間不能超過40秒,否則電路就開始報警, 由于用戶經常輸入密碼,而且知道密碼,一般輸入密碼的時間不會超過40秒),IC2開始進入延時40秒的狀態。 開始報警:當用戶輸入的密碼不正確或輸入密碼的時間超過40秒,IC11的2腳電位隨著C4的充電而下降,當電位下降到1/3Vcc時(即40秒延時結束時候),3腳變成高電位(延時時是低電平),通過R15使(R15的作用是為了限制T7的導通電流防止電流過大燒毀三極管)T7導通,其集電極上面接的紅色發光二極管D4發亮,表示當前處于報警狀態,T8也隨之而導通,使蜂鳴器發聲,令賊人生怯,實現報警. 停止報警:當達到了80秒的報警時間,IC10的6,7腳接的電容C5放電結束,IC10的3腳變成低電平,T5截止,T6導通,強制使強制電路處于穩態,IC11的3腳輸出低電平,使T7,T8截止,蜂鳴器停止報警;或者用戶輸入的密碼正確,則有開鎖電路中的T10集電極輸出清除報警信號,送至T12(PNP),T12導通,強制使T7基極至低電位,解除報警信號。 3、報警次數檢測及鎖定電路 若用戶操作連續失誤超過3次,電路將鎖定5分鐘。其工作原理如下:當電路報警的次數超過3次,由IC9(74161)構成的3位計數器將產生進位,通過IC7,輸出清零信號送往74161的清零端,以實現重新計數。經過IC8(與門),送到IC12(555)的2腳,使3腳產生5分鐘的高電平鎖定脈沖(其脈沖可由公式T=1.1RC計算得出),經T9倒相,送IC6輸入端,使IC6輸出低電平,使IC13不能開鎖,到鎖定的目的。電路圖如下3-3-1所示: 圖3-3-1報警次數檢測及鎖定電路 4、備用電源電路 為了防止停電情況的發生,本電路后備了UPS電源,它包括市電供電電路,停電檢測電路,電子開關切換電路,蓄電池充電電路和蓄電池組成。其電路圖如下3-4-1所示: 
220V市電通過變壓器B降壓成12V的交流電,再經過整流橋整流,7805穩壓到5V送往電子切換電路,由于本電路功耗較少,所以選用10W的小型變壓器。
圖3-4-1電源電路 由R8,R9,R6,R7及IC14構成電壓比較器,正常情況下,V+<V- IC14輸出高電平,繼電器的常閉觸點和市電相連;當市電斷開,V+>V- IC14輸出高電平,由T3,T4構成的達林頓管使繼電器J開啟,將其常開觸電將蓄電池和電路相連,實現市電和蓄電池供電的切換,保證電子密碼鎖的正常工作(視電池容量而定持續時間)。其電路圖如下3-4-2所示: 圖3-4-2停電檢測及電子開關切換電路 T1,T2構成的蓄電池自動充電電路,它在電池充滿后自動停止充電,其中D1亮為正在充電,D2為工作指示。由R4,R5,T1構成電壓檢測電路,蓄電池電壓低,則T1,T2導通,實現對其充電;充滿后,T1,T2截止,停止充電,同時D1熄滅,電路中C4的作用是濾除干擾信號。其電路圖如3-4-3所示: 圖3-4-3 蓄電池自動充電電路 五、總結與體會
以上為實習期間所設計的電子密碼鎖電路,它經過多次修改和整理,以是一個比較不錯的設計,可以滿足人們的基本要求,但因為水平有限,此電路中也存在一定的問題,譬如說電路的密碼不能遺忘,一旦遺忘,就很難打開,這可以通過增加電路解決,但過于復雜,本次設計未其中;用開關作74LS112的CLK脈沖,不是很穩定,可以調換其它高速開關或計數脈沖;電路密碼只有16種可供修改,但由于他人不知道密碼的位數,而且還要求在規定的時間內按一定的順序開鎖,所以他人開鎖的幾率很小;電路中未加顯示電路,但可通過其它數字模塊實現這一功能。這需要一段時間的進一步改進,如果有好的意見,希望老師給以支持。 通過這三周的學習,我感覺有很大的收獲:首先,通過學習使自己對課本上的知識可以應用于實際,使的理論與實際相結合,加深自己對課本知識的更好理解,同時實習也段練了我個人的動手能力:能夠充分利用圖書館去查閱資料,增加了許多課本以外的知識。能對protel 99、和EWB等仿真軟件操作,能達到學以致用。對我們學生來說,理論與實際同樣重要,這是我們以后在工作中說明自己能力的一個重要標準。 在實習中,我感受到了老師對學生的那種悔人不卷的精神,每天的固定時間,老師都來給我們指導,使我們少走彎路,順利完成實習任務,請允許我向你們致意崇高的敬意,感謝你們,老師!
單片機源程序如下: - #include<reg52.h>
- #include<math.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define data_IO P2
- sbit rs=P3^0; //指令和數據寄存器 “1是數據,” “0是指令”
- sbit rw=P3^1;//讀寫控制,“1讀” “0寫”
- sbit e=P3^2; //片選信號
- sbit p=P2^7;
- sbit deng=P3^3;///響音樂的端口
- sbit md=P3^4;///修改密碼時的燈
- uchar pwflag;//密碼是否正確的標志位
- uchar count;//
- uchar gg=0 ;//只有輸入正確的密碼才能修改密碼
- uchar cs=3 ;//輸入密碼的錯誤次數
- uchar m[]={1,2,3,4,5,6}; ///初始密碼
- static uchar mbuf[6];///輸入的密碼
- char d[32]={' ','I','M','P','O','R','T',' ','C','I','P','H','E','R',':',' ',
- ' ',' ','_',' ',' ','_','_','_','_','_','_',' ',' ',' ',' ',' '};//輸入密碼
- code char ks[32]={'C','O','N','G','R','A','T','U','L','A','T','E',' ','Y','O','U',
- ' ','O','P','E','N','I','N','G',' ',' ','L','O','C','K','!',' '};////開鎖
- code char cw[32]={' ','C','I','P','H','E','R',' ',' ','E','R','R','O','R',' ',' ',
- '~','~','~','~','~','~','~','~','~','~','~','~','~','~','~','~' };////錯誤
- code char xc[32]={' ',' ','A','M','E','N','D',' ','S','U','C','C','E','E','D',' ',
- ' ',' ',' ',' ',' ','!','!','!','!','!','!',' ',' ',' ',' ',' '};//修改成功
- code char xg[32]={' ','A','M','E','N','D',' ',' ','C','I','P','H','E','R',':',' ',
- ' ',' ',' ',' ',' ','_','_','_','_','_','_',' ',' ',' ',' ',' '};///修改密碼*/
- void yanshi(uint n)///////////////延時函數///////////////////////////////////
- {
- uint i;
- for(i=0;i<n;i++){};
- }
- void delay(uint n)///////////////延時函數///////////////////////////////////
- {
- uint i,j;
- for(i=0;i<1000;i++)
- {for(j=0;j<n;j++){}}
-
- }
- void busy() ////////////////////判斷是否忙////////////////////////////////////////
- {data_IO=0xff;
- rs=0; //寫指令 ////////////////////
- rw=1; //表示讀狀態 // 三個的狀態表示 //
- e=1; //下降延// // 判忙狀態 //
- while(!p); ////////////////////
- // e=0;
- }
- void xiezl(uchar shuju) /////////////////////*寫指令*/////////////////////////////
- {
- busy();/*yanshi(6500);*/
- data_IO=shuju;
- rs=0; //寫指令 ////////////////////
- rw=0; //表示寫狀態 // 三個的狀態表示 //
- e=1; //下降延// // 寫指令 //
- e=0; ///////// ////////////////////
- }
- void w_dat(uint n)//////////////////寫數據//////////////////////////
- {
- busy(); /*yanshi(6500) ;*/
- data_IO=n;
- rs=1; //寫數據 ////////////////////
- rw=0; //表示寫狀態 // 三個的狀態表示 //
- e=1; //下降延// //寫數據 //
- e=0; ///////// ////////////////////
- // return;
- }
- void xianshi(uchar js[]) //////////////////顯示函數///////////////////////////////
- {
- uchar h,v;
- xiezl(0x01); //清屏顯示
- yanshi(2000) ;
- xiezl(0x80); // DDRAM地址的設置
- for(h=0;h<16;h++)
- {w_dat(js[h]); ///n表示有寫幾位數據
- yanshi(100) ;
- }
- xiezl(0xc0);//換行
- for(v=(16);v<32;v++)
- {w_dat(js[v]); ///n表示有寫幾位數據
- yanshi(100) ;
- }
- }
- void chushihua(void)///////////////////*液晶模塊初始化*/
- { uchar i;
- rs=0; //寫指令
- rw=0; //表示寫狀態
- e=0; //使能
- for(i=0;i<3;i++)
- {
- xiezl(0x38); //功能設置,8位,一行顯示,5*7點陣
- yanshi(1000);
- }
- xiezl(0x38); //兩行顯示
- xiezl(0x0f); //顯示開關控制位
- xiezl(0x18); //移位控制,光標和顯示一起左移
- xiezl(0x06); //設置輸入模式
- xiezl(0x01); //清屏顯示
- xiezl(0x80); // DDRAM地址的設置
- }
- bit pwcmp(void)
- {
- bit flag;
- uchar i;
- for (i=0;i<6;i++)
- {
- if (m[i]==mbuf[i]) flag = 1; //*密碼正確*/
- else { flag = 0; i=6; } //*密碼錯誤*/
- }
- return(flag);
- }
- void gb(void)/////////轉移光標
- { uchar c;
- xiezl(0xc0);//換行
- yanshi(3000) ;
- for(c=0;c<5;c++)
- {w_dat(' ');///n表示有寫幾位數據
- yanshi(2000) ;
- }
- }
- uchar getkey(void)///得到鍵值
- { uchar h,l,k;
- while(P1!=0x0f)
- {
- h=P1&0x0f;
- P1=0xf0;
- l=P1&0xf0;
- k=h|l;
- return(k);
- }
- }
- void diaoyong(uchar i)///////////調用各鍵的函數//////輸入密碼
- { uchar lq;
- switch(i)
- {
- case 0x7e: if (count<6) { mbuf[count]=1; count++; w_dat('*');} break; // 01111110 1
- case 0xbe: if (count<6) { mbuf[count]=2; count++; w_dat('*');} break; // 10111110 2
- case 0xde: if (count<6) { mbuf[count]=3; count++; w_dat('*');} break; // 11011110 3
- case 0xee: if (count<6) { mbuf[count]=4; count++; w_dat('*');} break; // 11101110 4
- case 0x7d: if (count<6) { mbuf[count]=5; count++; w_dat('*');} break; // 01111101 5
- case 0xbd: if (count<6) { mbuf[count]=6; count++; w_dat('*');} break; // 10111101 6
- case 0xdd: if (count<6) { mbuf[count]=7; count++; w_dat('*');} break; // 11011101 7
- case 0xed: if (count<6) { mbuf[count]=8; count++; w_dat('*');} break; // 11101101 8
- case 0x7b: if (count<6) { mbuf[count]=9; count++; w_dat('*');} break; // 01111011 9
- case 0xbb: if (count<6) { mbuf[count]=0; count++; w_dat('*');} break; // 10111011 0
- case 0xdb: if (count==6) { pwflag = pwcmp();} else pwflag = 0;// 只有輸入6個密碼后按確認鍵才作密碼比較
- if(pwflag) {deng=0; xianshi(ks);gg=1; } else { cs--;deng=1; xianshi(cw); delay(200); xianshi(d);gb();count = 0; }
- break; // 11011011 a
- case 0xeb: count = 0;deng=1; xianshi(d); gb();gg=0; /*取消鍵*/
- break; // 11101011 b
- case 0x77: if(gg==1){ count=0;xianshi(xg); gb();} //修該密碼
- break; // 01110111 c
-
- case 0xb7: if((count==6)&&(gg==1)) { count=0;
- for (lq=0;lq<6;lq++){ m[lq]=mbuf[lq]; yanshi(10000);} md=1; xianshi(xc); delay(200); xianshi(d);yanshi(2000);gb();yanshi(200);gg=0;}//保存密碼
- break; // 10110111 d
- /*case 0xd7: sr[jm]='e'; break; // 11010111 e
- case 0xe7: sr[jm]='f'; break; // 11100111 f */
- default: break;
- }
-
- }
- void main(void)
- {uchar key;
- chushihua();
- xianshi(d);//顯示函數
- gb(); //移光標到第二行第六位
- while(cs)
- {
- P1=0x0f;
- if(P1!=0x0f)
- {
- yanshi(20);
- key=getkey();
- md=0;
- diaoyong(key);
- yanshi(20000);
- md=1;
- }
- }while(1);
- }
復制代碼
所有資料51hei提供下載:
八位數字密碼鎖資料.rar
(829.8 KB, 下載次數: 50)
2018-9-17 10:15 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|