找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4738|回复: 3
收起左侧

51单片机密码锁程序与电路图

[复制链接]
ID:853596 发表于 2020-12-30 23:34 | 显示全部楼层 |阅读模式
51hei图片20201230233743.png
功能描述,开机无显示。
按下除号,开始输入密码,显示短线,初始密码为0000。
输入完后,按下on/c键,确定。正确显示open,错误显示err。
=键为取消键,输入密码过程中,按下取消键,数码管全亮1s,然后灭掉。恢复初始状态。
按下乘号,设置密码,此时数码管显示短线。
输入正确密码后,进入更改密码状态,显示全F。
输入更改后密码,按下on/C键,确认。
PS:1输入任意时刻,都可按等号返回初始状态。2输入时,数字会相应的显示。

通过Protues仿真,电路图为protues输出的。

单片机源程序如下:
  1. #include <reg52.h>
  2. #define uint8 unsigned char
  3. #define uint16 unsigned int

  4. //数码管编码。
  5. uint8 code SEG7LED[26] = {0x3f,0x06,0x5b,0X4F,
  6.                                                   0x66,0x6D,0x7D,0x07,
  7.                                                   0x7F,0x6F,0x77,0x7C,
  8.                                                   0x39,0x5E,0x79,0x71,
  9.                                                   0x00,0x40,0xff,      
  10.                                                   0x3f,0x73,0x79,0x37, //open
  11.                                                   0x79,0x77,0x77};                //err
  12. //变量声明
  13. uint8 Ge,Shi,Bai,Qian;//数码管各个位
  14. uint8 WeiNum=1;
  15. uint8 code P1Pin[9] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff};
  16. uint8 state=0;//记录密码锁状态,0为待机状态,1为输入密码,2,3为设置密码
  17. uint8 InputNum=1;//记录输入密码时,目前密码的位数。
  18. uint8 InPassWord[4];
  19. uint8 PassWord[4]={0,0,0,0};
  20. //函数声明
  21. void initTimer0();
  22. void display(uint8 WeiNum);
  23. uint8 keyscan();
  24. void delayms(uint16 Xms);
  25. void password(uint8 key);
  26. uint8 Compare(uint8 InPassWord[4]);

  27. void main()
  28. {
  29.         uint8 key;
  30.         initTimer0();
  31.         while(1)
  32.         {
  33.                 key = keyscan();
  34.                 password(key);
  35.         }
  36. }

  37. void initTimer0()
  38. {
  39.         EA = 1;
  40.         ET0 = 1;
  41.         TMOD = 0X01;
  42.         TH0 = (65535-5000)/256;
  43.         TL0 = (65535-5000)%256;
  44.         TR0 = 1;
  45. }

  46. void Timer0() interrupt 1
  47. {
  48.         TH0 = (65535-5000)/256;
  49.         TL0 = (65535-5000)%256;
  50. display(WeiNum);
  51.         WeiNum ++;
  52.         if(WeiNum==5)
  53.                 WeiNum = 1;
  54. }

  55. void display(uint8 WeiNum)
  56. {
  57.         switch(WeiNum)
  58.         {
  59.                 case 1:
  60.                 {
  61.                         P2 = 0xff;
  62.                         P0 = SEG7LED[Qian];
  63.                         P2 = 0xfe;
  64.                         break;
  65.                 }
  66.                 case 2:
  67.                 {
  68.                         P2 = 0xff;
  69.                         P0 = SEG7LED[Bai];
  70.                         P2 = 0xfd;
  71.                         break;
  72.                 }
  73.                 case 3:
  74.                 {
  75.                         P2 = 0xff;
  76.                         P0 = SEG7LED[Shi];
  77.                         P2 = 0xfb;
  78.                         break;
  79.                 }
  80.                 case 4:
  81.                 {

  82.                         P2 = 0xff;
  83.                         P0 = SEG7LED[Ge];
  84.                         P2 = 0xf7;
  85.                         break;
  86.                 }
  87.                 default:
  88.                 {
  89.                         P2 = 0xff;
  90.                         P0 = 0xff;
  91.                         P2 = 0xff;
  92.                         break;
  93.                 }
  94.         }
  95. }

  96. void delayms(uint16 Xms)
  97. {
  98.         uint16 i,j;
  99.         for(i=Xms;i>0;i--)
  100.                 for(j=110;j>0;j--);
  101. }

  102. uint8 keyscan()
  103. {
  104.         uint8 i=0;
  105.         uint8 key8=0xff;
  106.         uint8 key=0xff;
  107.         uint8 Button;
  108.         for(i=0;i<4;i++)
  109.         {
  110.                 P1 = P1Pin[ i];
  111.                 Button = P1;
  112.                 if(Button != P1Pin[ i])
  113.                 {
  114.                         delayms(5);
  115.                         Button = P1;
  116.                         if(Button != P1Pin[ i])
  117.                         {
  118.                                 key8 = Button;
  119.                         }
  120.                         while(Button != P1Pin[ i])
  121.                         {        Button = P1;        }
  122.                 }
  123.         }
  124.         switch(key8)
  125.         {//0~9数字键,12确定,14取消,10输入密码,11设置密码。
  126.                 case 0xee:{key = 7;break;}
  127.                 case 0xde:{key = 8;break;}
  128.                 case 0xbe:{key = 9;break;}
  129.                 case 0x7e:{key = 10;break;}
  130.                 case 0xed:{key = 4;break;}
  131.                 case 0xdd:{key = 5;break;}
  132.                 case 0xbd:{key = 6;break;}
  133.                 case 0x7d:{key = 11;break;}
  134. case 0xeb:{key = 1;break;}
  135.                 case 0xdb:{key = 2;break;}
  136.                 case 0xbb:{key = 3;break;}
  137.                 case 0x7b:{key = 15;break;}
  138.                 case 0xe7:{key = 12;break;}
  139.                 case 0xd7:{key = 0;break;}
  140.                 case 0xb7:{key = 14;break;}
  141.                 case 0x77:{key = 16;break;}
  142.                 default:{key = 0xff;break;}
  143.         }
  144.         return key;        
  145. }

  146. void password(uint8 key)
  147. {//0~9数字键,12确定,14取消,10输入密码,11设置密码。
  148.         uint8 i;
  149.         if(key!=0xff)
  150.         {
  151.                 switch(state)
  152.                 {
  153.                         case 0:
  154.                         {
  155.                                 if(key == 10)
  156.                                 {
  157.                                         state = 1;
  158.                                         Ge =17;Shi=17;Bai=17;Qian=17;
  159.                                 }
  160.                                 else if(key == 11)
  161.                                 {
  162.                                         state = 2;
  163.                                         Ge =17;Shi=17;Bai=17;Qian=17;
  164.                                 }        
  165.                                 break;
  166.                         }
  167.                         case 1:
  168.                         {
  169.                                 if(key>=0 && key <= 9)
  170.                                 {
  171.                                         switch(InputNum)
  172.                                         {
  173.                                                 case 1:
  174.                                                         Ge = key;InPassWord[0]=key;
  175.                                                         break;
  176.                                                 case 2:
  177.                                                         Shi = key;InPassWord[1]=key;
  178.                                                         break;
  179.                                                 case 3:
  180.                                                         Bai = key;InPassWord[2]=key;
  181.                                                         break;
  182.                                                 case 4:
  183.                                                         Qian =key;InPassWord[3]=key;
  184.                                                         break;
  185.                                                 default:
  186.                                                         break;
  187.                                         }
  188.                                         if(InputNum<5)
  189.                                                 InputNum++;
  190.                                 }
  191.                                 else if(key == 12)
  192.                                 {
  193.                                         if(Compare(InPassWord))
  194.                                         {        
  195.                                                 Ge =22;Shi=21;Bai=20;Qian=19;
  196.                                                 for(i=0;i<4;i++)
  197.                                                         InPassWord[ i] = 0xff;
  198.                                         }//open
  199.                                         else
  200.                                         {        Ge =16;Shi=25;Bai=24;Qian=23;}//err
  201.                                         delayms(1000);
  202.                                         InputNum =1;
  203.                                         state = 0;
  204.                                 }
  205.                                 else if(key == 14)
  206.                                 {
  207.                                         Ge =18;Shi=18;Bai=18;Qian=18;//全亮
  208.                                         delayms(1000);
  209.                                         state = 0;
  210.                                         InputNum =1;
  211.                                 }
  212.                                 break;
  213.                         }
  214.                         case 2:
  215.                         {
  216.                                 if(key>=0 && key <= 9)
  217.                                 {
  218.                                         switch(InputNum)
  219.                                         {
  220.                                                 case 1:
  221. Ge = key;InPassWord[0]=key;
  222.                                                         break;
  223.                                                 case 2:
  224.                                                         Shi = key;InPassWord[1]=key;
  225.                                                         break;
  226.                                                 case 3:
  227.                                                         Bai = key;InPassWord[2]=key;
  228.                                                         break;
  229.                                                 case 4:
  230.                                                         Qian =key;InPassWord[3]=key;
  231.                                                         break;
  232.                                                 default:
  233.                                                         break;
  234.                                         }
  235.                                         if(InputNum<5)
  236.                                                 InputNum++;
  237.                                 }
  238.                                 else if(key == 12)
  239.                                 {
  240.                                         if(Compare(InPassWord))
  241.                                         {        Ge =15;Shi=15;Bai=15;Qian=15;
  242.                                                 for(i=0;i<4;i++)
  243.                                                         InPassWord[ i] = 0xff;
  244.                                                 state =3;
  245.                                         }//ffff
  246.                                         else
  247.                                         {        Ge =16;Shi=25;Bai=24;Qian=23;
  248.                                                 state =0;
  249.                                         }//err
  250.                                         delayms(1000);
  251.                                         InputNum =1;
  252.                                 }
  253.                                 else if(key == 14)
  254.                                 {
  255.                                         Ge =18;Shi=18;Bai=18;Qian=18;//全亮
  256.                                         delayms(1000);
  257.                                         state = 0;
  258.                                         InputNum =1;
  259.                                 }
  260.                                 break;
  261.                         }
  262.                         case 3:
  263.                         {
  264.                                 if(key>=0 && key <= 9)
  265.                                 {
  266.                                         switch(InputNum)
  267.                                         {
  268.                                                 case 1:
  269.                                                         Ge = key;PassWord[0]=key;
  270.                                                         break;
  271.                                                 case 2:
  272.                                                         Shi = key;PassWord[1]=key;
  273.                                                         break;
  274.                                                 case 3:
  275.                                                         Bai = key;PassWord[2]=key;
  276.                                                         break;
  277.                                                 case 4:
  278.                                                         Qian =key;PassWord[3]=key;
  279.                                                         break;
  280.                                                 default:
  281.                                                         break;
  282.                                         }
  283.                                         if(InputNum<5)
  284.                                                 InputNum++;
  285.                                 }
  286.                                 else if(key == 12)
  287.                                 {
  288.                                         Ge =16;Shi=16;Bai=16;Qian=16;
  289.                                         delayms(250);
  290.                                         Ge =17;Shi=17;Bai=17;Qian=17;
  291.                                         delayms(250);
  292.                                         Ge =16;Shi=16;Bai=16;Qian=16;
  293.                                         delayms(250);
  294.                                         Ge =17;Shi=17;Bai=17;Qian=17;
  295.                                         state = 0;
  296.                                         InputNum =1;
  297.                                 }
  298.                                 else if(key ==14)
  299.                                 {
  300.                                         Ge =18;Shi=18;Bai=18;Qian=18;//全亮
  301.                                         delayms(1000);
  302.                                         for(i=0;i<4;i++)
  303.                                                         PassWord[ i] = InPassWord[ i];
  304.                                         state = 0;
  305.                                         InputNum =1;
  306.                                 }
  307.                         }
  308.                 }
  309. }
  310.         else//如果没有按键按下
  311.         {
  312.                 if(state == 0)
  313.                 {
  314.                         Ge =16;Shi=16;Bai=16;Qian=16;//不显示
  315.                 }
  316.         }
  317. }
  318. uint8 Compare(uint8 InPassWord[4])
  319. {
  320.         uint8 i;
  321.         uint8 out=1;
  322.         for (i=0;i<4;i++)
  323.                 if(InPassWord[ i]==PassWord[ i])
  324.                         out = out & 1;
  325.                 else
  326.                         out = 0;
  327.         return out;
  328. }
复制代码

评分

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

查看全部评分

回复

使用道具 举报

ID:941414 发表于 2021-6-24 01:30 | 显示全部楼层
请问定时器的作用是什么啊

回复

使用道具 举报

ID:941414 发表于 2021-6-24 01:30 | 显示全部楼层
请问定时器的作用是什么啊
回复

使用道具 举报

ID:1016382 发表于 2022-4-7 11:07 来自手机 | 显示全部楼层
飞洒分 发表于 2021-6-24 01:30
请问定时器的作用是什么啊

定时器是用做设定时间用的,一共有五个定时器
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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