找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4863|回复: 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)

评分

参与人数 1黑币 +4 收起 理由
a455914479 + 4

查看全部评分

回复

使用道具 举报

ID:1 发表于 2018-3-14 05:33 | 显示全部楼层
好资料 能分享个原理图吗?
回复

使用道具 举报

ID:66287 发表于 2018-3-14 09:30 | 显示全部楼层
程序写的真好,能加上管理员密码就好了。
回复

使用道具 举报

ID:276089 发表于 2018-4-8 22:47 | 显示全部楼层
我也想看看
回复

使用道具 举报

ID:367715 发表于 2018-7-9 10:55 | 显示全部楼层
下载不了
回复

使用道具 举报

ID:361206 发表于 2018-7-9 12:17 来自手机 | 显示全部楼层
这两个资料有何不同
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表