找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5464|回复: 0
收起左侧

基于51单片机多功能密码锁

[复制链接]
ID:199787 发表于 2017-5-11 23:44 | 显示全部楼层 |阅读模式
  适合新手学习。
0.png

单片机源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. #define GPIO_KEY P2

  6. sbit LCD_E=P3^7;
  7. sbit LCD_RW=P3^6;                                                               
  8. sbit LCD_RS=P3^5;

  9. sbit beep=P3^4;

  10. uchar table[]="00:00:00";
  11. char keyword1[]={1,2,3,4,5,6};
  12. char table1[5]="pass!";
  13. char table2[6]="wrong!";
  14. char in[6]={-6,-6,-6,-6,-6,-6};
  15. uchar num,miao=0,fen=0,shi=0,x,y,n1=0,n2=0,cmiao=0,cshi=0,cfen=0,i,ge1=0,shi1=0,bai1=0,qian1=0;
  16. char KeyValue=-1,Key1=0,Key2=0;
  17. int s=0;
  18. char flag1=-1,flag2=-1;
  19. char keyword;
  20. uchar i=0,j,a=0;
  21. char flag_pass=-1,flag_beep=-1,c;
  22. void delay5ms();   
  23. void write_com(uchar com);
  24. void write_data(uchar dat);
  25. void display(uchar b,uchar dat);
  26. void init1();
  27. void init2();
  28. void Keyscan();
  29. void input();
  30. void show1();
  31. void show2();
  32. char store();
  33. void unlock();
  34. void delay2s();
  35. void main()
  36. {

  37.      init1();
  38.      beep=1;
  39.    while(1)
  40.         {

  41.                  if(flag1==1)
  42.                  {
  43.                                                                  if(KeyValue==1)
  44.                                                 {
  45.                                                                 TR0=0;
  46.                                                                 a++;
  47.                                                                 KeyValue=-1;

  48.                                                                 if(a==4)
  49.                                                                 {
  50.                                                                         TR0=1;
  51.                                                                         a=0;
  52.                                                                 }
  53.                                                        
  54.                                                  }
  55.                                                  if(a!=0)
  56.                                                  {
  57.                                                          if(KeyValue==2)
  58.                                                                 {
  59.                                                                     KeyValue=-1;
  60.                                                                                 switch(a)
  61.                                                                                 {
  62.                                                                                         case 1:miao=miao+1;display(0x86,miao);break;
  63.                                                                                         case 2:fen=fen+1;display(0x83,fen);  break;
  64.                                                                                         case 3:shi=shi+1;display(0x80,shi);        break;                                                                               
  65.                                                                                 }
  66.                                                                 }
  67.                                                                  if(KeyValue==3)
  68.                                                                  {
  69.                                                                    KeyValue=-1;
  70.                                                                          switch(a)
  71.                                                                          {
  72.                                                                                                 case 1:miao=miao-1;display(0x86,miao);break;
  73.                                                                                                 case 2:fen=fen-1;display(0x83,fen);  break;
  74.                                                                                                 case 3:shi=shi-1;display(0x80,shi);        break;
  75.                                                                          }
  76.                                                                  }                         
  77.                                                         }
  78.                  }
  79.      Keyscan();
  80.      input();
  81.                 unlock();
  82.      if(flag_beep==1)
  83.                  {
  84.                  beep=0;
  85.                  }
  86.                  else
  87.                  {
  88.                  beep=1;
  89.                  }
  90.   }
  91. }
  92. void delay5ms()   //?? 0us
  93. {
  94.     uchar a,b;
  95.     for(b=19;b>0;b--)
  96.         for(a=130;a>0;a--);
  97. }


  98. void write_com(uchar com)
  99. {
  100.    LCD_E=0;
  101.    LCD_RW= 0 ;
  102.    LCD_RS=0;
  103.    P1=com;

  104.    delay5ms();
  105.    LCD_E=1;
  106.    delay5ms();
  107.    LCD_E=0;
  108. }
  109. void write_data(uchar dat)
  110. {
  111.     LCD_E=0;
  112.    LCD_RW=0;
  113.    LCD_RS=1;
  114.    P1=dat;

  115.    delay5ms();
  116.    LCD_E=1;
  117.    delay5ms();
  118.    LCD_E=0;
  119. }

  120. void init1()
  121. {
  122.    write_com(0x38);
  123.    write_com(0x0c);
  124.    write_com(0x06);
  125.    write_com(0x01);
  126. }
  127. void init2()
  128. {
  129.    write_com(0x80);
  130.         for(num=0;num<8;num++)
  131.         {
  132.          write_data(table[num]);
  133.         }
  134.                 write_com(0xc0);
  135.                 for(i=0;i<8;i++)
  136.                 write_data(table[i]);
  137.   TMOD=0X11;
  138.   
  139.         TH0=(65536-50000)/256;
  140.         TL0=(65536-50000)%256;
  141.         TH1=(65536-50000)/256;
  142.         TL1=(65536-50000)%256;
  143.        
  144.   ET0=1;//????0??
  145.   TR0=1;//?????0
  146.   ET1=1;//????0??
  147.   TR1=1;
  148.   EA=1;




  149. }
  150. void display(uchar b,uchar dat)
  151. {
  152.    uchar shi,ge;
  153.    shi=dat/10;
  154.    ge=dat%10;
  155.    write_com(b);
  156.         delay5ms();
  157.    write_data(0x30+shi);
  158.    write_data(0x30+ge);

  159. }


  160. void Keyscan()
  161. {
  162.         uchar i;
  163.         GPIO_KEY=0X0f;
  164.         if(GPIO_KEY!=0X0f)
  165.         {
  166.                 delay5ms();
  167.                 if(GPIO_KEY!=0X0f)
  168.                 {
  169.                
  170.                                 switch(GPIO_KEY)
  171.                                 {
  172.                                         case 0x07:KeyValue=12; break ;
  173.                                         case 0x0b:KeyValue=8;        break ;
  174.                                         case 0x0d:KeyValue=4;        break ;               
  175.                                         case 0x0e:KeyValue=0;        break ;
  176.                                 }
  177.      
  178.                                 GPIO_KEY=0XF0;
  179.                                 if(GPIO_KEY!=0XF0)
  180.                                 {
  181.                                  delay5ms();
  182.                                  if(GPIO_KEY!=0XF0)
  183.                                                          switch(GPIO_KEY)
  184.                                                          {
  185.                                                                  case 0x70:KeyValue=KeyValue+1;break;
  186.                                                                  case 0xb0:KeyValue=KeyValue+2;break;
  187.                                                                  case 0xd0:KeyValue=KeyValue+3;break;
  188.                                                                  case 0xe0:KeyValue=KeyValue+4;break;
  189.                                                          }
  190.                                                
  191.                                                         while((i<50)&&(GPIO_KEY!=0XF0))
  192.                                                                 {
  193.                                                                 delay5ms();
  194.                                                                         i++;
  195.                                                                 }
  196.                                                                 i=0;
  197.                                                        
  198.                           }
  199.                 }
  200.   }

  201. }




  202. void input()
  203. {
  204.    
  205.         if(flag_pass==1)
  206.                 {
  207.                         if(flag1==1)
  208.                         {

  209.                                         if(KeyValue==5)
  210.                                         {
  211.                                                 KeyValue=-1;
  212.                                                 Key2++;
  213.                                                 if(Key2==4)
  214.                                                         Key2=0;
  215.                                         }               
  216.                                         if(Key2!=0)
  217.                                         {
  218.                                                 if(KeyValue==6)
  219.                                                 {
  220.                                                         KeyValue=-1;
  221.                                                          switch(Key2)
  222.                                                          {
  223.                                                                  case 1:cmiao=cmiao+1;display(0xc6,cmiao);break;
  224.                                                                  case 2:cfen=cfen+1;display(0xc3,cfen);break;
  225.                                                                  case 3:cshi=cshi+1;display(0xc0,cshi);break;
  226.                                                          
  227.                                                          }
  228.                                                 }
  229.                                                 if(KeyValue==7)
  230.                                                 {
  231.                                                         KeyValue=-1;
  232.                                                          switch(Key2)
  233.                                                          {
  234.                                                                  case 1:cmiao=cmiao-1;display(0xc6,cmiao);break;
  235.                                                                  case 2:cfen=cfen-1;display(0xc3,cfen);break;
  236.                                                                  case 3:cshi=cshi-1;display(0xc0,cshi);break;
  237.                                                          }         
  238.                                                  }
  239.                                         }
  240.                                         if(KeyValue==9)
  241.                                         {
  242.                                                 KeyValue=-1;
  243.                                                 s++;
  244.                                         }
  245.                                                 if(KeyValue==10)
  246.                                         {
  247.                                                 KeyValue=-1;
  248.                                                 s--;
  249.                                         }       
  250.                                                 if(KeyValue==13)
  251.                                                 {
  252.                                                         flag2=1;
  253.                                                 }
  254.                                                 if(KeyValue==14)
  255.                                                 {
  256.                                                         flag2=2;       
  257.                                                 }
  258.                         if(miao==cmiao&&fen==cfen&&shi==cshi&&Key2==0)
  259.                  {
  260.                          flag_beep=1;
  261.        c=KeyValue;                         
  262.                  }
  263.                  if(c!=KeyValue)
  264.                  {
  265.                  flag_beep=-1;
  266.                  }
  267.                  
  268.                  show1();
  269.                  show2();
  270.         
  271.         }
  272.                         if(KeyValue==4)
  273.                         {
  274.                                 KeyValue=-1;
  275.                                 init1();
  276.                                 init2();

  277.                                 flag1=1;
  278.                         }
  279.                                      if(KeyValue==8)
  280.                                 {
  281.                                         KeyValue=-1;
  282.                                         TR1=1;
  283.                                 }
  284.                                         if(KeyValue==12)
  285.                                 {
  286.                                         KeyValue=-1;
  287.                                         TR1=0;
  288.                                 }       
  289.   }
  290. }
  291. void unlock()
  292. {
  293.         uchar s1,m;
  294.   char flag[6]={-1,-1,-1,-1,-1,-1};
  295.     if(flag_pass==-1)
  296.                 {
  297.                                 if(KeyValue==2&&flag!=1)
  298.                         {
  299.                                 for(s1=0;s1<6;s1++)
  300.                                 {
  301.                                  if(in[s1]==keyword1[s1])
  302.                                         flag[s1]=1;
  303.                                  else
  304.                                         flag[s1]=0;
  305.                                 }       

  306.                                 if(flag[0]==1&&flag[1]==1&&flag[2]==1&&flag[3]==1&&flag[4]==1&&flag[5]==1)
  307.                                 {
  308.                                         flag_pass=1;
  309.                                         write_com(0x80);
  310.                                         for(m=0;m<5;m++)
  311.                                         write_data(table1[m]);
  312.                                 }                                                       
  313.                                 else
  314.                                 {
  315.                                         write_com(0x80);
  316.                                         flag_pass=-1;
  317.                                         for(m=0;m<6;m++)
  318.                                         write_data(table2[m]);                                               
  319.                                 }
  320.                         }
  321.                                        
  322.     if(KeyValue!=-1&&flag1!=1)
  323.                  {
  324.                           if(KeyValue!=1)
  325.                                 {
  326.                                 in[i]=store();
  327.                                 i++;
  328.                           KeyValue=-1;
  329.                                 }
  330.                                 if(KeyValue==1)
  331.                                 {
  332.                                 i--;
  333.                                 in[i]=-6;
  334.                                 KeyValue=-1;
  335.                                 }
  336.     }

  337.                  write_com(0xc0);
  338.              for(j=0;j<6;j++)
  339.                  {
  340.                          write_data(in[j]+0x30);
  341.            }
  342.          }
  343.                 else ;
  344.        
  345. }

  346. void show1()
  347. {

  348.         if(n1>19) //????????
  349.   {
  350.    n1=0;
  351.    miao++;
  352.        if(miao>59)
  353.                         {
  354.                          miao=0;
  355.                          fen++;
  356.                                         if(fen>59)
  357.                                          {
  358.                                          fen=0;
  359.                                          shi++;
  360.                                                  if(shi>23)
  361.                                                  {
  362.                                                  shi=0;
  363.                                                  }
  364.                                          display(0x80,shi);
  365.                                          }
  366.                                          display(0x83,fen);
  367.                         }
  368.                         display(0x86,miao);
  369.         }
  370. }
  371. void show2()
  372. {
  373.   
  374.                 if(n2>19)
  375.                 {
  376.                         if(flag2==1)
  377.                         {
  378.                                         s++;
  379.                         }
  380.                         if(flag2==2)
  381.                         {
  382.                                         s--;                                       
  383.                         }               
  384.                              n2=0;               
  385.                  
  386.                 }
  387.                  if(s<0)       
  388.       s=0;       
  389.                         qian1=s/1000;
  390.                         bai1=s%1000/100;
  391.                         shi1=s%100/10;
  392.                         ge1=s%10;
  393.                         write_com(0xc9);
  394.                          write_data(qian1+0x30);
  395.                         write_com(0xca);
  396. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
多功能密码锁.zip (53.3 KB, 下载次数: 29)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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