久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8185|回復(fù): 19
收起左側(cè)

單片機密碼鎖帶參考論文 程序+仿真圖+原理圖+PCB

  [復(fù)制鏈接]
ID:113471 發(fā)表于 2016-4-16 22:17 | 顯示全部樓層 |閱讀模式
單片機密碼鎖帶參考課程設(shè)計論文  單片機程序+proteus仿真圖+原理圖+PCB

本次設(shè)計使用AT89S52實現(xiàn)一基于單片機的電子密碼鎖。本系統(tǒng)由單片機系統(tǒng)、矩陣鍵盤、LCD顯示和報警系統(tǒng)組成。系統(tǒng)能完成開鎖、超次鎖定、修改用戶密碼基本的密碼鎖的功能。本系統(tǒng)成本低廉,功能實用。

1、密碼顯示
             為了幫助用戶確認(rèn)是否有鍵按下,特在電路中設(shè)置了模擬顯示電路;而為了防止密碼外泄;顯示時,并不是顯示用戶按下的數(shù)字符號,而是以一個特定的字母符號提醒用戶是否有鍵按下。有鍵按下,就會顯示出字符“*”,沒鍵按下,則不會顯示字符。
2、密碼更改
            設(shè)置6位密碼,密碼通過鍵盤輸入,當(dāng)按下更改密碼的功能鍵時,要先輸入原來的密碼,正確無誤后,再輸入新的密碼,最后按下確認(rèn)鍵即可。
3、本機鍵開鎖
            當(dāng)用戶鍵入正確密碼后,在按確認(rèn)鍵,便會自動開鎖。但用戶鍵入密碼時應(yīng)注意:數(shù)字與數(shù)字之間的間隔時間為30秒,例如密碼為086541,當(dāng)鍵入第一個數(shù)字0后應(yīng)在30秒內(nèi)鍵入第二個數(shù)字8,否則就會視為無效。如果鍵入完密碼后不按確認(rèn)鍵系統(tǒng)會當(dāng)做放棄開鎖處理。

單片機密碼鎖proteus仿真圖文件:
0.png

課程設(shè)計論文里面的電路圖:

1.png

單片機密碼鎖ppt文件:
3.png

課程設(shè)計論文目錄:
目  錄
1 前言    4
1.1 數(shù)字隨機鍵盤的來源和意義    4
1.2單片機概述    4
2 數(shù)字密碼鎖總體設(shè)計說明    5
2.1 總體開發(fā)計劃    5
2.1.1 基本功能    5
2.1.2 擴展功能    5
2.2 總體設(shè)計方案    5
2.2.1 單片機的選擇    5
2.2.2 鍵盤的選擇    6
2.2.3 顯示模塊的選擇    6
2.2.4 報警模塊的選擇    6
3 硬件設(shè)計說明    7
3.1 硬件總體設(shè)計方案    7
3.1.1 硬件功能模塊的劃分    7
3.1.2 硬件設(shè)計目標(biāo)    7
3.2 硬件單元設(shè)計    7
3.2.1 主控電路    7
3.2.2 顯示電路    8
3.2.4 鍵盤電路    10
3.2.5 報警電路    10
4 軟件設(shè)計說明    11
4.1 軟件設(shè)計總體方案    12
4.1.1 軟件設(shè)計目標(biāo)    12
4.1.2 軟件功能模塊劃分    12
4.2 軟件設(shè)計    13
4.2.1 主函數(shù)的程序設(shè)計    13
4.2.2 系統(tǒng)初始化的程序設(shè)計    14
5 系統(tǒng)調(diào)試    16

6 總結(jié)    19
參考文獻(xiàn)    20
附件    21

