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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2404|回復: 0
打印 上一主題 下一主題
收起左側

基于51單片機的電子密碼鎖程序Proteus仿真圖設計

[復制鏈接]
跳轉到指定樓層
#
1、如果沒有裝KEIL軟件:.c   .h結尾的文件即為程序,選擇記事本或C語言軟件打開。
2、若安裝有KEIL軟件:本程序有KEIL5設計,為避免版本區別帶來的問題,建議使用KEIL5打開.uvproj結尾的工程文件。
3、其中,.hex結尾的文件為燒錄文件,可以用于仿真和硬件實現。
注:其他文件為編譯時自動生成的文件,不用管。

(1)仿真代碼和源程序代碼有著些許區別,做硬件燒錄時請用文件夾1中的燒錄程序(.hex);
(2)仿真請打開“電子鎖仿真.DSN”工程文件,仿真代碼請打開“project.uvproj”文件;
(3)仿真燒錄時請打開“edoor.hex”文件;
(4)具體仿真功能為:
①輸入密碼,且輸入的密碼顯示在液晶顯示屏上;
②按下“DorBell”后,會響起門鈴聲;
③初始密碼為“1234”,輸入正確后,顯示“OK”,并且LED燈閃爍,表示開門;
④輸入密碼錯誤后,顯示“Eror”,三次輸入錯誤后會報警;
⑤按下“DELE”,清楚輸入的密碼;
特別注意:本仿真原理圖由protues8.7設計,為避免版本區別帶來的問題,請盡量使用protues8.7打開仿真文件。。

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


