找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3089|回复: 6
收起左侧

基于普中51A2单片机开发板的电子锁程序

  [复制链接]
ID:952422 发表于 2021-7-20 10:03 | 显示全部楼层 |阅读模式
利用矩阵按键 蜂鸣器 数码管 定时器制作的一款电子锁
输入密码时显示为8.
密码正确显示-------------
密码错误显示ERROR
每次正确和错误蜂鸣器都会有不同的响声
错误达到三次键盘会被锁定20秒
在锁定中如果还有按键按下 则锁定时间重置

源代码如下:
  1. #include <reg52.h>
  2. #include <stdlib.h>

  3. #define GPIO_KEY P1
  4. #define num 8  //密码位数

  5. sbit bee=P1^5;

  6. sbit LSA=P2^2;
  7. sbit LSB=P2^3;
  8. sbit LSC=P2^4;

  9. unsigned int answer[8]={1,2,3,4,5,6,7,8};  //已设置密码
  10. unsigned int int_answer[8]={0,0,0,0,0,0,0,0};                                                //键盘输入的密码
  11. int key=-1;                                                                        //键值
  12. unsigned int error_times=0;                                                                //已错误次数
  13. unsigned char key_flag=0,a_flag=-1;
  14. unsigned int wei[8]={0};
  15. unsigned int T0Count=0;
  16. int *as;
  17. bit timer_flag=0;
  18. bit stop_flag=0;
  19. unsigned int code smgduan[]={0x00,0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};

  20. /*0x3f  , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d
  21.    0              1              2           3        4     5
  22. 0x7d , 0x07 , 0x7f  , 0x6f , 0x77 , 0x7c
  23.    6           7             8             9      A     B
  24. 0x39 , 0x5e , 0x79 , 0x71 , 0x00
  25.    C    D        E      F             NULL
  26. */

  27. void Timer0Init(void)                //10毫秒@11.0592MHz
  28. {
  29.         TMOD &= 0xF0;                //设置定时器模式
  30.         TMOD |= 0x01;                //设置定时器模式
  31.         TL0 = 0x00;                //设置定时初值
  32.         TH0 = 0xDC;                //设置定时初值
  33.         TF0 = 0;                //清除TF0标志
  34.         TR0 = 1;                //定时器0开始计时
  35.         ET0=1;
  36.         EA=1;
  37.         
  38. }

  39. void delay(unsigned int a)
  40. {
  41.         while(a--);
  42. }

  43. int keyDown()
  44. {
  45.         unsigned int a=0;
  46.                 GPIO_KEY=0x0f;
  47.         if(GPIO_KEY!=0x0f)
  48.         {
  49.                 delay(1000);
  50.                
  51.                 if(GPIO_KEY!=0x0f)
  52.                 {
  53.                         GPIO_KEY=0x0f;
  54.                         switch(GPIO_KEY)
  55.                         {
  56.                                 case 0x07:key=0;break;
  57.                                 case 0x0b:key=1;break;
  58.                                 case 0x0d:key=2;break;
  59.                                 case 0x0e:key=3;break;
  60.                         }
  61.                         GPIO_KEY=0xf0;
  62.                         switch(GPIO_KEY)
  63.                         {
  64.                                 case 0x70:key=key;break;
  65.                                 case 0xb0:key=key+4;break;
  66.                                 case 0xd0:key=key+8;break;
  67.                                 case 0xe0:key=key+12;break;
  68.                         }
  69.                         while((a<50)&&(GPIO_KEY!=0xf0))
  70.                         {
  71.                                 delay(1000);
  72.                                 a++;
  73.                         }
  74.                         key_flag=1;
  75.                 }
  76.         }
  77.                 return key;
  78. }

  79. void display() //数码管显示
  80. {
  81.                          LSA=0;LSB=0;LSC=0;P0=smgduan[wei[7]];delay(10);P0=0x00;
  82.                          LSA=1;LSB=0;LSC=0;P0=smgduan[wei[6]];delay(10);P0=0x00;
  83.                          LSA=0;LSB=1;LSC=0;P0=smgduan[wei[5]];delay(10);P0=0x00;
  84.                          LSA=1;LSB=1;LSC=0;P0=smgduan[wei[4]];delay(10);P0=0x00;
  85.                          LSA=0;LSB=0;LSC=1;P0=smgduan[wei[3]];delay(10);P0=0x00;
  86.                          LSA=1;LSB=0;LSC=1;P0=smgduan[wei[2]];delay(10);P0=0x00;
  87.                          LSA=0;LSB=1;LSC=1;P0=smgduan[wei[1]];delay(10);P0=0x00;
  88.                          LSA=1;LSB=1;LSC=1;P0=smgduan[wei[0]];delay(10);P0=0x00;
  89. }

  90. void display_no()
  91. {
  92.         wei[0]=15;
  93.         wei[1]=11;
  94.         wei[2]=11;
  95.         wei[3]=1;
  96.         wei[4]=11;
  97.         wei[5]=0;
  98.         wei[6]=0;
  99.         wei[7]=0;
  100.         display();
  101. }

  102. void display_yes()
  103. {
  104.         int i;
  105.         for(i=0;i<8;i++)
  106.         {
  107.                 wei[i]=17;
  108.         }
  109.         display();
  110. }

  111. /*void display_ans()
  112. {
  113.         
  114.         wei[7]=int_answer[0];
  115.         wei[6]=int_answer[1];
  116.         wei[5]=int_answer[2];
  117.         wei[4]=int_answer[3];
  118.         wei[3]=int_answer[4];
  119.         wei[2]=int_answer[5];
  120.         wei[1]=int_answer[6];
  121.         wei[0]=int_answer[7];
  122.         
  123.         display();
  124. }*/

  125. void beep(unsigned int mode)
  126. {
  127.         int k=0;
  128.         if(mode==1) //错误提示音
  129.         {
  130.                 do
  131.                 {
  132.                                 bee=~bee;
  133.                         delay(200);
  134.                         k++;
  135.                 }while(k<=1000);
  136.                 k=0;
  137.         }
  138.         else if(mode==2) //正确提示音
  139.         {
  140.                 do
  141.                 {
  142.                         bee=~bee;
  143.                         delay(100);
  144.                         k++;
  145.                 }while(k<=1000);
  146.                 k=0;
  147.         }
  148. }

  149. void stop() //暂停键盘三秒
  150. {
  151.                 stop_flag=1;
  152.          do
  153.          {
  154.                  key=-1;
  155.                         keyDown();
  156.                  if(key!=-1)
  157.                          T0Count=0;
  158.                  wei[0]=10;
  159.                  display();
  160.          }while(timer_flag==0);
  161. }

  162. /*void convert()
  163. {
  164.         switch(key)
  165.         {
  166.                 case 0:key_flag=0;break;
  167.                 case 1:key=0;key_flag=1;break;
  168.                 case 2:key_flag=0;break;
  169.                 case 3:key_flag=0;break;
  170.                 case 4:key=1;key_flag=1;break;
  171.                 case 5:key=2;key_flag=1;break;
  172.                 case 6:key=3;key_flag=1;break;
  173.                 case 7:key_flag=0;break;
  174.                 case 8:key=4;key_flag=1;break;
  175.                 case 9:key=5;key_flag=1;break;
  176.                 case 10:key=6;key_flag=1;break;
  177.                 case 11:key=10;key_flag=0;break;
  178.                 case 12:key=7;key_flag=1;break;
  179.                 case 13:key=8;key_flag=1;break;
  180.                 case 14:key=9;key_flag=1;break;
  181.                 case 15:key_flag=0;break;
  182.         }
  183. }*/

  184. void no()
  185. {
  186.         int j=0;
  187.         error_times++;   //错误次数+1
  188.         display_no();
  189.         beep(1);
  190.         for(j=0;j<num;j++)
  191.         {
  192.                 int_answer[j]=0;
  193.         }
  194. }

  195. void yes()
  196. {
  197.   beep(2);
  198.         while(1)
  199.         {
  200.                 display_yes();
  201.                 keyDown();
  202.                 if(key==3)
  203.                 {
  204.                         break;
  205.                 }
  206.         }
  207.         
  208. }

  209. void main()
  210. {
  211.         Timer0Init();
  212.         while(1)
  213.         {
  214.                 if(error_times<3)
  215.                 {
  216.                         
  217.                                 unsigned int i;
  218.                           i=0;
  219.                         wei[0]=16;
  220.                         do
  221.                         {
  222.                                 key=-1;
  223.                                 if((int_answer[i]=keyDown())!=-1)
  224.                                         i++;
  225.                         }while(key!=15);        
  226.                                 if(key==15)
  227.                                 {
  228.                                         for(i=0;i<num;i++)
  229.                                         {
  230.                                                 if(answer[i]!=int_answer[i])
  231.                                                 {
  232.                                                         a_flag=1;
  233.                                                         break;
  234.                                                 }
  235.                                                 else
  236.                                                         a_flag=0;
  237.                                         }
  238.                                 }
  239.                         if(a_flag==1)
  240.                         {
  241.                                 no();
  242.                         }
  243.                         else
  244.                         {
  245.                                 yes();
  246.                         }
  247.                 }
  248.                 else
  249.                 {
  250.                         stop();
  251.                         error_times=0;
  252.                 }
  253.                
  254.         }
  255. }

  256. void Timer0_Routine() interrupt 1 //10ms溢出一次
  257. {
  258.         TL0 = 0x00;                //设置定时初值
  259.         TH0 = 0xDC;
  260.         T0Count++;
  261.         display();
  262.         if(stop_flag==1)
  263.         {
  264.                 T0Count=0;
  265.                 if(T0Count==2000)
  266.                 {
  267.                         T0Count=0;
  268.                         timer_flag=1;
  269.                         stop_flag=0;
  270.                 }
  271.         }
  272.         
  273. }
