一、系統方案
隨著人們生活水平的提高,如何實現家庭防盜這一問題也變的尤其的突出,傳統的機械鎖由于其構造的簡單,被撬的事件屢見不鮮,電子鎖由于其保密性高,使用靈活性好,安全系數高,受到了廣大用戶的喜愛。鎖是置于可啟閉的器物上,用以關住某個確定的空間范圍或某種器具的,必須以鑰匙或暗碼打開的扣件。鎖具發展到現在已有若干年的歷史了,人們對它的結構、機理也研究得很透徹,因此,不用鑰匙就能打開的方法和工具也層出不窮。現代人類文明里,由于各種矛盾沖突十分劇烈,人們的思想道德觀念,價值觀念,文化修養水平等差異,人們中良莠不齊,善良的人們能夠自覺規范自已的行為,“非禮不為”,雖無鑰匙亦不會亂闖。然而,那些毫無道德觀念的盜賊卻想方設法利用高科技手段撬門開鎖,使廣大居民防不勝防。 為什么會出現這種情況呢?因為傳統鎖具都存在致命的弱點:
第一、 鎖芯采用常見的銅、鋁、鋅等材料,抵抗不了強力破壞;
第二、 鎖具制作工藝,技術落后,無法阻止技術手段的開啟。
目前,市場上很多國內外的鎖具,實際上都不具備真正的防盜功能。在慣偷面前,兩根鋼絲或幾件簡單的工具就可以把這些鎖打開,有的慣偷甚至公開揚言:“沒有我打不開的鎖!逼鋵崳皇撬麄兌喔呙,而是一般鎖具技術原理太過簡單。面對這一殘酷的現狀,新時代提出了鎖具必須革命的迫切的要求。 (1).如何通過指紋識別模塊對指紋的采集,識別,存儲。 (2).如何控制LCD12864顯示需要顯示的內容。 (3).如何控制AT24C02進行存儲信息。 (4).設計程序算法正確的讀取矩陣鍵盤,獲取所按下的按鍵位置。
二、硬件設計 原理圖如下:
三、單片機軟件設計 1、首先是系統初始化: /********************************************************* 函數名稱:void T2_init() 函數作用:定時器2初始化函數 參數說明: *********************************************************/ void T2_init() { RCAP2H=(65536-50000)/256; RCAP2L=(65536-50000)%256;//自動重裝 TH2=RCAP2H; TL2=RCAP2L; //定時器2賦初值 EA=1; //開總中斷 ET2=1; //定時器T2中斷允許 TR2=0; //關閉定時器2 } 2、中斷服務程序 /********************************************************* 函數名稱:void T2_interrupt(void) interrupt 5 函數作用:定時器2中斷處理函數 參數說明:定時50MS中斷一次 *********************************************************/ void T2_interrupt(void) interrupt 5 { TF2=0; //清除定時器2溢出標志位
T2_num++; //計數變量+1 if(T2_num==200)//200*50ms=10S定時完成 { T2_num=0; //清0計數變量 jdq=1; //關閉繼電器,電磁鎖關閉 TR2=0; //定時器關閉 } } 3、按鍵檢測程序 #include<reg52.h> #define uchar unsigned char #define uint unsigned int
/*****************矩陣鍵盤引腳定義*******************/ #define Key P1
bit key_f;//有按鍵按下標志 /*****************矩陣鍵盤函數聲明*******************/ uchar jiema(unsigned char key); //解碼函數,輸入按鍵編碼,返回按鍵位置 void key_delay(); //延時函數 uchar keycan(void); //按鍵查詢函數,返回矩陣鍵盤位置 /******************************************************** 函數名稱:uchar jiema(unsigned char key) 函數作用:轉換按鍵碼為1~16的數字 參數說明:返回按下的按鍵位置 *******************************************************/ uchar jiema(uchar key) { uchar n; switch(key) { case 0x11: n= 13; break; case 0x21: n= 0; break; case 0x41: n= 14; break; case 0x81: n= 15; break; case 0x12: n= 7; break; case 0x22: n= 8; break; case 0x42: n= 9; break; case 0x82: n= 12; break; case 0x14: n= 4; break; case 0x24: n= 5; break; case 0x44: n= 6; break; case 0x84: n= 11; break; case 0x18: n= 1; break; case 0x28: n= 2; break; case 0x48: n= 3; break; case 0x88: n= 10; break; default: break; } key_f=1; return n; }
/******************************************************** 函數名稱:void key_delay() 函數作用:延時函數 參數說明: ********************************************************/ void key_delay() //延時子程序 { uchar n, m; for (n = 100; n > 0; n--) for (m = 300; m > 0; m--); }
/******************************************************** 函數名稱:uchar keycan(void) 函數作用:進行按鍵掃描 參數說明:返回按鍵值,=0時表示沒有按鍵按下 ********************************************************/ uchar keycan(void) { uchar rcode, ccode; Key = 0xF0; // 發全0行掃描碼,列線輸入 if((Key&0xF0) != 0xF0) // 若有鍵按下 { key_delay();// 延時去抖動 if((Key&0xF0) != 0xF0) { rcode = 0xFE; // 逐行掃描初值 while((rcode&0x10) != 0) { Key = rcode; // 輸出行掃描碼 if((Key&0xF0) != 0xF0) // 本行有鍵按下 { ccode = (Key&0xF0)|0x0F; do{;} while((Key&0xF0) != 0xF0); //等待鍵釋放 return jiema((~rcode) + (~ccode)); // 返回鍵編碼 } else rcode = (rcode<<1)|0x01; // 行掃描碼左移一位 } } } return 0; // 無鍵按下,返回值為0 } 4、核心算法程序 while(1) { i++; a=keycan(); //矩陣鍵盤檢測 chuli(); //矩陣鍵盤處理
if(mode==1) display_guanli(); //顯示管理界面 else if(mode==2) //錄入指紋 { if(zhiwen_f==1) cunchu(); //錄入指紋 } else if(mode==3) //注銷指紋 { if(zhiwen_f==1) shanchu(); //注銷指紋 } else if(mode==0&&in_f==0)//正常解鎖界面 { if(i>=150) { i=0; xunzhiwen();//指紋解鎖 } } } 四、proteus仿真設計 Proteus軟件是一款應用比較廣泛的工具,它可以在沒有硬件平臺的基礎上通過自身的軟件仿真出硬件平臺的運行情況,這樣就可以通過軟件仿真來驗證我們設計的方案有沒有問題,如果有問題,可以重新選擇器件,連接器件,直到達到我們設定的目的,避免我們搭建實物的時候,如果當初選擇的方案有問題,我們器件都已經焊接好了,再去卸載下去,再去焊接新的方案的器件,測試,這樣會浪費人力和物力,也給開發者帶來一定困惑,Proteus仿真軟件就很好的解決這個問題,我們在設計之初,就使用該軟件進行模擬仿真,測試,選擇滿足我們設計的最優方案。最后根據測試沒問題的仿真圖紙,焊接實物,調試,最終完成本設計的作品。
|