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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC15F2K60S2單片機密碼鎖+1602+繼電器控制

  [復制鏈接]
跳轉到指定樓層
樓主
ID:233090 發表于 2018-3-13 20:01 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
15做的密碼鎖,4*5矩陣鍵盤,做出過實物。STC15F2K60S2芯片。效果還可以,還有51的程序,最后做的15.


單片機源程序如下:
  1. /*--------------------------------------------------------------------------------
  2. * 實 驗 名                 : 電子密碼鎖
  3. * 實驗說明       : 密碼鎖
  4. * 連接方式       :
  5. * 注    意                 :重置密碼錯誤需要重新按重置密碼按鍵
  6. * 時    間                 :10月17日19:16:05

  7. *******************************************************************************/
  8. #include<STC15F2K60S2.h>
  9. #include<main.h>       
  10. #include"lcd.h"
  11. #include"eeprom.h"
  12. #include<intrins.h>

  13. extern     IapIdle();
  14. extern     BYTE IapReadByte(WORD addr);
  15. extern   IapProgramByte(WORD addr, BYTEdat);
  16. extern   IapEraseSector(WORD addr);

  17. /*******************************************************************************
  18. * 函 數 名         : main
  19. * 函數功能                   : 主函數
  20. * 輸    入         : 無
  21. * 輸    出         : 無
  22. *******************************************************************************/
  23. void main(void)                                                                                                  //主函數
  24. {        unsigned char i;
  25.    
  26.         init();
  27.        


  28.         for(i=0;i<6;i++)
  29.           {
  30.            mima[i]=IapReadByte(0x0000+i)+'1';
  31.           }
  32.         while(1)                                                                                                                  //調用函數
  33.         {
  34.                 //display();

  35.                 KeyScan();
  36.                 Count();
  37.                 disPlay();
  38.                 change();
  39.                 lock();
  40.                 reinput();
  41.                 rec();
  42.                 back();
  43.         //        jdq();
  44.               tuichu();
  45.         if(KeyValue==13){for(i=0;i<6;i++)
  46.           {mima[i]='1';}
  47.           }                       
  48.         }                               
  49. }

  50. /*******************************************************************************
  51. * 函 數 名         : KeyScan
  52. * 函數功能                   : 檢測有按鍵按下并讀取鍵值
  53. * 輸    入         : 無
  54. * 輸    出         : 無
  55. *******************************************************************************/


  56. void KeyScan(void)                                                                                                                 //可以得到鍵值
  57. {
  58.         char a = 0;

  59.            KeyValue=0xff;
  60.         GPIO_KEY=0x0f;
  61.         if(GPIO_KEY!=0x0f)//讀取按鍵是否按下
  62.         {
  63.                 Delay10ms(1);//延時10ms進行消抖
  64.                 if(GPIO_KEY!=0x0f)//再次檢測鍵盤是否按下
  65.                 {
  66.                        
  67.                         //測試列
  68.                         GPIO_KEY=0X0F;
  69.                         switch(GPIO_KEY)
  70.                         {
  71.                                 case(0X07):        KeyValue=0;break;
  72.                                 case(0X0b):        KeyValue=4;break;
  73.                                 case(0X0d): KeyValue=8;break;
  74.                                 case(0X0e):        KeyValue=12;break;
  75.                         }
  76.                         //測試行
  77.                         GPIO_KEY=0XF0;
  78.                         switch(GPIO_KEY)
  79.                         {
  80.                                 case(0X70):        KeyValue=KeyValue+3;break;
  81.                                 case(0Xb0):        KeyValue=KeyValue+2;break;
  82.                                 case(0Xd0): KeyValue=KeyValue+1;break;
  83.                                 case(0Xe0):        KeyValue=KeyValue;break;
  84.                         }
  85.                
  86.    



  87.                  
  88.                         while((a<50) && (GPIO_KEY!=0xf0))         //檢測按鍵松手檢測
  89.                         {
  90.                                 Delay10ms(1);
  91.                                 a++;
  92.                         }
  93.                         LED_YELLOW=0;
  94.                         Delay10ms(10) ;
  95.                     LED_YELLOW=1;
  96.                 }
  97.        
  98.         }
  99.          // change_keyvalue();
  100. }
  101. void tuichu(){
  102. if(KeyValue==15&&r==1)
  103. {r=0; mboot=0;flag=0;N=0;cishu=0;relay=0;LED_GREEN=1;
  104. for(t=0;t<6;t++)                                                           //清屏
  105.            {
  106.              disTab[0][9+t]=' ';
  107.                                                                                                          //寫正確
  108.                  disTab[2][10+t]=' ';
  109.            }
  110. }
  111. }


  112. void lock(void)                                                //鎖定鍵盤
  113. {                                                       
  114.    unsigned char t;
  115.    if(N==3)
  116.   {  mboot=7;                                                                        //腳大于 6鎖定鍵盤
  117.      
  118.    for(t=0;t<6;t++)                                                           //清屏
  119.            {
  120.              disTab[0][9+t]=' ';
  121.                  }
  122.    
  123.          LED_RED=0;                                                                 //紅燈閃爍報警
  124.          Delay10ms(10);
  125.          LED_RED=1;
  126.          Buzzer();                                                                   //報警
  127.    }

  128.   }
  129. void reinput()                                                                 //重新輸入
  130. {
  131.   if(N<3&&KeyValue==10&&mboot==6&&r==0)                  //判斷輸入次數小于3,鍵值為10即按下了確認鍵,腳寫完了,無錯
  132.    { unsigned char t;
  133.    N++;                                                                                        //初始化
  134.    mboot=0;
  135.    flag=0;  
  136.      for(t=0;t<6;t++)
  137.            {
  138.              disTab[0][9+t]=' ';
  139.                  }

  140.         }
  141.   
  142.   }
  143. void Count(void)                                                //密碼判斷
  144.     {                                                       
  145.         if(mboot<6){
  146.                 if(KeyValue>=0 && KeyValue<=9){                           //值在0到9之間
  147.                 if(cishu==0){                                                                //沒有按下重置密碼按鈕
  148.                         password[mboot]=KeyValue;                                //暫存數據于PASSWORD中
  149.                 //disTab[0][9+mboot]='0'+ password[mboot];
  150.                     disTab[0][9+mboot]='*';                                  //以*來遮掩密碼
  151. }                          
  152.                 if (cishu==1){                                                                 //如果按下重置密碼按鍵
  153.                         temp[mboot]=KeyValue;                                          //存數據到temp中以便修改與判斷
  154.                         disTab[0][9+mboot]='0'+ temp[mboot];           //顯示要修改的密碼
  155.             //        disTab[0][9+mboot]='*';
  156.                                 }
  157.                  if(cishu==2){                                                                        //確認修改
  158.                  if(KeyValue!=temp[mboot])                                                 //如果輸入錯誤
  159.                   c=1;                                                                                          //標志位置1
  160.                   if(KeyValue==temp[mboot])                                                  //如果正確
  161.                  
  162.                    temp[mboot]=KeyValue;

  163.                           disTab[0][9+mboot]='0'+ KeyValue;                           //顯示
  164.                                     
  165.           
  166.                  }
  167.                         mboot++;                                          
  168.                                  
  169.                 }
  170.          
  171.                  
  172.         }
  173.         if(KeyValue==10)                                                                                         //確認密碼
  174.          {
  175.            unsigned char t;
  176.           
  177.             for(t=0;t<6;t++)
  178.                  {
  179.                    if(mima[t]!=password[t]+'0')                                                                  //輸入錯誤
  180.                     {flag=1;                                                                                          //標志位置一
  181.                          break;}
  182.                     }
  183.                 if(flag==0)                                                                                                        //密碼輸入沒有錯誤
  184.                   r=1;                                                                                                                 //標志位置1
  185.                  }
  186.                   if(flag==1)                                                                                                //密碼輸入有錯誤
  187.                    {  unsigned char t;
  188.                      
  189.                     for(t=0;t<5;t++)
  190.                     { disTab[1][10+t]=Error[t];}                                                                          //寫錯誤
  191.                          LED_RED=0;                                                                                                                          //閃紅燈
  192.                          Delay10ms(5);
  193.                          LED_RED=1;

  194.                            }
  195.                    if(flag==0&&r==1)                                                                                  //如果檢測標志位為1而且密碼沒有錯
  196.                    {  unsigned char t;
  197.                             relay=1;                                                                                            //打開繼電器
  198.                     for(t=0;t<5;t++)                                                                                        //寫正確
  199.                      {disTab[2][10+t]=Right[t];
  200.                           }
  201.                           LED_RED=1;LED_GREEN=0;                                                                                        //綠燈亮
  202.                         }
  203.                  
  204. }

  205. void change(void)                                                          //重置密碼
  206. {                                                                                                  
  207.            unsigned char t;
  208.    if(mboot==6&&r==1&&KeyValue==11){                   //腳寫完而且檢測標志位置1按下重置按鍵
  209.                   
  210.                 cishu++;                                                           //加次數
  211.              for(t=0;t<6;t++)
  212.            {
  213.              disTab[0][9+t]=' ';                                        //清屏
  214.                  } mboot=0;
  215.    }

  216.    if(cishu==3)                                                                         //確認重置
  217.    {
  218.      if(c==1)                                                                         //        重置有錯誤
  219.           {
  220.             
  221.                     for(t=0;t<5;t++)
  222.                      {disTab[0][10+t]=Error[t];}                   //寫錯誤
  223.                           disPlay();
  224.                            Delay10ms(150) ;
  225.                  for(t=0;t<6;t++)
  226.            {
  227.              disTab[0][9+t]=' ';
  228.                  
  229.            }mboot=6;cishu=0;c=0;
  230.                                                                                            //重新輸入
  231.    
  232.                
  233.                
  234.                 }
  235.            else
  236.            {
  237.             suc=1;                                                                         //密碼修改成功標志位
  238.             for(t=0;t<5;t++)
  239.                 {disTab[0][10+t]=Right[t];}                           //寫正確
  240.                 IapEraseSector(0x0000);                                            //擦除扇區0
  241.             for(t=0;t<6;t++)
  242.              {
  243.                    mima[t]=temp[t]+'0';//賦值
  244.                     IapProgramByte(0x0000+t,mima[t]-49);                    
  245.                          }
  246.                   }
  247.          }
  248.    
  249.         if(cishu==3&&c==0)   
  250.             {  
  251.             LED_GREEN=1;
  252.              }
  253.    }
  254. void back()                                                                                //退格密碼
  255. {        unsigned char t;
  256.     if(mboot>0&&KeyValue==12)
  257.      {mboot--;
  258.          disTab[0][9+mboot]=' ';                                   //蓋上空格
  259.          if(cishu==2)
  260.         {c=0;
  261.          for(t=0;t<mboot;t++)
  262.              {
  263.            if(KeyValue!=temp[t])
  264.                   c=1;
  265.                   }
  266.                  }  
  267.            }
  268.          }
  269.   
  270.    

  271. void rec(void)                                                               //密碼修改成功返回
  272. {
  273.    unsigned char t;
  274. if(suc==1)
  275.   {
  276.    for(t=0;t<6;t++)
  277.            {                                                                                                  //相當于初始化
  278.              disTab[0][9+t]=' ';
  279.                  }
  280.            mboot=0;
  281.          suc=0;
  282.          cishu=0;
  283.          r=0;
  284.          LcdWriteCom(0xC0);
  285.          for(t=0;t<16;t++)
  286.           {
  287.              disTab[1][t] =        eror[t];
  288.           }
  289.           relay=0;
  290.    }
  291.    
  292.    }

  293. void disPlay(void){                                                                                                           //顯示密碼

  294.         unsigned char i;
  295.        

  296.          LcdWriteCom(0x80);
  297.         for(i=0; i<16; i++)
  298.         {
  299.                 LcdWriteData(disTab[0][i]);                       
  300.         
  301.                 }

  302.         LcdWriteCom(0xC0);
  303.         for(i=0; i<16; i++)
  304.         {       
  305.                 LcdWriteData(disTab[1+r][i]);                       
  306.         }
  307.                
  308. }
  309. /******************************************************************************
  310. 函數功能: 蜂鳴器
  311. 輸    入: 無
  312. 輸    出: 無


  313. ******************************************************************************/
  314. void Buzzer()
  315. {
  316.   
  317.             buzzer=1;
  318.          delay(50);
  319.          buzzer=0;
  320.    
  321.      }
  322. void init()
  323.   {
  324.      unsigned char i;


  325.         P5M1 &= ~0x10;  //0001 0000  0x10  
  326.         P5M0 |= 0x10;        //0001 0000  0x10
  327.         LED_RED=1;LED_GREEN=1;LED_YELLOW=1;
  328.         relay=0;
  329.         LcdInit();
  330.         t=0;
  331.        
  332.         for(i=0; i<9; i++)                                                                          //寫屏
  333.         {                       
  334.                 LcdWriteData(PuZh[i]);                       
  335.         }
  336.         for(i=0; i<3; i++)                                                                           //閃三下,說明燈正常
  337.         {        LED_RED=0;LED_GREEN=0;LED_YELLOW=0;
  338.         Delay10ms(10) ;
  339.         LED_RED=1;LED_GREEN=1;LED_YELLOW=1;
  340.         Delay10ms(10) ;
  341.         LED_RED=0;LED_GREEN=0;LED_YELLOW=0;
  342.         Delay10ms(10) ;
  343.         LED_RED=1;LED_GREEN=1;LED_YELLOW=1;
  344. ……………………

  345. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
51密碼鎖+1602+繼電器控制后期轉15.zip (47.82 KB, 下載次數: 77)
15密碼鎖+1602+繼電器控制.zip (61.5 KB, 下載次數: 108)


評分

參與人數 1黑幣 +4 收起 理由
a455914479 + 4

查看全部評分

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

使用道具 舉報

沙發
ID:1 發表于 2018-3-14 05:33 | 只看該作者
好資料 能分享個原理圖嗎?
回復

使用道具 舉報

板凳
ID:66287 發表于 2018-3-14 09:30 | 只看該作者
程序寫的真好,能加上管理員密碼就好了。
回復

使用道具 舉報

地板
ID:276089 發表于 2018-4-8 22:47 | 只看該作者
我也想看看
回復

使用道具 舉報

5#
ID:367715 發表于 2018-7-9 10:55 | 只看該作者
下載不了
回復

使用道具 舉報

6#
ID:361206 發表于 2018-7-9 12:17 來自手機 | 只看該作者
這兩個資料有何不同
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产乱码精品一区二区三区中文 | 久久九九99| 日本 欧美 三级 高清 视频 | 国产亚洲精品a | 欧美一级一区 | 中文字幕免费在线 | 一级黄色夫妻生活 | 小草久久久久久久久爱六 | 久久国产精品视频观看 | 一级黄色大片 | 成人黄页在线观看 | 国产免费拔擦拔擦8x高清 | 精品久久久久久久久久久久久 | 成人在线欧美 | 国产成人影院 | 91免费在线看 | 中文字幕三区 | 亚洲成av人影片在线观看 | 亚洲综合成人网 | 中文字幕不卡在线观看 | 玖玖国产精品视频 | 福利视频1000 | 欧美激情综合网 | 亚洲国产aⅴ成人精品无吗 国产精品永久在线观看 | 久久人人爽人人爽人人片av免费 | 亚洲精品视频一区 | 日韩在线观看视频一区 | 91久久综合亚洲鲁鲁五月天 | 免费不卡av| 日本在线视频中文字幕 | 国内精品久久精品 | 久久久久亚洲 | 伊人精品在线视频 | 在线观看中文字幕视频 | 久久久久久影院 | 精品国产乱码久久久久久影片 | 91p在线观看 | 男女羞羞视频在线观看 | 特一级毛片 | 九九在线精品视频 | 久久高清国产视频 |