主程序(完整代碼請下載附件):
  1. /***********天馬電子設(shè)計*******************/
  2. #include<AT89X52.h>
  3. #include "液晶.h"
  4. #include "stdlib.h"
  5. #include<Function.h>
  6. #include "fun_char.h"
  7. #define uchar unsigned char
  8. #define uint unsigned int
  9. sbit beep=P2^4;         //警鈴
  10. uint TIM=0;
  11. uchar mydata[6]; //輸入密碼
  12. uchar testdata[6];//存儲器保存的密碼
  13. uchar ok_stop=0;
  14. struct key
  15. {
  16.   uchar time; //按鍵時間控制
  17.   uchar down; //輸入次數(shù)
  18.   uchar open; //鍵盤打開
  19.   uchar close;//鍵盤關(guān)閉
  20.   uchar setnew;//設(shè)置新的密碼
  21.   uchar error; //輸入密碼錯誤次數(shù)
  22.   uchar reset_num; //設(shè)置密碼次數(shù)記錄(輸入新的密碼,需要輸入兩次,在第二次輸入后開始比較)
  23.   uchar reset; //設(shè)置新的密碼標(biāo)志位
  24.   uchar disclose;  //關(guān)閉顯示
  25.   uint time_n;         //定時器中斷次數(shù)
  26. }key={0,0,0,0,0,0,0,0,0,0};
  27. unsigned char code KEYTAB[16] ={0x7e,0xBE,0XBD,0xBB,0xDE,0xDD,0xDB,0xEE,0xED,0xEB,0x7D,0x7B,0x77,0xb7,0xd7,0xe7};
  28. void clear_all();//
  29. /*******************************************
  30. *函數(shù)名稱:delay(uint t)延時函數(shù)
  31. *函數(shù)作用:延時1ms左右
  32. *
  33. *********************************************/
  34. void delay(uint t)
  35. {
  36.    uint i,j;
  37.    for(i=0;i<t;i++)
  38.       for(j=0;j<110;j++);
  39. }
  40. /*******************************************
  41. *函數(shù)名稱:check_code( )
  42. *函數(shù)作用:1、對比輸入的密碼和存儲器中的密碼是否一致,一致
  43.             則開鎖。不一致,則記錄錯誤次數(shù),如果次數(shù)大于3次,
  44.                         則鎖鍵盤,并報警
  45.             2、當(dāng)設(shè)置新的密碼時,檢測兩次輸入的密碼是否一致
  46.                         一致則保存,

  47. *********************************************/
  48. void check_code(void)
  49. {
  50.      unsigned char i=0;
  51.          unsigned char dif_label=0;
  52.          if(key.setnew==0||key.reset_num==1) //正處于開鎖狀態(tài)時輸入6位完成或者是設(shè)置新的密碼時第二次輸入完成
  53.          {
  54.                   for(i=0;i<6;i++) //對這六位和實際的密碼進(jìn)行比較
  55.                   {
  56.                       if((mydata[i]!=testdata[i]))//如果有一位不同
  57.                           {
  58.                              if(key.setnew==0)        //如果現(xiàn)在正處于開鎖狀態(tài)
  59.                                    {
  60.                                     key.error++;//輸入密碼錯誤次數(shù)記錄
  61.                                         if(key.error>2)//如果大于2次
  62.                                         {
  63.                                            if(key.open==0)//如果現(xiàn)在沒有鎖鍵盤
  64.                                           {
  65.                                             lock_char();   //顯示KEY IS LOCK
  66.                                             key.open=1;           //鎖鍵盤
  67.                                             TR1=1;                  //定時器啟動
  68.                                                 key.disclose=1;        //關(guān)閉顯示
  69.                                                 key.error=0;   //錯誤清楚
  70.                                                 key.time=0;          //按鍵時間清零
  71.                                           }                                       
  72.                                         }
  73.                                         else                           //如果沒有超過2次
  74.                                         {
  75.                                             error_char(); //顯示輸入密碼錯誤
  76.                                                 beep=0;
  77.                                         delay(1500);//延時3s左右
  78.                                                 beep=1;
  79.                                         clear();// 變量清零                        
  80.                                         }                           
  81.                                 }
  82.                                 else                   //如果處于設(shè)置密碼狀態(tài),但是設(shè)置的密碼兩次輸入不一樣
  83.                                 {
  84.                                  
  85.                                   different_char();                //輸出it's different
  86.                                   delay(1000); //延時2s         

  87.                                   key.down=0;        //變量清除
  88.                                   reset_char();//重新輸入新的密碼,這個地方最好有個時間記錄
  89.                                   dif_label=1;                //
  90.                                   key.reset_num=0;// 提示重新輸入密碼                                                                    
  91.                                 }
  92.                                  break;//退出循環(huán)                                                                  
  93.                           }                  
  94.                   }
  95.            }
  96.         
  97.           if(key.setnew==1)//如果正輸入新的密碼
  98.           {
  99.                    if(key.reset_num==0)  //如果是第一次輸入新的密碼,則i=6,主要是為了下面好判斷
  100.                    {
  101.                            i=6;//自動保存了
  102.                  }
  103.          
  104.           }
  105.           if(i==6&&dif_label==0)   //如果輸入密碼正確,
  106.           {
  107.                   
  108.                 if(key.setnew==0)//輸入密碼正確
  109.                 {
  110.                              key.error=0;         //清零
  111.                           key.down=0;//復(fù)位
  112.                           ok_char();        //顯示PASSWORD OK
  113.                           key.disclose=1;//         停止顯示光標(biāo)閃爍
  114.                           key.reset=1;// 允許設(shè)置新的密碼
  115.                           ok_stop=1;//
  116.                           
  117.                 }
  118.                 else//如果現(xiàn)在正處于輸入新的密碼狀態(tài)
  119.                 {
  120.                
  121.                    if(key.reset_num==0)         //如果是第一次輸入
  122.                    {
  123.                            
  124.                           for(i=0;i<6;i++)        //保存密碼到testdata中
  125.                           {
  126.                                   testdata[i]=mydata[i];//保存數(shù)據(jù)
  127.                           }
  128.                           key.reset_num=1;//進(jìn)入第二次數(shù)據(jù)輸入
  129.                           key.down=0;//清零等待第二次數(shù)據(jù)輸入
  130.                           again_char();//現(xiàn)在INPUT AGAIN
  131.                                      }
  132.                    else
  133.                    {
  134.                             //設(shè)置密碼成功
  135.                                   ISendStr(AT24C02, 0 , &mydata[0],6); //保存密碼
  136.                                 delay(20);//
  137.                             ok_char();        //顯示PASSWORD OK
  138.                             delay(1000);//不知道什么時候復(fù)位啊
  139.                             key.reset_num=0;//這里要重新復(fù)位了
  140.                             key.down=0;
  141.                                 ok_stop=1;
  142.                                 key.disclose=1;//這個地方不再顯示了        
  143.                                           
  144.                    }               
  145.                 }           
  146.     }
  147. }
  148. /*******************************************
  149. *函數(shù)名稱:keyscan( ) 鍵盤掃描函數(shù)
  150. *函數(shù)作用: 1、掃描鍵盤,獲得鍵值
  151.              2、顯示輸入鍵值(*號),并保存
  152.              3、讀取功能按鍵,并執(zhí)行相應(yīng)的功能
  153. 按鍵的功能劃分如下:
  154.          |  7  |  8  |  9   |  修改密碼鍵            |
  155.                  ---------------------------------------
  156.                  |  4  |  5  |  6   |  重新輸入密碼鍵 |
  157.                  ---------------------------------------
  158.                  |  1  |  2  |  3   |  沒有使用       |
  159.                  ---------------------------------------
  160.                  |     |確         | 清        |
  161.                  |  0  |認(rèn)         | 除        |  沒有使用       |
  162.                  ---------------------------------------
  163. *********************************************/
  164. unsigned char keyscan(void)
  165. {
  166.      unsigned char i=0;
  167.           unsigned char redat;
  168.           unsigned char keynum=0;
  169.             P3=0XFF;
  170.       P1=0XF0;
  171.           redat=P3&0XF0;
  172.           if(redat!=0xF0)
  173.           {         
  174.                      delay(12);
  175.                    redat=P3&0XF0;//再次延時檢測
  176.                    if(redat!=0xF0)
  177.                    {
  178.                             keynum=redat;//獲得第四位
  179.                           P1=0XFF;//看來這個地方是必須的
  180.                          P3=0X0F;//開始讀取高四位
  181.                          delay(1);
  182.                          redat=P1&0X0F;
  183.                          keynum|=redat;
  184.                          for(i=0;i<16;i++)
  185.                          {
  186.                                  if(keynum==KEYTAB[i])
  187.                                 {
  188.                                    
  189.                                            if(key.down<6)//如果輸入次數(shù)小于6
  190.                                         {
  191.                                           if(i<10&&ok_stop==0) //如果輸入鍵值小于10即0-9
  192.                                            {
  193.                                              key.time_n=0;//鍵盤時間計數(shù)清零
  194.                                              mydata[key.down]=i; //        保存按鍵
  195.                                                  lcd_pos(key.down+68);         //
  196.                                                  lcd_wdat(0x2a);//顯示星號
  197.                                              key.down++; //按鍵次數(shù)加1
  198.                                                  key.time=1;//按鍵計時開始,如果長時間沒有按鍵按下,認(rèn)為輸入無效
  199.                                                  TR1=1;//啟動定時器                                       
  200.                                             }                                         
  201.                                         }

  202.                                         /*****如果按下清除鍵******/
  203.                                         if(i==11)//等待按下確認(rèn)鍵
  204.                                         {
  205.                                               if(key.down>0)  //如果當(dāng)前還有輸入的數(shù)據(jù)
  206.                                                   {
  207.                                                     key.down=key.down-1;//
  208.                                                     mydata[key.down]=0;//還要再弄一些標(biāo)志變量
  209.                                                     lcd_pos(key.down+68);
  210.                                                     lcd_wdat(0x20);//將星號顯示關(guān)閉
  211.                                                         key.time_n=0;
  212.                                                   }
  213.                                         }
  214.                                         /**************等待按下確認(rèn)鍵************/
  215.                                         if(key.down==6)//如果已經(jīng)輸入了6個數(shù)據(jù)
  216.                                         {

  217.                                            if(i==10)  //確認(rèn)鍵的鍵值是10
  218.                                            {
  219.                                                     TR1=0;//關(guān)閉定時器
  220.                                                         key.time_n=0;//重新準(zhǔn)備開始
  221.                                                         key.time=0;
  222.                                                     check_code();//開始對比輸入的密碼值和存儲器中保存的密碼
  223.                                                 
  224.                                            }
  225.                                         }
  226.                                         if(key.reset==1) //只有當(dāng)鎖打開的時候,才允許設(shè)置新的密碼

  227.                                         {
  228.                                            if(i==15)//沒有鎖鍵盤
  229.                                            {
  230.                                                       key.setnew=1;//允許輸入新的密碼
  231.                                                    key.disclose=0;//重新打開
  232.                                                    reset_char();
  233.                                                    ok_stop=0;
  234.                                            }
  235.                                         }                                         
  236.                                         if(i==14)  //這個按鍵相當(dāng)于復(fù)位了
  237.                                         {
  238.                                                 clear_all();//重新復(fù)位重新開始
  239.                                        
  240.                                         }                                 
  241.                                         delay(400);//鍵盤延時
  242.                                 }
  243.                      }
  244.                   }         
  245.           }
  246.           return 0;         
  247. }
  248. /*******************************************
  249. *函數(shù)名稱:display( )        顯示函數(shù)
  250. *函數(shù)作用:
  251.           1、當(dāng)輸入數(shù)字鍵值小于6時,光標(biāo)閃爍

  252. *********************************************/        
  253. void display()
  254. {
  255.              if(key.down<6)
  256.           {
  257.                      delay(120);        //這個地方顯示光標(biāo)閃爍
  258.                   lcd_pos(68+key.down);//
  259.                   lcd_wcmd(0x0f);
  260.                   delay(140);
  261.                   lcd_pos(68+key.down);//光標(biāo)閃爍
  262.                   lcd_wcmd(0x0c); //   
  263.           }                                    
  264.             
  265. }
  266. /*******************************************
  267. *函數(shù)名稱:init_timer( )        定時器初始化函數(shù)
  268. *函數(shù)作用:
  269.           定時器定時時間1ms

  270. *********************************************/        
  271. void init_timer() //
  272. {
  273.     TMOD|= 0x10;//
  274.            TH1 = 0xEC;
  275.         TL1 = 0x78;
  276.     ET1=1;        
  277.         EA=1;               
  278.     TR1  = 0; //關(guān)閉  
  279. }
  280. /*******************************************
  281. *函數(shù)名稱:clear( )         清除函數(shù)
  282. *函數(shù)作用:
  283.          只清除按下的次數(shù),以及初始化字符顯示

  284. *********************************************/         
  285. void clear() reentrant
  286. {
  287.   key.down=0;
  288.   ok_stop=0;
  289.   init_char();
  290. }
  291. /*******************************************
  292. *函數(shù)名稱:clear_all( )          清除所有的標(biāo)志變量
  293. *函數(shù)作用:
  294.          

  295. *********************************************/        
  296. void clear_all()  //所有的變量清零
  297. {
  298.    clear();  
  299.    TR1=0;//關(guān)閉定時器
  300.    key.close=0;
  301.    beep=1;
  302.    key.reset=0;
  303.    key.setnew=0;
  304.    key.error=0;
  305.    key.reset_num=0;//全部清零
  306.    key.disclose=0;
  307.    key.open=0;
  308. }
  309. /*******************************************
  310. *函數(shù)名稱:main( )         主函數(shù)
  311. *函數(shù)作用:
  312.          這個函數(shù)必須有的

  313. *********************************************/        
  314. void main()//
  315. {
  316.         uchar i=0;
  317.         beep=1;//初始化蜂鳴器
  318.     lcd_init();
  319.         init_char();
  320.         init_timer();
  321.     while(1)
  322.     {  
  323.             
  324.      if(key.open==0)//如果鍵盤沒有鎖,調(diào)用鍵盤掃描
  325.          {
  326.              keyscan();
  327.          }
  328.          if(key.disclose==0) //如果顯示沒有關(guān)閉,調(diào)用display
  329.          {
  330.            display(); //顯示字符應(yīng)該控制住的

  331.          }
  332.           if(key.close==1)        //如果三次密碼輸入錯誤,報警完成后開始清除所有變量
  333.          {
  334.          
  335.            clear_all();
  336.          }
  337.                
  338.           }   
  339. }  
  340. /*******************************************
  341. *函數(shù)名稱:TI_int1( )        定時器1中斷處理函數(shù)
  342. *函數(shù)作用:
  343.         
  344. *********************************************/        
  345. void T1_int1(void) interrupt 3//定時器中斷
  346. {
  347.     TH1 = 0xEC;        
  348.         TL1 = 0x78;        
  349.           //beep=~beep;
  350.         if(key.time==1)
  351.         {
  352.                 key.time_n++;  
  353.                 if(key.time_n>1099)
  354.                 {
  355.                   //清零
  356.                   key.close=1;
  357.                   key.time_n=0;
  358.                   TR1=0;//關(guān)閉定時器
  359.                   key.time=0;
  360.                 }
  361.         }
  362.         else
  363.         {          TIM++;
  364.               beep=0;
  365.                  if(TIM>1300)
  366.             {
  367.                   TIM=0;
  368.                   key.open=0;
  369.                   key.close=1;
  370.                   key.time=0;
  371.                   beep=1;
  372.                 }
  373.         
  374.         }

  375.   
  376. }