單片機源程序如下:
  1. /*
  2. 基于51單片機的電子密碼鎖設計
  3. 實現密碼匹配,手動門鈴等功能
  4. 設計人:訥言敏行
  5. 設計時間:2020.4.20
  6. */
  7. //庫調用.宏類型定義.位定義//
  8. #include <reg52.h>                          
  9. //#include <intrins.h>
  10. #define uchar unsigned char
  11. #define uint unsigned int
  12. #define GPIO_KEY P1
  13. sbit RS = P2^2;                           //液晶顯示器控制端口
  14. sbit RW = P2^3;
  15. sbit E = P3^7;
  16. sbit shuchu=P2^0;                          //繼電器控制端口
  17. sbit beep=P2^1;                                  //報警器端口
  18. sbit DoorBell=P3^6;                          //門鈴端口
  19. uchar upxs[16]={"Password:"}; //上排存放數組
  20. uchar dwxs[16]={""};          //下排存放數組
  21. int tempword[8]={0};                   //臨時密碼數組
  22. int password[8]={1,2,3,4};//初始密碼
  23. uint now=0;                                          //數組等效指針
  24. uint key=0;                   //密鑰
  25. uint KeyValue=16;             //用來存放讀取到的鍵值
  26. uint warn=0;                                  //錯誤累計
  27. uint time=0;                                  //用于定時
  28. uint time1=0;                 //用于定時
  29. uint time2=0;                 //用于定時
  30. uint moshi=0;                                  //定時器內部模式
  31. //*********************************************************************************************************************************
  32. //液晶驅動顯示模塊//
  33. void delay(uint dell)//毫秒延時//
  34. {
  35.      uchar x;
  36.      for(dell;dell>0;dell--)
  37.      for(x=110;x>0;x--);
  38. }
  39. void wr_com(uchar temp)//寫指令//
  40. {
  41.      RS=0;
  42.      RW=0;
  43.      P0=temp;
  44.      E=1;
  45.      E=0;
  46. }
  47. void wr_data(uchar num)//寫數據//
  48. {
  49.      RS=1;
  50.      RW=0;
  51.      P0=num;
  52.      E=1;
  53.      E=0;
  54. }
  55. void disp_lcd(uchar addr,char *templ)//顯示函數//
  56. {
  57.      uchar i;
  58.      wr_com(addr);
  59.          delay(50);
  60.      for(i=0;i<16;i++)
  61.     {
  62.      wr_data(templ[i]);
  63.          delay(50);
  64.     }         
  65. }
  66. void lcd_init()//初始化液晶//
  67. {
  68.      wr_com(0x30);
  69.      delay(50);
  70.      wr_com(0x38);
  71.      delay(50);
  72.      wr_com(0x01);
  73.      delay(50);
  74.      wr_com(0x06);
  75.      delay(50);
  76.      wr_com(0x0c);
  77.      delay(50);
  78. }
  79. void lcdxianshi(void)//液晶總顯示//
  80. {
  81.      disp_lcd(0x80,upxs);
  82.      disp_lcd(0xc0,dwxs);
  83. }
  84. //*********************************************************************************************************************************
  85. //按鍵掃描模塊//
  86. void Delay10ms(void)//延時函數//
  87. {
  88.     unsigned char a,b,c;
  89.     for(c=1;c>0;c--)
  90.         for(b=38;b>0;b--)
  91.             for(a=130;a>0;a--);
  92. }
  93. void KeyDown(void)//鍵盤檢測函數//
  94. {
  95.         char a=0;
  96.         GPIO_KEY=0x0f;
  97.         if(GPIO_KEY!=0x0f)     //讀取按鍵是否按下
  98.         {
  99.                 Delay10ms();       //延時10ms進行消抖
  100.                 if(GPIO_KEY!=0x0f) //再次檢測鍵盤是否按下
  101.                 {
  102.                         
  103.                         //檢測列
  104.                         GPIO_KEY=0X0F;
  105.                         switch(GPIO_KEY)
  106.                         {
  107.                                 case(0X07):        KeyValue=0;break;
  108.                                 case(0X0b):        KeyValue=1;break;
  109.                                 case(0X0d): KeyValue=2;break;
  110.                                 case(0X0e):        KeyValue=3;break;
  111.                         }
  112.                         //檢測行
  113.                         GPIO_KEY=0XF0;
  114.                         switch(GPIO_KEY)
  115.                         {
  116.                                 case(0X70):        KeyValue=KeyValue;break;
  117.                                 case(0Xb0):        KeyValue=KeyValue+4;break;
  118.                                 case(0Xd0): KeyValue=KeyValue+8;break;
  119.                                 case(0Xe0):        KeyValue=KeyValue+12;break;
  120.                         }
  121.                         while((a<10)&&(GPIO_KEY!=0xf0))//按鍵松手檢測
  122.                         {
  123.                                 Delay10ms();
  124.                                 a++;
  125.                         }
  126.                 }
  127.         }
  128. }
  129. //*******************************************************************************************************************************
  130. //數據處理模塊//
  131. void keysend(void)//鍵值傳遞//
  132. {
  133.                   switch(KeyValue)
  134.               {
  135.                case 0:{dwxs[now]='0';tempword[now]=0;now++;break;}
  136.                    case 1:{dwxs[now]='1';tempword[now]=1;now++;break;}
  137.                    case 2:{dwxs[now]='2';tempword[now]=2;now++;break;}
  138.                    case 3:{dwxs[now]='3';tempword[now]=3;now++;break;}
  139.                    case 4:{dwxs[now]='4';tempword[now]=4;now++;break;}
  140.                    case 5:{dwxs[now]='5';tempword[now]=5;now++;break;}
  141.                    case 6:{dwxs[now]='6';tempword[now]=6;now++;break;}
  142.                    case 7:{dwxs[now]='7';tempword[now]=7;now++;break;}
  143.                    case 8:{dwxs[now]='8';tempword[now]=8;now++;break;}
  144.                    case 9:{dwxs[now]='9';tempword[now]=9;now++;break;}
  145.                    case 11:{
  146.                                      upxs[12]='S';
  147.                                   upxs[13]='U';
  148.                                   upxs[14]='R';
  149.                                   upxs[15]='E'; break;
  150.                    }
  151.                    case 15:{
  152.                           TR0=1;                     //定時器0打開
  153.                                      moshi=1;                         //模式1為門鈴模式
  154.                                   KeyValue=16; break;//鍵值緩存清零
  155.                    }
  156.                   }
  157.                   if(now==8) now=0;          //只顯示八位
  158. }
  159. void sure(void)//密碼認證函數//
  160. {
  161.      uchar i;
  162.      if(KeyValue==11)
  163.          {
  164.              for(i=0;i<8;i++)
  165.                  {
  166.                          if(password[i]!=tempword[i])//對比密碼
  167.                         {
  168.                             key++;
  169.                         }
  170.                  }                  
  171.                  if(key==0)                //密碼正確,輸出OK
  172.                            {
  173.                                 dwxs[13]='O';
  174.                                 dwxs[14]='K';
  175.                           shuchu=1;                  //開門
  176.                                 TR1=1;            //定時器1打開,啟動倒計時
  177.                                 moshi=0;          //輸入正確密碼可關閉報警模式
  178.                                 beep=0;           //蜂鳴器復位
  179.                                 TR0=0;                          //并且關閉定時器0
  180.                            }
  181.                  if(key!=0)               //密碼錯誤,次數累加
  182.                         {
  183.                                 dwxs[12]='E';
  184.                                 dwxs[13]='R';
  185.                                 dwxs[14]='O';
  186.                                 dwxs[15]='R';
  187.                                 warn++;
  188.                                 if(warn==3)                  //輸入錯誤3次,報警
  189.                                 {
  190.                                    TR0=1;                  //定時器0啟動
  191.                                moshi=2;                  //模式2啟動報警
  192.                                    warn=0;                  //累計清零
  193.                                 }
  194.                         }
  195.          }
  196. }
  197. void delete(void)//清除函數//
  198. {
  199.      uchar i;
  200.              for(i=0;i<16;i++)
  201.                  {
  202.                     dwxs[i]=0x20;         //密碼字符清零
  203.                  }
  204.                  for(i=0;i<8;i++)
  205.                  {
  206.                     tempword[i]=0;         //密碼緩存數組清零
  207.                  }
  208.                     upxs[12]=0x20;   //SURE顯示清零
  209.                         upxs[13]=0x20;
  210.                         upxs[14]=0x20;
  211.                         upxs[15]=0x20;
  212.                  now=0;                                 //類指針復位
  213.                  key=0;                                 //密鑰清零
  214.                  KeyValue=16;                 //鍵值緩存清零
  215. }
  216. void condition_delete(void)  //條件清除
  217. {
  218.      if(KeyValue==10)
  219.          {
  220.                 delete();            //按下DELE鍵清除數據
  221.          }
  222.          KeyValue=16;                         //鍵值緩存清零
  223. }
  224. //********************************************************************************************************************************8
  225. //定時模塊//
  226. void timer0() interrupt 1    //定時器0用于門鈴
  227. {
  228.     switch(moshi)
  229.    {
  230.       case 1:{
  231.                 DoorBell=~DoorBell;
  232.             time++;
  233.              if(time<400)             //若需要拖長聲音,可以調整 400 和 800
  234.             {
  235.                TH0=(8192-700)/32;     //700us 定時
  236.                TL0=(8192-700)%32;
  237.             }
  238.              else if(time<800)
  239.             {
  240.                TH0=(8192-1000)/32;    //1ms 定時
  241.                TL0=(8192-1000)%32;
  242.             }
  243.              else
  244.             {
  245.                time=0;                                  //計數清零
  246.                TR0=0;                                  //關閉定時器
  247.                            moshi=0;                                  //跳出模式1
  248.             }
  249.                         break;
  250.           }
  251.           case 2:{
  252.                            beep=~beep;
  253.                          time++;
  254.                          if(time<400)             //若需要拖長聲音,可以調整 400
  255.             {
  256.                TH0=(8192-700)/32;     //700us 定時
  257.                TL0=(8192-700)%32;
  258.             }
  259.                         else
  260.                         {
  261.                            time=0;                                  //計數清零
  262.                         }
  263.                         break;
  264.           }
  265.    }
  266. }
  267. void timer1() interrupt 3          //定時器1用于自動關門
  268. {  
  269.     TH0=(65536-50000)/256;  
  270.     TL0=(65536-50000)%256;  
  271.     time1++;   
  272.     if(time1==20)//一秒  
  273.     {      
  274.       time2++;
  275.           time1=0;  
  276.     }
  277. }
  278. //**********************************************************************************************************************************
  279. //主函數//
  280. void main(void)//主函數
  281. {
  282.     TMOD=0x10;                                  //0001 0000//定時器1方式1,定時器0方式0
  283.         TH0=(8192-700)/32;                 //定時器0 700us 定時
  284.     TL0=(8192-700)%32;
  285.     TH1=(65536-50000)/256;   //定時器1 50ms
  286.     TL1=(65536-50000)%256;  
  287.     EA=1;  
  288.     ET0=1;
  289.         ET1=1;
  290.     shuchu=0;                            //門鎖初始化
  291.         beep=0;                                    //警報初始化
  292.         DoorBell=0;                                //門鈴初始化
  293.     lcd_init();                            //液晶初始化
  294.         while(1)
  295.         {
  296.                 KeyDown();                    //按鍵檢測
  297.                 keysend();                    //數據傳遞
  298.                 lcdxianshi();            //輸入顯示
  299.                 sure();                            //密碼認證
  300.                 condition_delete(); //按鍵清除
  301.                 if(time2==4)            //門鎖打開后4秒關閉
  302.                 {
  303.                    shuchu=0;
  304.                    time2=0;
  305.                    delete();                //自動清除
  306.                    TR1=0;                 //關閉定時器1
  307.                 }               
  308.         }                                
  309. }
