找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机密码锁程序设计

[复制链接]
跳转到指定楼层
楼主
这是简单密码锁设计,设计的

  1. //定义IO口
  2. sbit Beep=P3^6;
  3. sbit LED1=P3^7;
  4. //定义全局变量
  5. int count=-1;
  6. int count1=0;//用于记录输入密码错误的次数
  7. int counter;//用于计数是定时器能够定时1分钟
  8. int counter1=0;
  9. int temp=99,signal=0;
  10. //初始化密码
  11. int key_word[4]={99,99,99,99};
  12. //用于接收按键接收的值
  13. int get_word[4]={0,0,0,0};
  14. char key_buf[]={0xee,0xde,0xbe,0x7e,
  15.                                 0xed,0xdd,0xbd,0x7d,
  16.                                 0xeb,0xdb,0xbb,0x7b,
  17.                 0xe7,0xd7,0xb7,0x77};//键模
  18. //LED字模
  19. char led[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9
  20. //函数声明
  21. void set_key();
  22. void show1(int);
  23. void open_key();
  24. void input_key();
  25. void show2(int);
  26. void show3();
  27. void show4();
  28. int get_key();
  29. //延时函数
  30. void delay(int x)
  31. {
  32.         int j=0;
  33.         for(;x>0;x--)
  34.                 for(j=0;j<125;j++);
  35. }

  36. //设定密码功能
  37. void set_key()
  38. {
  39.         int i;
  40.         for(i=0;i<4;i++)
  41.         {        
  42.                 while(get_key()==-1)//等待按键按下
  43.                 {
  44.                         if(count!=0&&count!=-1)
  45.                         {
  46.                                 show1(count);//显示设置的密码
  47.                         }
  48.                 }
  49.                 if(signal==1)//将按键的值保存
  50.                 {
  51.                         key_word[i]=get_key();
  52.                         count++;
  53.                         show1(count);
  54.                         signal=0;
  55.                         temp=99;
  56.                 }
  57.                 while(temp==get_key())//一旦长时间按按键,就一直显示密码
  58.                 {        
  59.                         show1(count);
  60.                 }
  61.         }
  62. }

  63. //输入密码
  64. void input_key()
  65. {
  66.         int i;
  67.         for(i=0;i<4;i++)
  68.         {        
  69.                 while(get_key()==-1)//等待按键按下
  70.                 {
  71.                         if(count!=0&&count!=-1)
  72.                         {
  73.                                 show2(count);//显示设置的密码
  74.                         }
  75.                 }
  76.                 if(signal==1)//将按键的值保存
  77.                 {
  78.                         get_word[i]=get_key();
  79.                         count++;
  80.                         show2(count);
  81.                         signal=0;
  82.                         //temp=99;
  83.                 }
  84.                 while(temp==get_key())//一旦长时间按按键,就一直显示密码
  85.                 {        
  86.                         show2(count);
  87.                 }
  88.         }
  89. }
  90. //显示输入的密码
  91. void show2(int count)
  92. {
  93.         if(count==0)//显示1位数据
  94.         {
  95.                 P1=0x0e;
  96.                 P0=led[get_word[0]];
  97.         }
  98.         if(count==1)//显示2位数据
  99.         {
  100.                 P1=0x0e;
  101.                 P0=led[get_word[0]];
  102.                 delay(10);
  103.                 P1=0x0d;
  104.                 P0=led[get_word[1]];
  105.                 delay(10);
  106.         }
  107.         
  108.         if(count==2)//显示3位数据
  109.         {
  110.                 P1=0x0e;
  111.                 P0=led[get_word[0]];
  112.                 delay(10);
  113.                 P1=0x0d;
  114.                 P0=led[get_word[1]];
  115.                 delay(10);
  116.                 P1=0x0b;
  117.                 P0=led[get_word[2]];
  118.                 delay(10);
  119.         }
  120.         if(count==3)//显示4位数据
  121.         {
  122.                         P1=0x0e;
  123.                         P0=led[get_word[0]];
  124.                         delay(10);
  125.                         P1=0x0d;
  126.                         P0=led[get_word[1]];
  127.                         delay(10);
  128.                         P1=0x0b;
  129.                         P0=led[get_word[2]];
  130.                         delay(10);
  131.                         P1=0x07;
  132.                         P0=led[get_word[3]];
  133.                         delay(10);
  134.                         P0=0;
  135.                         //count=-1;
  136.                         signal=0;
  137.         }
  138. }
  139. //显示设置的密码
  140. void show1(int count)
  141. {
  142.         int i;
  143.         if(count==0)//显示一位数据
  144.         {
  145.                 P1=0x0e;
  146.                 i=key_word[0];
  147.                 P0=led[i];
  148.         }
  149.         if(count==1)//显示两位数据
  150.         {
  151.                 P1=0x0e;
  152.                 P0=led[key_word[0]];
  153.                 delay(10);
  154.                 P1=0x0d;
  155.                 P0=led[key_word[1]];
  156.                 delay(10);
  157.         }
  158.         
  159.         if(count==2)//显示三位数据
  160.         {
  161.                 P1=0x0e;
  162.                 P0=led[key_word[0]];
  163.                 delay(10);
  164.                 P1=0x0d;
  165.                 P0=led[key_word[1]];
  166.                 delay(10);
  167.                 P1=0x0b;
  168.                 P0=led[key_word[2]];
  169.                 delay(10);
  170.         }
  171.         if(count==3)//显示四位数据
  172.         {
  173.                 P1=0x0e;
  174.                 P0=led[key_word[0]];
  175.                 delay(10);
  176.                 P1=0x0d;
  177.                 P0=led[key_word[1]];
  178.                 delay(10);
  179.                 P1=0x0b;
  180.                 P0=led[key_word[2]];
  181.                 delay(10);
  182.                 P1=0x07;
  183.                 P0=led[key_word[3]];
  184.                 delay(10);
  185.                 P0=0;
  186.                 count=-1;
  187.                 signal=0;
  188.         }
  189. }


  190. //主函数
  191. void main()
  192. {
  193.         int op;
  194.         LED1=0;
  195.         Beep=1;
  196.         while(1)
  197.         {
  198.                 op=get_key();
  199.                 switch(op)
  200.                 {
  201.                         case 13:
  202.                                         while(temp==get_key());//等待选择功能按键释放后再进行设置密码
  203.                                         count=-1;//在使用标志位时将标志位进行初始化
  204.                                         signal=1;
  205.                                         set_key();
  206.                                         break;
  207.                         
  208.                         case 14:
  209.                                         while(temp==get_key());
  210.                                         count=-1;//初始化标志位
  211.                                         signal=1;
  212.                                         input_key();
  213.                                         while(get_key()!=15)//当按下登陆键,输入的密码不再显示
  214.                                         {
  215.                                                 show2(count);
  216.                                         }
  217.                                         if(compare()==-1)
  218.                                         {
  219.                                                 count1++;
  220.                                                 while(get_key()!=14&&count1!=3)
  221.                                                 {
  222.                                                         show3();//密码错误,显示ERR
  223.                                                 }
  224.                                                 P0=0;//按下输入密码键后,清屏
  225.                                                 if(count1==3)
  226.                                                 {
  227.                                                         //开启定时器中断
  228.                                                         TMOD=0x01;
  229.                                                         TH0=0x9E;//装载初值25ms
  230.                                                         TL0=0x58;
  231.                                                         EA=1; //开总中断
  232.                                                         ET0=1;//开定时器0
  233.                                                         TR0=1;  //开启定时器0
  234.                                                         while(counter1<60);//只有当蜂鸣器响完一分钟之后,才能退出循环
  235.                                                         TR0=0;//关闭定时器
  236.                                              }
  237.                                         }
  238.                                         else
  239.                                         {        
  240.                                                 LED1=1;//当输入密码正确时,开启LED灯
  241.                                                 while(get_key()!=12)//直到按下退出键,屏幕一直显示on
  242.                                                 {
  243.                                                         show4();
  244.                                                 }
  245.                                                 LED1=0;//退出后关闭LED灯
  246.                                                 P0=0;//清屏
  247.                                         }
  248.                                         break;
  249.                         default:break;               
  250.                 }
  251.         }

  252. }

  253. //获取键值
  254. int get_key()
  255. {
  256.         char key_scan[]={0xef,0xdf,0xbf,0x7f};
  257.         int i=0;
  258.         int j=0;
  259.         for(i=0;i<4;i++)//判断
  260.         {
  261.                 P2=key_scan[i];
  262.                 if((P2&0x0f)!=0x0f)
  263.                 {
  264.                         for(j=0;j<16;j++)
  265.                         {
  266.                                 if(key_buf[j]==P2)
  267.                                 {
  268.                                         if(temp!=key_buf[j])//一旦长时间按键,将只会读取一次按键的值
  269.                                         {
  270.                                                 signal=1;
  271.                                                 temp=j;
  272.                                                 return j;
  273.                                         }
  274.                                         else signal=0;
  275.                                 }
  276.                         }
  277.                 }
  278.         }
  279.         return -1;
  280. }




  281. //输入的密码和设定的密码比较
  282. int compare()
  283. {
  284.         int i;
  285.         for(i=0;i<4;i++)
  286.         {
  287.                 if(get_word[i]!=key_word[i])
  288.                         return -1;//输入密码不等于设定的密码返回-1
  289.         }
  290.         return 1;//输入的密码等于设定密码返回1
  291. }

  292. void show3()//显示ERR
  293. {
  294.         P1=0x0e;
  295.         P0=0x79;
  296.         delay(10);
  297.         P1=0x0d;
  298.         P0=0x77;
  299.         delay(10);
  300.         P1=0x0b;
  301.         delay(10);
  302. }
  303. void show4()//显示on
  304. {
  305.         P1=0x0e;
  306.         P0=0x5c;
  307.         delay(10);
  308.         P1=0x0d;
  309.         P0=0x54;
  310.         delay(10);
  311. }

  312. //定时器中断函数,定时1分钟
  313. call_police() interrupt 1
  314. {
  315.         counter++;
  316.         if(counter==39)
  317.         {        
  318.                 counter=0;
  319.                 Beep=~Beep;
  320.                 counter1++;
  321.                 if(counter1==60)//定时一分钟
  322.                 {
  323.                         count1=0;
  324.                         Beep=1;//关闭定时器
  325.                 }
  326.         }
  327.         else
  328.         {
  329.                 TH0=0x9E;
  330.                 TL0=0x58;
  331.         }
  332. }
复制代码
比较简单
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:773272 发表于 2020-6-9 16:28 | 只看该作者
为什么我的没反应?
回复

使用道具 举报

板凳
ID:613116 发表于 2020-6-12 19:35 | 只看该作者
逻辑应该清晰一点,功能都比较完善了,代码结构能清晰点就好了
回复

使用道具 举报

地板
ID:613116 发表于 2020-6-12 19:46 | 只看该作者
其实用数码管显示让整个代码显得很冗长,可以尝试用下1602液晶
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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