復(fù)制代碼

0.png

基于單片機電子密碼鎖設(shè)計.rar (4.66 MB, 下載次數(shù): 330)

評分

參與人數(shù) 5黑幣 +68 收起 理由
Amazing云山 + 5 很給力!
光華人 + 4 贊一個!
w969251573 + 4 很給力!
Tristina + 5 很給力!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

相關(guān)帖子

回復(fù)

使用道具 舉報

ID:99401 發(fā)表于 2016-4-22 12:20 | 顯示全部樓層
求密碼鎖的原理是什么?
回復(fù)

使用道具 舉報

ID:99401 發(fā)表于 2016-4-22 12:22 | 顯示全部樓層
求密碼鎖的原理是什么?
回復(fù)

使用道具 舉報

ID:110780 發(fā)表于 2016-9-7 10:14 | 顯示全部樓層
請問有這個的pcb的程序嘛?跪求
回復(fù)

使用道具 舉報

ID:158129 發(fā)表于 2016-12-27 19:59 | 顯示全部樓層
好資料,51黑有你更精彩!!!
回復(fù)

使用道具 舉報

ID:169770 發(fā)表于 2017-3-11 00:27 | 顯示全部樓層
密碼不是012345啊,密碼是什么
回復(fù)

使用道具 舉報