復制代碼
Keil代碼與Proteus仿真下載:
基于51單片機的電子密碼鎖設計.7z (2.39 MB, 下載次數: 89)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲高清视频一区二区 | 成人激情免费视频 | 免费国产一区 | 欧美黑人一区 | 久久一区二区三区四区五区 | 日韩精品一区二区三区免费观看 | 中文字幕人成乱码在线观看 | 亚洲综合在线视频 | 天天影视色综合 | 国产在线网站 | 精品一区二区电影 | 欧美精品二区三区 | 免费毛片网 | 97超碰成人 | 一级毛片成人免费看a | 日韩精品一区中文字幕 | 久久国产精品99久久久大便 | 国产精品99久久久久久久vr | 青青草综合 | 日本亚洲一区 | 免费毛片在线 | 久久久久av | 三级成人在线 | 免费午夜电影 | 久久久久久高清 | 亚州影院| 成年人免费看的视频 | 国产欧美一区二区三区日本久久久 | 毛片免费看 | 色网站入口 | 精品久久久久久久久久久下田 | 久久久久久久久国产成人免费 | 亚洲成人精品在线 | 国产高清精品一区二区三区 | 99久久精品免费看国产高清 | 国产色片在线 | 亚洲网站免费看 | 日韩一区中文字幕 | 免费h在线 | 精品久久一区二区 | 亚洲精品视频一区二区三区 |