找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4876|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

我的單片機(jī)電子密碼鎖仿真設(shè)計(jì),12864液晶顯示,源程序加詳細(xì)解析

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
這是我和同學(xué)一起制作基于51單片機(jī)的電子密碼鎖
用了3天時(shí)間才做完
文件里包含電子密碼鎖的源代碼和proteus仿真工程
難的是12864液晶顯示屏的接線方法
希望能幫到大家。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)

單片機(jī)源碼
  1. void init_main() {
  2.         Lcd_Initial();                            //對(duì)12864液晶顯示屏的初始化作用
  3.         number = 0;                                   //密碼存儲(chǔ),顯示位置,各方面清零
  4.         P32 = 0;                                   //進(jìn)行電磁鐵的初始關(guān)閉作用
  5.         //顯示居民小區(qū):
  6.         Lcd_Character_16X16( 1, 0, 0,data_shuju[0]);
  7.         Lcd_Character_16X16( 1, 0, 16,data_shuju[1]);
  8.         Lcd_Character_16X16( 1, 0, 32,data_shuju[2]);
  9.         Lcd_Character_16X16( 1, 0, 48,data_shuju[3]);
  10.         Lcd_Character_16X16( 1, 0, 64,data_shuju[4]);
  11.         //顯示請(qǐng)輸入密碼:
  12.         Lcd_Character_16X16( 1, 4, 0,data_shuju[5]);
  13.         Lcd_Character_16X16( 1, 4, 16,data_shuju[6]);
  14.         Lcd_Character_16X16( 1, 4, 32,data_shuju[7]);
  15.         Lcd_Character_16X16( 1, 4, 48,data_shuju[8]);
  16.         Lcd_Character_16X16( 1, 4, 64,data_shuju[9]);
  17.         Lcd_Character_16X16( 1, 4, 80,data_shuju[10]);

  18.         EA = 1;                                           //總中斷打開
  19.         EX1 = 1;                                   //外部中斷1打開
  20.         IT1 = 0;                                   //外部中斷1工作方式,為低電平觸發(fā),IT1 = 1為下降沿觸發(fā)
  21. }

  22. /***************************************************************
  23. 函數(shù):主函數(shù)
  24. 功能:綜合各個(gè)函數(shù)的作用
  25. 注意:進(jìn)入主函數(shù)的時(shí)候,首先開啟初始化函數(shù)功能
  26. ***************************************************************/
  27. void main() {
  28.         init_main();                           //初始化主函數(shù)之前的所有操作
  29.         while(1) {                                   //進(jìn)入無限循環(huán)當(dāng)中
  30.                 key_scan();                           //進(jìn)行鍵盤掃描函數(shù)
  31.         }
  32.         //clear_screen();
  33. }

  34. /*********************************************************************
  35. 函數(shù):鍵盤掃描函數(shù)
  36. 功能:集成了輸入密碼,顯示密碼個(gè)數(shù),清除密碼,
  37.           顯示密碼正確與錯(cuò)誤各種功能的集成函數(shù)
  38.           可稱為本函數(shù)的核心函數(shù)之一
  39. 鍵盤掃描方式:采用的翻轉(zhuǎn)法的鍵盤掃描,可以減少掃描代碼的數(shù)量
  40. 注意:本函數(shù)采用的是帶有返回值,不帶參數(shù)的函數(shù),所以在函數(shù)的
  41.           末尾一定要加入return keyscan;這個(gè)語句
  42. **********************************************************************/
  43. uchar key_scan()
  44. {                                                                                  //函數(shù)開始
  45.    unsigned char k=0,p1_h=0,p1_l=0;                  //翻轉(zhuǎn)法的定義k為選擇分支作用,
  46.    uchar Mark;                                                                                  //p1_h是選擇分支的高四位,p1_l是選擇分支的低四位
  47.    char keyscan = 0, i = 0, j = 0;                  //記錄輸入的數(shù)據(jù)是數(shù)值,然后將其送入到shuru所代表的數(shù)組當(dāng)中去
  48.                                                                                      //i的作用記錄輸入的數(shù)據(jù)是否是6位數(shù)據(jù),防止超出所存儲(chǔ)的數(shù)組的空間
  49.                                                                                   //j的作用是用來加強(qiáng)功能鍵“確認(rèn)”的作用
  50. /*************************/
  51.         P1 = 0xf0;                                  //翻轉(zhuǎn)法先給P1口送數(shù)據(jù)
  52.         k = P1;                                          //然后賦值給k
  53.         if(k != 0xf0)                                  //判斷k是否是0xf0,如果不是,進(jìn)入內(nèi)部執(zhí)行相應(yīng)的程序
  54.         {
  55.                 delayms(50);                          //延時(shí),防抖動(dòng)
  56.                 k = P1;                                  //重新賦值
  57.                 if(k != 0xf0)                          //確定是否k不等于0xf0
  58.                 {
  59.                         number++;                  //number用于確定后面的在12864中的輸出位置和密碼存儲(chǔ)的位置
  60.                         p1_h = P1;                  //將P1的高四位賦值給p1_h
  61.                         P1 = 0x0f;                  //然后將0x0f賦值給P1口,翻轉(zhuǎn),確定低四位,賦值給p1_l
  62.                         p1_l = P1;                  //將P1口的值賦給p1_l(是小寫的字母l,不是數(shù)字1)

  63.                         k = p1_h|p1_l;                  //將高四位和低四位相或,然后賦值給k
  64.                         if (k == 0XE7) {          //此判斷是為了確定是否是確認(rèn)按鍵,如果是,直接進(jìn)入確定程序
  65.                                 j = 1;        
  66.                         }

  67.                         if(number == 7)                  //此判斷是為了確定輸入的是否是6個(gè)數(shù)字,防止多輸入或者少輸入
  68.                         {
  69.                                 if (k != 0XB7) {  //這個(gè)是判斷是否是清除按鍵,
  70.                                         number = 0;
  71.                                 }
  72.                         }

  73.                         while (p1_l == P1);          //這個(gè)是松手檢測(cè),防止長時(shí)間按在按鍵上,使輸入的數(shù)據(jù)重復(fù)
  74.                         if (number > 0||j == 1){  
  75.                                 switch(k)          //條件分支語句
  76.                                 {
  77.                                         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【】是用來放置密碼
  78.                                         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【】是用來放置密碼
  79.                                         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【】是用來放置密碼
  80.                                         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【】是用來放置密碼
  81.                                         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【】是用來放置密碼
  82.                                         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【】是用來放置密碼
  83.                                         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【】是用來放置密碼
  84.                                         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【】是用來放置密碼
  85.                                         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【】是用來放置密碼
  86.                                         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【】是用來放置密碼
  87.                                         case 0XE7: number = 0;
  88.                                                            for(i = 0; i < 6; i++)
  89.                                                                         if (mima[i] != shuru[i])//對(duì)比原始密碼和輸入密碼
  90.                                                                         {
  91.                                                                                 Mark++;
  92.                                                                                 //該if語句是用來判斷密碼Mark的錯(cuò)誤次數(shù),一旦達(dá)到3次,
  93.                                                                                 //就進(jìn)入到while循環(huán)當(dāng)中,并且P30口 = 0;蜂鳴器響,直至單片機(jī)復(fù)位才可消失
  94.                                                                                 if (3 == Mark) {
  95.                                                                                         P30 = 0;
  96.                                                                                         Lcd_Character_16X8( 1, 6, 8*1,disappear_char[0]);
  97.                                                                                         Lcd_Character_16X8( 1, 6, 8*2,disappear_char[0]);
  98.                                                                                         Lcd_Character_16X8( 1, 6, 8*3,disappear_char[0]);
  99.                                                                                         Lcd_Character_16X8( 1, 6, 8*4,disappear_char[0]);
  100.                                                                                         Lcd_Character_16X8( 1, 6, 8*5,disappear_char[0]);
  101.                                                                                         Lcd_Character_16X8( 1, 6, 8*6,disappear_char[0]);
  102.                                                                                         while(1);
  103.                                                                                 }
  104.                                                                                 //密碼錯(cuò)誤
  105.                                                                                 Lcd_Character_16X16( 1, 6, 64,mistake[0]);
  106.                                                                                 Lcd_Character_16X16( 1, 6, 80,mistake[1]);
  107.                                                                                 Lcd_Character_16X16( 1, 6, 96,mistake[2]);
  108.                                                                                 Lcd_Character_16X16( 1, 6, 112,mistake[3]);
  109.                                                                                 //消除密碼顯示
  110.                                                                                 delayms(1000);
  111.                                                                                 Lcd_Character_16X8( 1, 6, 8*1,disappear_char[0]);
  112.                                                                                 Lcd_Character_16X8( 1, 6, 8*2,disappear_char[0]);
  113.                                                                                 Lcd_Character_16X8( 1, 6, 8*3,disappear_char[0]);
  114.                                                                                 Lcd_Character_16X8( 1, 6, 8*4,disappear_char[0]);
  115.                                                                                 Lcd_Character_16X8( 1, 6, 8*5,disappear_char[0]);
  116.                                                                                 Lcd_Character_16X8( 1, 6, 8*6,disappear_char[0]);
  117.                                                                                 //消除密碼錯(cuò)誤漢字顯示
  118.                                                                                 Lcd_Character_16X16( 1, 6, 64,disappear_hanzi[0]);
  119.                                                                                 Lcd_Character_16X16( 1, 6, 80,disappear_hanzi[0]);
  120.                                                                                 Lcd_Character_16X16( 1, 6, 96,disappear_hanzi[0]);
  121.                                                                                 Lcd_Character_16X16( 1, 6, 112,disappear_hanzi[0]);
  122.                                                                                 break;                                                                                                
  123.                                                                         }
  124.                                                                         if(i == 6)        //確認(rèn)密碼是否是正確的,通過i值
  125.                                                                         {
  126.                                                                                 //輸入密碼正確
  127.                                                                                 Lcd_Character_16X16( 1, 6, 64,mistake[0]);
  128.                                                                                 Lcd_Character_16X16( 1, 6, 80,mistake[1]);
  129.                                                                                 Lcd_Character_16X16( 1, 6, 96,mistake[4]);
  130.                                                                                 Lcd_Character_16X16( 1, 6, 112,mistake[5]);
  131.                                                                                 delayms(1000);                //延時(shí)
  132.                                                                                 //消除密碼顯示位
  133.                                                                                 Lcd_Character_16X8( 1, 6, 8*1,disappear_char[0]);
  134.                                                                                 Lcd_Character_16X8( 1, 6, 8*2,disappear_char[0]);
  135.                                                                                 Lcd_Character_16X8( 1, 6, 8*3,disappear_char[0]);
  136.                                                                                 Lcd_Character_16X8( 1, 6, 8*4,disappear_char[0]);
  137.                                                                                 Lcd_Character_16X8( 1, 6, 8*5,disappear_char[0]);
  138.                                                                                 Lcd_Character_16X8( 1, 6, 8*6,disappear_char[0]);
  139.                                                                                 //消除密碼正確顯示位
  140.                                                                                 Lcd_Character_16X16( 1, 6, 64,disappear_hanzi[0]);
  141.                                                                                 Lcd_Character_16X16( 1, 6, 80,disappear_hanzi[0]);
  142.                                                                                 Lcd_Character_16X16( 1, 6, 96,disappear_hanzi[0]);
  143.                                                                                 Lcd_Character_16X16( 1, 6, 112,disappear_hanzi[0]);
  144.                                                                                 P32 = 1;
  145.                                                                                 delayms(2000);
  146.                                                                                 P32 = 0;
  147.                                                                         }
  148.                                                                 break;         
  149.                                         case 0XB7: keyscan = 10;number--;Lcd_Character_16X8( 1, 6, 8*number,disappear_char[0]);number--;break;
  150.                                         //這個(gè)是用來清除輸錯(cuò)的密碼,然后重新輸入新的位數(shù)的密碼
  151.                                         default: break;
  152.                                 /*        case 0XE7: return(4);break;
  153.                                         case 0XDE: return(5);break;
  154.                                         case 0XDD: return(6);break;
  155.                                         case 0XDB: return(7);break;
  156.                                         case 0XD7: return(8);break;
  157.                                         case 0XBE: return(9);break;
  158.                                         case 0XBD: return(10);break;
  159.                                         case 0XBB: return(11);break;
  160.                                         case 0XB7: return(12);break;
  161.                                         case 0X7E: return(13);break;
  162.                                         case 0X7D: return(14);break;
  163.                                         case 0X7B: return(15);break;
  164.                                         case 0X77: return(16);break;
  165.                                         default:  return(0);break;        */
  166.                                 }
  167.                         }
  168.                         
  169.                 }
  170.         }
  171.         return keyscan;                                //函數(shù)返回的參數(shù)
復(fù)制代碼

全部資料51hei下載地址:
電子密碼鎖.rar (100.15 KB, 下載次數(shù): 118)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:362913 發(fā)表于 2018-7-2 11:26 | 只看該作者
兄弟,可不可以把你的發(fā)給我qq一份 我沒有黑幣    932939991@qq.com    謝謝大佬   
回復(fù)

使用道具 舉報(bào)

板凳
ID:393296 發(fā)表于 2018-9-4 16:40 | 只看該作者
為什么用的和您一樣的軟件  仿真我卻打不開?
回復(fù)

使用道具 舉報(bào)

地板
ID:440534 發(fā)表于 2018-12-12 22:07 | 只看該作者
這個(gè)初始密碼是什么
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表