ID:89286 發(fā)表于 2017-3-11 01:21 | 顯示全部樓層
thanks for sharing
回復(fù)

使用道具 舉報

ID:153791 發(fā)表于 2017-4-13 14:27 | 顯示全部樓層
密碼不對
回復(fù)

使用道具 舉報

ID:206113 發(fā)表于 2017-5-30 18:15 | 顯示全部樓層
很給力,贊一個
回復(fù)

使用道具 舉報

ID:206113 發(fā)表于 2017-5-31 10:40 | 顯示全部樓層
密碼有問題,而且顯示D1有邏輯沖突,不知道為什么...
回復(fù)

使用道具 舉報

ID:247141 發(fā)表于 2017-11-7 23:14 | 顯示全部樓層
怎么下載啊
回復(fù)

使用道具 舉報

ID:248401 發(fā)表于 2017-11-11 18:10 | 顯示全部樓層
感謝分享 支持一下
回復(fù)

使用道具 舉報

ID:255915 發(fā)表于 2017-12-1 13:43 來自手機 | 顯示全部樓層
求原理圖
回復(fù)

使用道具 舉報

ID:255915 發(fā)表于 2017-12-2 09:18 來自手機 | 顯示全部樓層
感謝分享
回復(fù)

使用道具 舉報

ID:245851 發(fā)表于 2017-12-2 11:42 | 顯示全部樓層
感謝分享
哈哈
回復(fù)

