找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1931|回复: 1
收起左侧

stc15w单片机芯片做的电子密码锁程序

[复制链接]
ID:597329 发表于 2019-10-31 14:46 | 显示全部楼层 |阅读模式
单片机源程序如下:
  1. #include <reg52.h>
  2. #include "include.h"
  3. #include <intrins.h>
  4. #include <lcd12864.h>
  5. #include "key.h"
  6. //#include "ds1302.h"
  7. #include "stdio.h"
  8. #define uchar unsigned char
  9. #define uint unsigned int
  10. void dingshi();
  11. void delay(uint t)
  12. {
  13.         uchar a;
  14.         while(--t)
  15.         for(a=0;a<120;a++);
  16. }
  17. void dingshi()
  18. {
  19.         uchar z;
  20.         TMOD=0x00;
  21.         TR1=1;
  22.         TH1=0x63;
  23.         TL1=0x18;
  24.         for(z=0;z<160; )
  25.         {
  26.                 if(TF1==1)
  27.                 {
  28.                         z++;
  29.                         TF1=0;
  30.             TH1=0x63;
  31.             TL1=0x18;
  32.     }
  33.   }
  34. }

  35. uint srmm[16];
  36. sbit jdq1=P3^4;
  37. code uchar uctech[] ={"欢迎使用小智障"};
  38. code uchar net[] = {"请输入密码:"};
  39. code uchar mmcw[] ={"密码有错误"};
  40. code uchar qcs[] = {"请重试"};
  41. code uchar mmzq[] = {"密码对了"};
  42. code uchar hyhj[] = {"欢迎回家"};
  43. code uchar sysj[] = {"剩余时间"};
  44. code uint mm[8]={3,1,3,6,3,6,7,2};        

  45. //uchar disTime[7];                //保存时间数据的数组

  46. //uchar code timeRAdd[] = {READ_YEAR,READ_MON,READ_DAY,READ_WEEK,READ_HOUR,READ_MINUTE,READ_SECOND};
  47. //uchar code timeWAdd[] = {WRITE_YEAR,WRITE_MON,WRITE_DAY,WRITE_WEEK,WRITE_HOUR,WRITE_MINUTE,WRITE_SECOND};
  48. void main()
  49. {
  50.         uchar b,c,cw=0,cun,m,key_num=0,k=0,x,djs;
  51.         uchar i = 0;
  52.         uchar tempArr[2]="12";
  53.         jdq1=1;

  54. ////        Write1302(0x80,0x00);
  55. //        Write1302(0x90,0x5c); //禁止充电
  56. //        Write1302(0x8e,0x80); //写保护控制字,禁止写
  57. //        Delay400Ms(); //启动等待,等LCD讲入工作状态-
  58.         LCDInit(); //LCM初始化
  59.         uuu:
  60.         LCDClear();
  61.         DisplayListChar(0,1,uctech);        //显示字库中的中文数字
  62.         DisplayListChar(0,2,net);                //显示字库中的中文数字
  63. //        //设置时间
  64. //                disTime[0]=19;
  65. //                disTime[1]=3;
  66. //                disTime[2]=19;
  67. //                disTime[3]=2;                //星期
  68. //                disTime[4]=8;
  69. //                disTime[5]=39;
  70. //               
  71. //                Write1302(WRITE_PROTECT,0X00);
  72. //                                                for(i = 0;i < 7;i ++) {
  73. //                                                        Write1302(timeWAdd[i],disTime[i] / 10 * 16 + disTime[i] % 10);
  74. //                                                }
  75. //                                                Write1302(WRITE_PROTECT,0X80);
  76.         while(1)
  77.         {
  78.         
  79. //                //读取时间
  80. //                for(i = 0;i < 7;i ++) {
  81. //                        disTime[i] = Read1302(timeRAdd[i]);
  82. //                        DisplayOneChar(0,4,disTime[i]/10+0x30);
  83. //                }
  84. //                //显示时间
  85. //                for(i = 0;i < 7;i ++) {
  86. //                        tempArr[0] = disTime[i] / 10 + 0x30;
  87. //                        DisplayOneChar(0,4,tempArr[0]);
  88. //                        tempArr[1] = disTime[i] % 10 + 0x30;
  89. //                        if(i > 2) {
  90. //                                if(i == 3) {
  91. //                                                DisplayListChar(0,4,tempArr);
  92. ////                                        Display(2,0,6,disWeek + 6 * (disTime[i] - 1));
  93. //                                }else {
  94. ////                                        Display(2,3 + 2 * (i - 4),2,tempArr);
  95. //                                }
  96. //                        }else {
  97. ////                                Display(1,2 + 2 * i,2,tempArr);
  98. //                        }
  99. //                }
  100.                 if((cun=Keyboard())!=16)
  101.                 {
  102.                         
  103. //                        cun=Keyboard();
  104. //                        if(Keyboard()==14){m=m-1;}
  105. //                        if(Keyboard()==15)
  106.                         if(cun==14){m=m-1;}//退格
  107.                         if(cun==15)        //确定
  108.                                 {
  109.                                         oo:
  110.                                         k=1;        //按下确认
  111.                                         m=0;
  112.                                         LCDClear();        
  113.                                         break;        
  114.                                 }
  115.                         while(KEY!=0x0f);
  116.                                 delay(5);
  117.                         //DisplayOneChar(m,3,cun+0x30);//显示密码
  118.                         DisplayOneChar(m,3,0x2A);//显示星号
  119.    switch(m)
  120.                          {
  121.                                          case 0: {srmm[0] = cun;  break;}
  122.                                          case 1: {srmm[1] = cun;  break;}
  123.                                          case 2: {srmm[2] = cun;  break;}
  124.                                          case 3: {srmm[3] = cun;  break;}
  125.                                          case 4: {srmm[4] = cun;  break;}
  126.                                          case 5: {srmm[5] = cun;  break;}
  127.                                          case 6: {srmm[6] = cun;  break;}
  128.                                          case 7: {srmm[7] = cun;  break;}
  129.                                 }  
  130.        if(cun<10)m++;
  131.                                 if(m==8)
  132.                                 {
  133. //                                        k=1;        //确认返回
  134. //                                        m=0;
  135. //                                        LCDClear();
  136. //                                        break;
  137.                                 goto oo;
  138.                                 }
  139.          }
  140.                
  141. }
  142.                         while(k==1)
  143.                         {
  144.                                 
  145.                                 for(b=0;b<8;)
  146.                                         {
  147.                                                          TI=0;
  148.                                                 if(srmm[b]==mm[b])
  149.                                                  {
  150.                                                          b++;
  151.                                                          TI=0;
  152.                                                  }
  153.                                                 else{ c=8;break;}
  154.                                         }
  155.                                 if(c==8)
  156.                                         {
  157.                                                 
  158.                                                 LCDClear();
  159.                                                 DisplayListChar(1,2,mmcw);        //显示字库中的中文数字
  160.                                                 DisplayListChar(2,3,qcs);        //显示字库中的中文数字、
  161.                                                 delay(100);
  162.                                                 LCDClear();
  163.                                                 k=0;
  164.                                                 c=0;
  165.                                                 if(cw<2)
  166.                                                         {
  167.                                                         cw++;
  168.                                                         goto uuu;
  169.                                                         }
  170.                                                         else
  171.                                                         {
  172.                                                                 DisplayListChar(1,2,mmcw);        //显示字库中的中文数字
  173.                                                                 Delay400Ms();
  174.                                                                 Delay400Ms();
  175.                                                                 LCDClear();
  176.                                                                 djs=60;
  177.                                                                 for(x=60;x>=0;x--)
  178.                                                                         {
  179.                                                                                 DisplayListChar(2,0,sysj);
  180.                                                                                 DisplayOneChar(4,2,djs%10+0x30);        //显示字库中的中文数字
  181.                                                                                 DisplayOneChar(3,2,djs/10+0x30);
  182.                                                                                 dingshi();
  183.                                                                                 
  184.                                                                                 djs--;
  185.                                                                                 if(x==0) goto uuu;
  186.                                                                         }
  187.                                                         }
  188.                                         }
  189.                                 else
  190.                                         {
  191.                                                         LCDClear();
  192.                                                         DisplayListChar(2,2,mmzq);        //显示字库中的中文数字
  193.                                                         DisplayListChar(2,3,hyhj);        //显示字库中的中文数字
  194.                                                         //delay(1000);
  195.                                                         //LCDClear();
  196.                                                         jdq1=0;       //开门
  197.                                                         delay(3000);
  198.                                                         jdq1=1;
  199.                                                         LCDClear();
  200.                                                         k=0;
  201.                                                 srmm[0] ='6';
  202.                                                 cw=0;
  203.                                                 goto uuu;
  204.                                         }        
  205.                  }
  206. }