复制代码
Keil代码工程51hei附件下载:
电子锁.7z (21.11 KB, 下载次数: 40)

评分

参与人数 1黑币 +30 收起 理由
admin + 30 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:1032582 发表于 2022-6-14 19:21 | 显示全部楼层
能分享一下怎么使用吗?
回复

使用道具 举报

ID:496636 发表于 2022-6-15 21:30 | 显示全部楼层
延时程序最好是采用中断来做,这样省下来的CPU资源可以做其它的事。对于实际工程开发很有用。
回复

使用道具 举报

ID:1083402 发表于 2023-6-20 02:01 来自手机 | 显示全部楼层
实物开发板需要连线吗
回复

使用道具 举报

ID:1086745 发表于 2023-7-1 10:36 | 显示全部楼层
(QAQ) 发表于 2022-6-14 19:21
能分享一下怎么使用吗?

兄弟你现在会了么,我现在用起来有点问题
回复

使用道具 举报

ID:161164 发表于 2023-7-3 13:31 | 显示全部楼层
Sakiyaaa 发表于 2023-7-1 10:36
兄弟你现在会了么,我现在用起来有点问题

有啥问题?
回复

使用道具 举报

ID:1087034 发表于 2023-7-3 15:55 | 显示全部楼层
如何连线呢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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