使用道具 舉報

ID:307476 發(fā)表于 2018-4-16 12:48 | 顯示全部樓層
仿真輸入密碼顯示密碼錯誤是什么情況
回復(fù)

使用道具 舉報

ID:317418 發(fā)表于 2018-4-26 23:12 | 顯示全部樓層
哼厲害,值得表揚
回復(fù)

使用道具 舉報

ID:396033 發(fā)表于 2018-9-10 14:39 | 顯示全部樓層
支持一下~~~~~~
回復(fù)

使用道具 舉報

ID:266868 發(fā)表于 2018-9-10 15:53 來自手機 | 顯示全部樓層
好強。。。
回復(fù)

使用道具 舉報

ID:396124 發(fā)表于 2018-9-10 17:14 | 顯示全部樓層
感謝分享
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美成人激情视频 | 免费精品 | 精品国产乱码久久久久久a丨 | 91精品欧美久久久久久久 | 日韩欧美一区二区三区免费观看 | 亚洲精品www久久久 www.蜜桃av | 国产 日韩 欧美 制服 另类 | 99热首页 | 免费亚洲婷婷 | 夜夜操操操| 亚洲视频 欧美视频 | 亚洲国产精品一区二区第一页 | 久久99精品久久久久 | av网站免费 | 亚洲精品自拍视频 | 在线观看国产h | 日韩a v在线免费观看 | 欧美aaaa视频 | 国产一级免费视频 | 黄色精品 | 亚洲欧美激情视频 | 欧美日韩高清免费 | 在线中文字幕av | 久久免费视频1 | a级黄色毛片免费播放视频 国产精品视频在线观看 | 成人性视频在线 | 日本a视频| 精品国产黄a∨片高清在线 成人区精品一区二区婷婷 日本一区二区视频 | 亚洲精品在线看 | 天天精品在线 | 国产精品海角社区在线观看 | 国产日韩欧美在线观看 | 精品国产91 | 午夜精品一区二区三区在线视频 | 成人av一区二区在线观看 | 日韩视频一区在线观看 | 成人精品视频在线观看 | 久久这里只有精品首页 | 久久久精 | 在线免费观看黄a | 欧美日韩电影免费观看 |