找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2152|回复: 1
打印 上一主题 下一主题
收起左侧

基于51单片机的模拟输入密码错误后续处理设计

[复制链接]
跳转到指定楼层
楼主
ID:365788 发表于 2018-7-7 22:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
模拟输入密码错误处理系统,用一个按键K3模拟密码字符的输入
用一个按键K4模拟密码输入确认,用一个LED来模拟报警,此时默认K3输入的密码都是错的,想要去自己去另外设计密码的可以自己去加功能,这里只是抛砖引玉,
基本要求:(1)当输入密码错误5次,则回收报警指示灯D0点亮20秒;
                (2)在回收报警指示灯D0亮起的20秒钟内,不接收按键上输入的密码信息。
                (3)20秒以后,可以重复之前的操作
说明:(1)本实验的每一次按键都写了松手检测,导致篇幅很长,有好的算法的朋友请告诉我有什么办法可以直接写一个函数就直接把十次按键都按下和松手都确定了,
          (2)本实验已经在硬件上测试过,稳定无误。
由于篇幅所限,下面只贴部分代码,具体代码请看附件

单片机源程序如下:


  1. #include<reg52.h>
  2. sbit K3 = P3^2; //外部中断0对应的按键变量
  3. sbit K4 = P3^3; //外部中断?对应的按键变量
  4. sbit led = P2^0;

  5. unsigned int Timercnt;
  6. unsigned char smguan[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67,0x77,0x7c,0x39,0x5E,0x79,0x71};
  7. unsigned char daojishigewei;
  8. unsigned char daojishishiwei;
  9. void MimaFun( );
  10. unsigned char JishuFun();

  11. unsigned int TouchTimeK3;
  12. unsigned int TouchTimeK4;
  13. unsigned int i;
  14. unsigned int  signal1,signal2,signal3,signal4,signal5;
  15. unsigned int signal6,signal7,signal8,signal9,signal10;
  16. void delay8(unsigned int t)
  17. {
  18.         while (--t);

  19. }



  20. void IntFun() interrupt 1     //中断函数
  21. {
  22.     Timercnt ++;                //计数次数

  23.     TH0=0xFC;                   //重装定时器初始值
  24.     TL0=0x17;

  25.     if(Timercnt == 1000)        //1000*1000us=1s
  26.     {   

  27.             
  28.         JishuFun();
  29.                
  30.         Timercnt = 0;

  31.     }
  32. }

  33. unsigned char JishuFun()                //20秒时间倒计时程序
  34. {
  35.         if((daojishigewei==0)&&(daojishishiwei!=0))
  36.         {
  37.                 daojishishiwei--;
  38.                 daojishigewei=9;
  39.                 return 0;
  40.         }
  41.         if(daojishigewei!=0)
  42.         {
  43.                 daojishigewei--;
  44.         }
  45.         if(daojishigewei==0&&(daojishishiwei==0))
  46.         {
  47.                 P0=0xfe;
  48.         
  49.         }
  50. }




  51. void main( )
  52. {
  53.     /*中断系统的定义*/
  54.     IT0 = 1;   //外部中断0的边沿信号
  55.     EX0 = 1;   //外部中断0的中断允许
  56.     EA  = 1;   //CPU的中断总允许

  57.     TR0 = 0;   //定时器0的开启
  58.     ET0 = 1;   //定时器0的中断允许
  59.     EA  = 1;   //CPU的中断总允许

  60.     TMOD=0x01;      //定时器T0,方式一,16位
  61.     TH0=0xFC;       //计1000次,每次1000微秒,计数初始值64535
  62.     TL0=0x17;  

  63.     daojishigewei=9;        //倒计时初始化,此处从19开始是因为0~1也算是一秒
  64.         daojishishiwei=1;   

  65.     TouchTimeK3=0;
  66.     TouchTimeK4=0;

  67.         

  68.     while(1)     //动态停机,等待中断信号
  69.         {   
  70.         //第一次按下K3,K4按键
  71.         if(TouchTimeK3==0  && K3==0)      //第一次按下K3按键
  72.         {
  73.                 delay8(1000);  //消抖
  74.                 if(K3==0)       //确认第一次K3按键已经按下
  75.                 {  
  76.                     
  77.                     signal1=1;

  78.                         
  79.                 }
  80.         }
  81.         if(signal1==1 && K3==1)    //第一次K3按键松手
  82.             {
  83.                 delay8(1000);
  84.                 if(K3==1)           //确认第一次K3按键已经松手
  85.                 {
  86.                     TouchTimeK3=1;    //第一次按键成功,按键次数记为1
  87.                
  88.                     signal1=0;   //标志位回0,以免误操作
  89.                 }
  90.             }

  91.         if(TouchTimeK4==0  && K4==0)      //第一次按下K4按键
  92.         {
  93.                 delay8(1000);  //消抖
  94.                 if(K4==0)       //确认第一次K4按键已经按下
  95.                 {  
  96.                     
  97.                     signal2=1;

  98.                         
  99.                 }
  100.             }
  101.         if(signal2==1 && K4==1)    //第一次K4按键松手
  102.             {
  103.                 delay8(1000);
  104.                 if(K4==1)           //确认第一次K4按键已经松手
  105.                 {
  106.                     TouchTimeK4=1;    //第一次K4按键成功,按键次数记为1
  107.                
  108.                     signal2=0;   //标志位回0,以免误操作
  109.                 }
  110.             }
  111.         
  112.         //第二次按下K3,K4按键
  113.         if(TouchTimeK3==1  && K3==0)      //第二次按下K3按键
  114.         {
  115.                 delay8(1000);  //消抖
  116.                 if(K3==0)       //确认第二次K3按键已经按下
  117.                 {  
  118.                     
  119.                     signal3=1;

  120.                         
  121.                 }
  122.         }
  123.      if(signal3==1 && K3==1)    //第二次K3按键松手
  124.         {
  125.             delay8(1000);
  126.             if(K3==1)           //确认第二次K3按键已经松手
  127.             {
  128.                 TouchTimeK3=2;    //第二次按键成功,按键次数记为1
  129.                
  130.                 signal3=0;   //标志位回0,以免误操作
  131.             }
  132.         }

  133.         if(TouchTimeK4==1  && K4==0)      //第二次按下K4按键
  134.         {
  135.                 delay8(1000);  //消抖
  136.                 if(K4==0)       //确认第二次K4按键已经按下
  137.                 {  
  138.                     
  139.                     signal4=1;

  140.                         
  141.                 }
  142.             }
  143.         if(signal4==1 && K4==1)    //第一次K4按键松手
  144.             {
  145.                 delay8(1000);
  146.                 if(K4==1)           //确认第一次K4按键已经松手
  147.                 {
  148.                     TouchTimeK4=2;    //第一次K4按键成功,按键次数记为1
  149.                
  150.                     signal4=0;   //标志位回0,以免误操作
  151.                 }
  152.             }

  153.             //第三次按下K3,K4按键
  154.             if(TouchTimeK3==2  && K3==0)      //第三次按下K3按键
  155.             {
  156.                     delay8(1000);  //消抖
  157.                     if(K3==0)       //确认第三次K3按键已经按下
  158.                     {  
  159.                         
  160.                         signal5=1;

  161.                            
  162.                     }
  163.             }
  164.             if(signal5==1 && K3==1)    //第三次K3按键松手
  165.                 {
  166.                     delay8(1000);
  167.                     if(K3==1)           //确认第三次K3按键已经松手
  168.                     {
  169.                         TouchTimeK3=3;    //第三次按键成功,按键次数记为1
  170.                     
  171.                         signal5=0;   //标志位回0,以免误操作
  172.                     }
  173.                 }

  174.             if(TouchTimeK4==2  && K4==0)      //第三次按下K4按键
  175.             {
  176.                     delay8(1000);  //消抖
  177.                     if(K4==0)       //确认第一次K4按键已经按下
  178.                     {  
  179.                         
  180.                         signal6=1;

  181.                            
  182.                     }
  183.                 }
  184.         if(signal6==1 && K4==1)    //第一次K4按键松手
  185.             {
  186.                 delay8(1000);
  187.                 if(K4==1)           //确认第一次K4按键已经松手
  188.                 {
  189.                     TouchTimeK4=3;    //第一次K4按键成功,按键次数记为1
  190.                
  191.                     signal6=0;   //标志位回0,以免误操作
  192.                 }
  193.             }
  194.         //第四次按下K3,K4按键
  195.         if(TouchTimeK3==3  && K3==0)      //第四次按下K3按键
  196.         {
  197.                 delay8(1000);  //消抖
  198.                 if(K3==0)       //确认第四次K3按键已经按下
  199.                 {  
  200.                     
  201.                     signal7=1;

  202.                         
  203.                 }
  204.         }
  205.      if(signal7==1 && K3==1)    //第四次K3按键松手
  206.         {
  207.             delay8(1000);
  208.             if(K3==1)           //确认第四次K3按键已经松手
  209.             {
  210.                 TouchTimeK3=4;    //第四次K3按键成功,按键次数记为1
  211.                
  212.                 signal7=0;   //标志位回0,以免误操作
  213.             }
  214.         }

  215.         if(TouchTimeK4==3  && K4==0)      //第四次按下K4按键
  216.         {
  217.                 delay8(1000);  //消抖
  218.                 if(K4==0)       //确认第四次K4按键已经按下
  219.                 {  
  220.                     
  221.                     signal8=1;

  222.                         
  223.                 }
  224.             }
  225.         if(signal8==1 && K4==1)    //第四次K4按键松手
  226.             {
  227.                 delay8(1000);
  228.                 if(K4==1)           //确认第四次K4按键已经松手
  229.                 {
  230.                     TouchTimeK4=4;    //第四次K4按键成功,按键次数记为1
  231.                
  232.                     signal8=0;   //标志位回0,以免误操作
  233.                 }
  234.             }
  235.         //第五次按下K3,K4按键
  236.         if(TouchTimeK3==4  && K3==0)      //第五次按下K3按键
  237.         {
  238.                 delay8(1000);  //消抖
  239.                 if(K3==0)       //确认第五次K3按键已经按下
  240.                 {  
  241.                     
  242.                     signal9=1;

  243.                         
  244.                 }
  245.         }
  246.         if(signal9==1 && K3==1)    //第五次K3按键松手
  247.         {
  248.             delay8(1000);
  249.             if(K3==1)           //确认第五次K3按键已经松手
  250.             {
  251.                 TouchTimeK3=5;    //第五次按键成功,按键次数记为1
  252.                
  253.                 signal9=0;   //标志位回0,以免误操作
  254.             }
  255.         }

  256.         if(TouchTimeK4==1  && K4==0)      //第五次按下K4按键
  257.         {
  258.                 delay8(1000);  //消抖
  259.                 if(K4==0)       //确认第五次K4按键已经按下
  260.                 {  
  261.                     
  262.                     signal10=1;

  263.                         
  264.                 }
  265.             }
  266.         if(signal10==1 && K4==1)    //第五次K4按键松手
  267.             {
  268.                 delay8(1000);
  269.                 if(K4==1)           //确认第五次K4按键已经松手
  270.                 {
  271.                     TouchTimeK4=5;    //第五次K4按键成功,按键次数记为1
  272.                
  273.                     signal10=0;   //标志位回0,以免误操作
  274.                 }
  275.             }

  276.         
  277.         if(K3!=0 && K4!=0 && TouchTimeK3==5  && TouchTimeK4==5) //k3和k4都分别已经按下5次
  278.         {   
  279.                         TR0=1;                       //k3、k4都分别已经按下5次之后就使定时器T0开启,开始计时
  280.                                        

  281.                         for(i=0;i<=19;i++)  //循环语句使数码管从19到0都点亮
  282.                         {

  283.             led=0;  // 输出的指示小灯,用来模拟回收报警


  284.             P2=0x18;     //数码管显示从19倒数到0的20s倒计时
  285.             P0=smguan[daojishigewei];
  286.             delay8(500);

  287.             P2=0x1c;
  288.             P0=smguan[daojishishiwei];
  289.             delay8(500);
  290.             
  291.             P0=smguan[0x00];

  292.         
  293.                     }

  294.             if(i>19)
  295.             {
  296.                 led=1;  //20s结束,LED小灯熄灭
  297.             }

  298.                         

  299.         }
  300.    
  301.         }


  302. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:383374 发表于 2019-1-22 20:37 来自手机 | 只看该作者
不错的东西
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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