|
這是我和同學(xué)一起制作基于51單片機(jī)的電子密碼鎖
用了3天時(shí)間才做完
文件里包含電子密碼鎖的源代碼和proteus仿真工程
難的是12864液晶顯示屏的接線方法
希望能幫到大家。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
無標(biāo)題.png (127.29 KB, 下載次數(shù): 82)
下載附件
2018-6-7 10:53 上傳
無標(biāo)題1.png (71.11 KB, 下載次數(shù): 74)
下載附件
2018-6-7 10:53 上傳
單片機(jī)源碼
- void init_main() {
- Lcd_Initial(); //對(duì)12864液晶顯示屏的初始化作用
- number = 0; //密碼存儲(chǔ),顯示位置,各方面清零
- P32 = 0; //進(jìn)行電磁鐵的初始關(guān)閉作用
- //顯示居民小區(qū):
- Lcd_Character_16X16( 1, 0, 0,data_shuju[0]);
- Lcd_Character_16X16( 1, 0, 16,data_shuju[1]);
- Lcd_Character_16X16( 1, 0, 32,data_shuju[2]);
- Lcd_Character_16X16( 1, 0, 48,data_shuju[3]);
- Lcd_Character_16X16( 1, 0, 64,data_shuju[4]);
- //顯示請(qǐng)輸入密碼:
- Lcd_Character_16X16( 1, 4, 0,data_shuju[5]);
- Lcd_Character_16X16( 1, 4, 16,data_shuju[6]);
- Lcd_Character_16X16( 1, 4, 32,data_shuju[7]);
- Lcd_Character_16X16( 1, 4, 48,data_shuju[8]);
- Lcd_Character_16X16( 1, 4, 64,data_shuju[9]);
- Lcd_Character_16X16( 1, 4, 80,data_shuju[10]);
- EA = 1; //總中斷打開
- EX1 = 1; //外部中斷1打開
- IT1 = 0; //外部中斷1工作方式,為低電平觸發(fā),IT1 = 1為下降沿觸發(fā)
- }
- /***************************************************************
- 函數(shù):主函數(shù)
- 功能:綜合各個(gè)函數(shù)的作用
- 注意:進(jìn)入主函數(shù)的時(shí)候,首先開啟初始化函數(shù)功能
- ***************************************************************/
- void main() {
- init_main(); //初始化主函數(shù)之前的所有操作
- while(1) { //進(jìn)入無限循環(huán)當(dāng)中
- key_scan(); //進(jìn)行鍵盤掃描函數(shù)
- }
- //clear_screen();
- }
- /*********************************************************************
- 函數(shù):鍵盤掃描函數(shù)
- 功能:集成了輸入密碼,顯示密碼個(gè)數(shù),清除密碼,
- 顯示密碼正確與錯(cuò)誤各種功能的集成函數(shù)
- 可稱為本函數(shù)的核心函數(shù)之一
- 鍵盤掃描方式:采用的翻轉(zhuǎn)法的鍵盤掃描,可以減少掃描代碼的數(shù)量
- 注意:本函數(shù)采用的是帶有返回值,不帶參數(shù)的函數(shù),所以在函數(shù)的
- 末尾一定要加入return keyscan;這個(gè)語句
- **********************************************************************/
- uchar key_scan()
- { //函數(shù)開始
- unsigned char k=0,p1_h=0,p1_l=0; //翻轉(zhuǎn)法的定義k為選擇分支作用,
- uchar Mark; //p1_h是選擇分支的高四位,p1_l是選擇分支的低四位
- char keyscan = 0, i = 0, j = 0; //記錄輸入的數(shù)據(jù)是數(shù)值,然后將其送入到shuru所代表的數(shù)組當(dāng)中去
- //i的作用記錄輸入的數(shù)據(jù)是否是6位數(shù)據(jù),防止超出所存儲(chǔ)的數(shù)組的空間
- //j的作用是用來加強(qiáng)功能鍵“確認(rèn)”的作用
- /*************************/
- P1 = 0xf0; //翻轉(zhuǎn)法先給P1口送數(shù)據(jù)
- k = P1; //然后賦值給k
- if(k != 0xf0) //判斷k是否是0xf0,如果不是,進(jìn)入內(nèi)部執(zhí)行相應(yīng)的程序
- {
- delayms(50); //延時(shí),防抖動(dòng)
- k = P1; //重新賦值
- if(k != 0xf0) //確定是否k不等于0xf0
- {
- number++; //number用于確定后面的在12864中的輸出位置和密碼存儲(chǔ)的位置
- p1_h = P1; //將P1的高四位賦值給p1_h
- P1 = 0x0f; //然后將0x0f賦值給P1口,翻轉(zhuǎn),確定低四位,賦值給p1_l
- p1_l = P1; //將P1口的值賦給p1_l(是小寫的字母l,不是數(shù)字1)
- k = p1_h|p1_l; //將高四位和低四位相或,然后賦值給k
- if (k == 0XE7) { //此判斷是為了確定是否是確認(rèn)按鍵,如果是,直接進(jìn)入確定程序
- j = 1;
- }
- if(number == 7) //此判斷是為了確定輸入的是否是6個(gè)數(shù)字,防止多輸入或者少輸入
- {
- if (k != 0XB7) { //這個(gè)是判斷是否是清除按鍵,
- number = 0;
- }
- }
- while (p1_l == P1); //這個(gè)是松手檢測(cè),防止長時(shí)間按在按鍵上,使輸入的數(shù)據(jù)重復(fù)
- if (number > 0||j == 1){
- switch(k) //條件分支語句
- {
- case 0XD7: keyscan = 0; Lcd_Character_16X8( 1, 6, 8*number,shuzi[0]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break; //keyscan是用來確定輸入的數(shù)據(jù),number是用來確定輸入的位置,shuru【】是用來放置密碼
- case 0XEE: keyscan = 1; Lcd_Character_16X8( 1, 6, 8*number,shuzi[1]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break; //keyscan是用來確定輸入的數(shù)據(jù),number是用來確定輸入的位置,shuru【】是用來放置密碼
- case 0XDE: keyscan = 2; Lcd_Character_16X8( 1, 6, 8*number,shuzi[2]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break; //keyscan是用來確定輸入的數(shù)據(jù),number是用來確定輸入的位置,shuru【】是用來放置密碼
- case 0XBE: keyscan = 3; Lcd_Character_16X8( 1, 6, 8*number,shuzi[3]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break; //keyscan是用來確定輸入的數(shù)據(jù),number是用來確定輸入的位置,shuru【】是用來放置密碼
- case 0XED: keyscan = 4; Lcd_Character_16X8( 1, 6, 8*number,shuzi[4]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break; //keyscan是用來確定輸入的數(shù)據(jù),number是用來確定輸入的位置,shuru【】是用來放置密碼
- case 0XDD: keyscan = 5; Lcd_Character_16X8( 1, 6, 8*number,shuzi[5]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break; //keyscan是用來確定輸入的數(shù)據(jù),number是用來確定輸入的位置,shuru【】是用來放置密碼
- case 0XBD: keyscan = 6; Lcd_Character_16X8( 1, 6, 8*number,shuzi[6]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break; //keyscan是用來確定輸入的數(shù)據(jù),number是用來確定輸入的位置,shuru【】是用來放置密碼
- case 0XEB: keyscan = 7; Lcd_Character_16X8( 1, 6, 8*number,shuzi[7]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break; //keyscan是用來確定輸入的數(shù)據(jù),number是用來確定輸入的位置,shuru【】是用來放置密碼
- case 0XDB: keyscan = 8; Lcd_Character_16X8( 1, 6, 8*number,shuzi[8]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break; //keyscan是用來確定輸入的數(shù)據(jù),number是用來確定輸入的位置,shuru【】是用來放置密碼
- case 0XBB: keyscan = 9; Lcd_Character_16X8( 1, 6, 8*number,shuzi[9]);delayms(1000);Lcd_Character_16X8( 1, 6, 8*number,shuzi[10]);shuru[number-1] = keyscan;break; //keyscan是用來確定輸入的數(shù)據(jù),number是用來確定輸入的位置,shuru【】是用來放置密碼
- case 0XE7: number = 0;
- for(i = 0; i < 6; i++)
- if (mima[i] != shuru[i])//對(duì)比原始密碼和輸入密碼
- {
- Mark++;
- //該if語句是用來判斷密碼Mark的錯(cuò)誤次數(shù),一旦達(dá)到3次,
- //就進(jìn)入到while循環(huán)當(dāng)中,并且P30口 = 0;蜂鳴器響,直至單片機(jī)復(fù)位才可消失
- if (3 == Mark) {
- P30 = 0;
- Lcd_Character_16X8( 1, 6, 8*1,disappear_char[0]);
- Lcd_Character_16X8( 1, 6, 8*2,disappear_char[0]);
- Lcd_Character_16X8( 1, 6, 8*3,disappear_char[0]);
- Lcd_Character_16X8( 1, 6, 8*4,disappear_char[0]);
- Lcd_Character_16X8( 1, 6, 8*5,disappear_char[0]);
- Lcd_Character_16X8( 1, 6, 8*6,disappear_char[0]);
- while(1);
- }
- //密碼錯(cuò)誤
- Lcd_Character_16X16( 1, 6, 64,mistake[0]);
- Lcd_Character_16X16( 1, 6, 80,mistake[1]);
- Lcd_Character_16X16( 1, 6, 96,mistake[2]);
- Lcd_Character_16X16( 1, 6, 112,mistake[3]);
- //消除密碼顯示
- delayms(1000);
- Lcd_Character_16X8( 1, 6, 8*1,disappear_char[0]);
- Lcd_Character_16X8( 1, 6, 8*2,disappear_char[0]);
- Lcd_Character_16X8( 1, 6, 8*3,disappear_char[0]);
- Lcd_Character_16X8( 1, 6, 8*4,disappear_char[0]);
- Lcd_Character_16X8( 1, 6, 8*5,disappear_char[0]);
- Lcd_Character_16X8( 1, 6, 8*6,disappear_char[0]);
- //消除密碼錯(cuò)誤漢字顯示
- Lcd_Character_16X16( 1, 6, 64,disappear_hanzi[0]);
- Lcd_Character_16X16( 1, 6, 80,disappear_hanzi[0]);
- Lcd_Character_16X16( 1, 6, 96,disappear_hanzi[0]);
- Lcd_Character_16X16( 1, 6, 112,disappear_hanzi[0]);
- break;
- }
- if(i == 6) //確認(rèn)密碼是否是正確的,通過i值
- {
- //輸入密碼正確
- Lcd_Character_16X16( 1, 6, 64,mistake[0]);
- Lcd_Character_16X16( 1, 6, 80,mistake[1]);
- Lcd_Character_16X16( 1, 6, 96,mistake[4]);
- Lcd_Character_16X16( 1, 6, 112,mistake[5]);
- delayms(1000); //延時(shí)
- //消除密碼顯示位
- Lcd_Character_16X8( 1, 6, 8*1,disappear_char[0]);
- Lcd_Character_16X8( 1, 6, 8*2,disappear_char[0]);
- Lcd_Character_16X8( 1, 6, 8*3,disappear_char[0]);
- Lcd_Character_16X8( 1, 6, 8*4,disappear_char[0]);
- Lcd_Character_16X8( 1, 6, 8*5,disappear_char[0]);
- Lcd_Character_16X8( 1, 6, 8*6,disappear_char[0]);
- //消除密碼正確顯示位
- Lcd_Character_16X16( 1, 6, 64,disappear_hanzi[0]);
- Lcd_Character_16X16( 1, 6, 80,disappear_hanzi[0]);
- Lcd_Character_16X16( 1, 6, 96,disappear_hanzi[0]);
- Lcd_Character_16X16( 1, 6, 112,disappear_hanzi[0]);
- P32 = 1;
- delayms(2000);
- P32 = 0;
- }
- break;
- case 0XB7: keyscan = 10;number--;Lcd_Character_16X8( 1, 6, 8*number,disappear_char[0]);number--;break;
- //這個(gè)是用來清除輸錯(cuò)的密碼,然后重新輸入新的位數(shù)的密碼
- default: break;
- /* case 0XE7: return(4);break;
- case 0XDE: return(5);break;
- case 0XDD: return(6);break;
- case 0XDB: return(7);break;
- case 0XD7: return(8);break;
- case 0XBE: return(9);break;
- case 0XBD: return(10);break;
- case 0XBB: return(11);break;
- case 0XB7: return(12);break;
- case 0X7E: return(13);break;
- case 0X7D: return(14);break;
- case 0X7B: return(15);break;
- case 0X77: return(16);break;
- default: return(0);break; */
- }
- }
-
- }
- }
- return keyscan; //函數(shù)返回的參數(shù)
復(fù)制代碼
全部資料51hei下載地址:
電子密碼鎖.rar
(100.15 KB, 下載次數(shù): 118)
2018-6-7 10:53 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|