复制代码

  1. /*------- --4X4键盘 ---------
  2.   L1,L2,L3,L4,R1,R2,R3,R4分别接P2.0-7
  3. 键盘编码如下所示:
  4. 0 , 1, 2, 3
  5. 4 , 5, 6, 7
  6. 8 , 9,10,11
  7. 12,13,14,15            
  8. unsigned char Keyboard(void);为键盘扫描函数,
  9. 在主函数文件声明后即可调用,返回键盘值0-15,
  10. 无按键按下时,返回16。
  11. ------------------------------*/
  12. #include <reg52.h>   
  13. #include "key.h"
  14. #include "include.h"
  15. //------函数声明---------------------------
  16. //void Keyboard(void);

  17. //-----引脚定义--------------------------------
  18. //#define KEY P0
  19. //-------------------------------------------
  20. void delay_key(unsigned int t)
  21. {
  22. while(t--);
  23. }
  24. //-------------------------------------------
  25. uchar Keyboard(void)
  26. {unsigned char x,y,z=0;
  27.         unsigned int jz=16;
  28. KEY=0xf0;                //低四位置低,即行接低
  29. if(KEY!=0xf0)        //是否有按键按下
  30. {
  31.         delay_key(10);        //去抖
  32.         if(KEY!=0xf0)//确实有按键按下
  33.         {
  34.           x=KEY;                //读取按键所在的行
  35.           KEY=0x0f;        //高四位置低,即列接低
  36.           y=KEY;                //读取按键所在的列
  37.           z=x|y;        //按键的坐标为行+列
  38. //          while(KEY!=0x0f); //等待按键抬起
  39.         }
  40. }
  41. switch(z)
  42. {                                //while(KEY!=0x0f);
  43.           case 0xee:{jz=1;break;} //按键值显示为0
  44.           case 0xde:{jz=2;break;}  //按键值显示为1  
  45.           case 0xbe:{jz=3;break;}
  46.           case 0x7e:{jz=14;break;}

  47.           case 0xed:{jz=4;break;}
  48.           case 0xdd:{jz=5;break;}   
  49.           case 0xbd:{jz=6;break;}   
  50.           case 0x7d:{jz=7;break;}  

  51.           case 0xeb:{jz=7;break;}   
  52.           case 0xdb:{jz=8;break;}   
  53.           case 0xbb:{jz=9;break;}  
  54.           case 0x7b:{jz=10;break;}   

  55.           case 0xe7:{jz=0;break;}  
  56.           case 0xd7:{jz=14;break;}   
  57.           case 0xb7:{jz=15;break;}   
  58.           case 0x77:{jz=15;break;}   
  59.           default: jz=16; break; // 没有按键按下,返回16
  60.    }
  61. //                while(KEY==0x0f);
  62.                 return jz;
  63. }
复制代码

所有资料51hei提供下载:
电子密码锁.zip (69.88 KB, 下载次数: 29)
回复

使用道具 举报

ID:793692 发表于 2020-7-7 10:18 | 显示全部楼层
为什么光扣黑币,不下载呢?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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