找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1201|回复: 2
收起左侧

在做一个单片机电子密码锁 小灯的功能实现了 但数码管和响声不管用 咋整

[复制链接]
ID:771806 发表于 2020-6-27 16:47 | 显示全部楼层 |阅读模式
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uchar i,j,num,temp,wrong;
  5. uchar passw[]={1,2,3,4,5,6,7,8};
  6. uchar passt[]= {0,0,0,0,0,0,0,0};
  7. uchar code table[]= {
  8.       0x3f,0x06,0x5b,0x4f,
  9.       0x66,0x6d,0x7d,0x07,
  10.       0x7f,0x6f,0x77,0x7c,
  11.       0x39,0x5e,0x79,0x71,
  12.       0x76,0x79,0x38,0x3f,0};
  13. bit lockflag;
  14. bit editflag;
  15. bit cmpflag;
  16. bit pressflag;
  17. sbit alarm=P1^3;
  18. sbit rled=P1^0;
  19. sbit gled=P1^1;
  20. sbit yled=P1^2;
  21. uint t0,a;
  22. uchar right;
  23. void delay(uint z)
  24.   { uint x,y;
  25.     for(x=z;x>0;x--)
  26.     for(y=110;y>0;y--);
  27.   }
  28. void lock()
  29. {
  30.   TMOD=0x01;
  31.   TH0=(65536-50000)/256;
  32.   TL0=(65536-50000)%256;
  33.   ET0=1;
  34.   EA=1;
  35.   TR0=1;
  36.   while(1)
  37.      {
  38.     if(t0<1200)
  39.     {
  40.         alarm=0;
  41.         for(a=2000;a>0;a--)
  42.   {
  43.    }
  44.        rled=~rled;
  45.        delay( 1000);
  46.         }
  47.   else
  48.   {
  49.    alarm=0;
  50.    rled=1;
  51.    TR0=0;
  52.    t0=0;
  53.    break;
  54.    }
  55.        }
  56. }
  57. void timer0() interrupt 1
  58. {
  59.   TH0=(65536- 50000)/256;
  60.   TL0=(65536-50000)%256;
  61.   t0++;
  62. }
  63. uchar keyscan()
  64. {
  65.   P3=0xfe;
  66.   temp=P3;
  67.   temp=P3&0xf0;
  68.   while(temp!=0xf0)
  69.   {
  70.    delay(50);
  71.    
  72.    if(temp!=0xf0)
  73.     {
  74.      temp=P3;
  75.      switch(temp)
  76.       {
  77.      case 0xee: {num=0;pressflag=1;} //1110 1110
  78.         break;
  79.         case 0xde: {num= 1;pressflag=1;} //1101 1110
  80.         break;
  81.         case 0xbe: {num=2;pressflag=1;} //1010 1110
  82.         break;
  83.         case 0x7e: {num=3;pressflag=1;} //0111 1110
  84.         break;
  85.   }
  86.         while(temp!=0xf0)
  87.          {
  88.           temp=P3;
  89.           temp=temp&0xf0;
  90.          }
  91.     }
  92. }
  93. P3=0xfd;
  94. temp=P3;
  95. temp=P3&0xf0;
  96. while(temp!=0xf0)
  97. {
  98.   delay(50);
  99.   if(temp!=0xf0)
  100.   {
  101.    temp=P3;
  102.    switch(temp)
  103.    {
  104.     case 0xed: {num=4;pressflag=1;}
  105.     break;
  106.     case 0xdd: {num=5;pressflag=1;}
  107.     break;
  108.     case 0xbd: {num=6;pressflag=1;}
  109.     break;
  110.     case 0x7d: {num=7;pressflag=1;}
  111.     break;
  112. }
  113.     while(temp!=0xf0)
  114.     {
  115.      temp=P3;
  116.      temp=temp&0xf0;
  117.     }
  118.    }
  119. }
  120. P3=0xfb;
  121. temp=P3;
  122. temp=P3&0xf0;
  123. while(temp!=0xf0)
  124. {
  125.   delay(50);
  126.   if(temp!=0xf0)
  127.    {
  128.     temp=P3;
  129.     switch(temp)
  130.      {
  131.       case 0xeb: {num=8;pressflag=1;}
  132.       break;
  133.       case 0xdb: {num=9;pressflag=1;}
  134.       break;
  135.       case 0xbb: {num= 10;pressflag=1;}
  136.       break;
  137.    }
  138.       while(temp!=0xf0)
  139.       {
  140.         temp=P3;
  141.         temp=temp&0xf0;
  142.       }
  143.     }
  144.   }
  145. return num;
  146. }
  147. void input()
  148. {
  149.   while(num!=10)
  150.   {
  151.    keyscan();
  152.    }
  153.   if(num== 10)
  154.   {
  155.    pressflag=0;
  156.    yled=0;
  157.    for(i=0;i<8;i++)
  158.    {
  159.     while(!pressflag)
  160.     {
  161.      keyscan();
  162.     }
  163.     pressflag=0;
  164.     temp=num;
  165.     if(temp!=10)
  166.     {
  167.      if(!editflag)
  168.      passt[i]=temp;
  169.      else
  170.      passw[i]=temp;
  171.      P0=table[num];
  172.     }
  173.     else
  174.     break;
  175.    }
  176.    yled=1;
  177.    cmpflag=~editflag;
  178.    delay(200);
  179.    P0=0;
  180.    num=0;
  181.    }
  182.   }
  183. main()
  184. {
  185.   i=0;
  186.   j=0;
  187.   lockflag=0;
  188.   editflag=0;
  189.   pressflag=0;
  190.   P0=0;
  191.   while(1)
  192.   {
  193.     input();
  194.     if(cmpflag)
  195.     {
  196.      cmpflag=0;
  197.      for(j=0;j<8;j++)
  198.      {
  199.       if(passw[j]!=passt[j])
  200.        {
  201.         if(wrong==2)
  202.         {
  203.           wrong=0;
  204.           lock();
  205.         }
  206.         else
  207.         {
  208.          gled=1;
  209.          rled=0;
  210.          alarm=0;
  211.          for(a=5000;a>0;a--)
  212.         {
  213.          }
  214.          delay(500);
  215.          rled=1;
  216.          alarm=1;
  217.          wrong++;
  218.         }
  219.         break;
  220.        }
  221.        else
  222.        {
  223.         if(j==7)
  224.          {
  225.           rled=1;
  226.           gled=0;
  227.           editflag=1;
  228.           input();
  229.           editflag=0;
  230.           gled=1;
  231.           wrong=0;
  232.          }
  233.        }
  234.      }
  235.    }
  236. }
  237. }
复制代码
回复

使用道具 举报

ID:771806 发表于 2020-6-27 17:11 | 显示全部楼层
仿真图

这是仿真图

这是仿真图
回复

使用道具 举报

ID:332444 发表于 2020-6-28 20:46 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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