找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4510|回复: 5
收起左侧

基于STC单片机电子密码锁全套设计资料 PCB+源程序+元件清单

  [复制链接]
ID:449590 发表于 2018-12-24 22:11 | 显示全部楼层 |阅读模式
《基于STC单片机电子密码锁设计》,资料齐全(资料只用于交流学习,请勿用于商业,否则后果自负
有pcb,可以直接打印,源程序和原理图
QQ截图20181224220002.png

PCB截图
QQ截图20181224215112.png

QQ截图20181224220027.png

元件清单
QQ截图20181224220321.png

原理图
QQ截图20181224220512.png


成品
IMG_20171130_194733.jpg
代码参考
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define        uchar unsigned char
  4. sbit l1=P1^0;        //LED指示
  5. sbit bump=P2^2;        //蜂鸣器控制
  6. sbit relay=P2^3;//继电器输出
  7. sbit lcden=P2^7;//LCD1602液晶控制端
  8. sbit lcdrs=P2^6;
  9. sbit sda=P2^0;        //AT24C02数据端口
  10. sbit scl=P2^1;        //时钟端口
  11. /**********显示内容**************************/
  12. uchar code xianshi0[]="input  password:";
  13. uchar code xianshi1[]="please come in!";
  14. uchar code xianshi2[]="*";
  15. uchar code xianshi3[]=" you are thief!";
  16. uchar code xianshi4[]=" new  password:";
  17. uchar code xianshi5[]=" alter succeed!";
  18. uchar code xianshi6[]="  first error!";
  19. uchar code xianshi7[]="  second error!";
  20. uchar code xianshi8[]="  third error!";
  21. uchar code xianshi9[]="  alter fail!!";
  22. uchar table[8];                         //给按键输入留取存储空间
  23. uchar table1[8];                 //给密码修改留取存储空间
  24. uchar mima[8];                         //给从存储中读取密码留取存储空间
  25. uchar num,num1,num2,num3,etimes,fanhui,kai;
  26. bit alterflog,cpflog,suoflog;//定义各种标志位 修改密码键按下标志   密码比较正确标志  上锁标志
  27. void keyscan();                                                  //声明键盘扫描函数
  28. void init();
  29. void keydeal15();
  30. void keydeal16();                                                  //声明初始化函数
  31. /********************延时一毫秒函数**************/        
  32. void delay_xs(uint x)
  33. {          uint i,j;
  34.         for(i=x;i>0;i--)         for(j=110;j>0;j--);}
  35. void writecom(uchar com)        //写命令
  36. {
  37.         lcdrs=0;         P0=com;                 delay_xs(5);
  38.         lcden=1;          delay_xs(5);                 lcden=0;
  39. }
  40. /*********************液晶写命令数据函数******************/
  41. void writedate(uchar date)        //写命令
  42. {
  43.         lcdrs=1;         P0=date;        delay_xs(5);
  44.         lcden=1;         delay_xs(5);        lcden=0;
  45. }
  46. /***************24c02读取写入数据初始化****************/
  47. void delay()  //微妙级延时函数
  48. { ;; }
  49. void start()  //开始信号
  50. {        
  51.         sda=1;         delay(); scl=1;        delay(); sda=0;        delay();
  52. }

  53. void stop()   //停止
  54. {
  55.         sda=0;delay();scl=1;delay();sda=1;delay();
  56. }
  57. void respons()  //应答
  58. {
  59.         uchar i;
  60.         scl=1;        delay();
  61.         while((sda==1)&&(i<250)) i++;
  62.         scl=0;         delay();
  63. }
  64. void write_byte(uchar date)                //写一位数据
  65. {
  66.         uchar i,temp;
  67.         temp=date;


  68.         for(i=0;i<8;i++)
  69.         {
  70.                 temp=temp<<1;
  71.                 scl=0; delay();        sda=CY;        delay();
  72.                 scl=1; delay();
  73.         }
  74.         scl=0;         delay();
  75.         sda=1;         delay();
  76. }

  77. uchar read_byte()                           //读一位数据
  78. {
  79.         uchar i,k;
  80.         scl=0;         delay();
  81.         sda=1;        delay();
  82.         for(i=0;i<8;i++)
  83.         {
  84.                 scl=1;        delay();        
  85.                 k=(k<<1)|sda;
  86.                 scl=0;        delay();        
  87.         }
  88.         return k;
  89. }
  90. void write24c02(uchar address,uchar date) //写一字节函数
  91. {
  92.         start();
  93.         write_byte(0xa0);
  94.         respons();
  95.         write_byte(address);
  96.         respons();
  97.         write_byte(date);
  98.         respons();
  99.         stop();
  100. }

  101. uchar read24c02(uchar address)                //读一字节函数
  102. {
  103.         uchar date;
  104.         start();
  105.         write_byte(0xa0);
  106.         respons();
  107.         write_byte(address);
  108.         respons();
  109.         start();
  110.         write_byte(0xa1);
  111.         respons();
  112.         date=read_byte();
  113.         stop();
  114.         return date;
  115. }
  116. /************各按键对应处理函数***************/
  117. /*************各按键功能********************
  118. 1-2-3-4-5-6-7-8-9-0-确认-重新输入-未定义-上锁-密码修改
  119. -密码修改确认-未定义*************************/
  120. void keydeal1()                                 //按键1
  121. {
  122.         table[num]=1;
  123.         num++;
  124.         if(alterflog==1){table1[num1]=1;num1++;        }
  125. }
  126. void keydeal2()                                //按键2
  127. {
  128.         table[num]=2;
  129.         num++;
  130.         if(alterflog==1){table1[num1]=2;num1++;        }
  131. }
  132. void keydeal3()                               //按键3
  133. {
  134.         table[num]=3;
  135.         num++;
  136.         if(alterflog==1){table1[num1]=3;num1++;        }
  137. }
  138. void keydeal4()                               //按键4
  139. {
  140.         table[num]=4;
  141.         num++;
  142.         if(alterflog==1){table1[num1]=4;num1++;        }
  143. }
  144. void keydeal5()                               //按键5
  145. {
  146.         table[num]=5;
  147.         num++;
  148.         if(alterflog==1) {table1[num1]=5;num1++;}
  149. }
  150. void keydeal6()                                        //按键6
  151. {
  152.         table[num]=6;
  153.         num++;
  154.         if(alterflog==1){table1[num1]=6;num1++;        }
  155. }
  156. void keydeal7()                                        //按键7
  157. {
  158.         table[num]=7;
  159.         num++;
  160.         if(alterflog==1){table1[num1]=7;num1++;        }
  161. }
  162. void keydeal8()                                          //按键8
  163. {
  164.         table[num]=8;
  165.         num++;
  166.         if(alterflog==1){table1[num1]=8;num1++;        }
  167. }
  168. void keydeal9()                                           //按键9
  169. {
  170.         table[num]=9;
  171.         num++;
  172.         if(alterflog==1){table1[num1]=9; num1++;        }
  173. }
  174. void keydeal10()                                   //按键10
  175. {
  176.         table[num]=0;          num++;
  177.         if(alterflog==1){table1[num1]=0;num1++;        }
  178. }
  179. void compare()                         //比较密码正确与否函数
  180. {
  181.         uchar j;
  182.                 for(j=0;j<8;j++)
  183.                 {
  184.                         if(table[j]==mima[j]){cpflog=1;l1=0;}
  185.                         else        cpflog=0;
  186.                         l1=1;
  187.                 }         
  188. }
  189. void keydeal11()                                  //确认键
  190. {
  191.         uchar j;
  192.         if(alterflog==1)
  193.         goto n;                                        //如果密码修改键按下再按此键无效
  194.         if(num==8)                                 //判断是否输入八个数字
  195.         {
  196.                 num=0;                                 //将输入数字个数清零
  197.                 compare();                         //进行密码比较
  198.                 for(j=0;j<8;j++)                 //用FFFFFFFF将输入的数据清空
  199.                 {
  200.                         table[j]=0x0f;
  201.                 }
  202.         }
  203.         if(cpflog==1)                                 //如果密码正确,标志位为1
  204.         {
  205.                 l1=0;                                         //点亮开锁灯
  206.                 cpflog=0;                                 //使比较密码标志位归零
  207.                 etimes=0;                                 //使记错次数归零
  208.                 kai=1;                                         //使打开锁标志位置1
  209.                 writecom(0x01);                         //液晶屏清空显示
  210.                 writecom(0x80);                         //让液晶显示“please come in!”
  211.                 for(j=0;j<15;j++)
  212.                 {
  213.                         writedate(xianshi1[j]);                delay_xs(3);
  214.                 }
  215.                 for(j=0;j<2;j++)                  //蜂鸣器响两声提示开锁成功
  216.                 {
  217.                         bump=0;        delay_xs(200);
  218.                         bump=1;        delay_xs(200);
  219.                         bump=0;        delay_xs(200);
  220.                         bump=1;        delay_xs(200);
  221.                 }
  222.          /*********等待按下上锁键或者密码修改键**********/
  223.                 while((suoflog!=1)&(alterflog!=1))
  224.                 {
  225.                         P3=0xf7;
  226.                         if(P3==0xe7)  suoflog=1;  //上锁键按下上锁标志位置1                                
  227.                         if(P3==0xd7) alterflog=1;  //密码修改键按下标志位置1               
  228.                         if(suoflog==1)          //上锁后进行初始化
  229.                         {
  230.                                 init();
  231.                         }
  232.                 n:        if(alterflog==1) //密码修改键按下显示new passsword
  233.                         {
  234.                                 writecom(0x01);                writecom(0x38);
  235.                                 for(j=0;j<15;j++){writedate(xianshi4[j]); }
  236.                         }
  237.                 }
  238.                 suoflog=0;           //上锁标志位清零
  239.         }
  240.         else                        //否则密码错误,执行密码错误指令
  241.         {
  242.                 num=0;                //将输入数据个数清零
  243.                 num1=0;                //将修改密码输入数字个数清零
  244.                 etimes++;        //记录错误次数加1
  245.                 bump=0;                              //报警一声
  246.                 delay_xs(500);        bump=1;
  247.                 for(j=0;j<8;j++)                  //清空修改密码输入数据
  248.                 { table1[j]=0x0f;                }
  249.                 if(etimes==1)                          //如果输错一次
  250.                 {
  251.                         writecom(0x01);                   //清屏
  252.                         writecom(0x80);
  253.                         for(j=0;j<14;j++)           //显示first error
  254.                         { writedate(xianshi6[j]);        }
  255.                         delay_xs(2000);                   //延时两秒
  256.                         writecom(0xc);
  257.                         writecom(0x80);
  258.                         for(j=0;j<16;j++)           //第一行显示input passsword
  259.                         {
  260.                                 writedate(xianshi0[j]);                delay_xs(5);
  261.                         }                                          
  262.                         writecom(0x80+0x40+4);         //第二行显示--------
  263.                         for(j=0;j<8;j++) {writedate('-');                         }
  264.                 }
  265.                 if(etimes==2)                           //如果输错两次
  266.                 {
  267.                         writecom(0x01);        writecom(0x80);
  268.                         for(j=0;j<15;j++)           //显示second error
  269.                         {
  270.                                 writedate(xianshi7[j]);
  271.                         }
  272.                         delay_xs(2000);                   //延时两秒
  273.                         writecom(0xc);
  274.                         writecom(0x80);
  275.                         for(j=0;j<16;j++)                //第一行显示input passsword
  276.                         {
  277.                                 writedate(xianshi0[j]);        delay_xs(5);
  278.                         }
  279.                         writecom(0x80+0x40+4);
  280.                         for(j=0;j<8;j++)                //第二行显示--------
  281.                         {
  282.                                 writedate('-');
  283.                         }
  284.                 }
  285.                 if(etimes==3)                                //如果输错三次
  286.                 {
  287.                         writecom(0x01);
  288.                         writecom(0x80);
  289.                         for(j=0;j<15;j++)                //显示you are thief!
  290.                         {
  291.                                 writedate(xianshi3[j]);
  292.                         }
  293.                         for(j=0;j<10;j++)                //报警十秒钟
  294.                         {
  295.                                 bump=0;                delay_xs(500);
  296.                                 bump=1;                delay_xs(500);
  297.                         }
  298.                         init();                                        //初始化
  299.                 }
  300.         }
  301. }
  302. void keydeal12()                                        //重新输入键
  303. {
  304.         uint i;
  305.         if(kai==0)                                        //如果所没被打开
  306.         {                                                        //初始化回到输入密码状态
  307.                 init();
  308.         }
  309.         else                                //如果锁被打开,则显示new password:
  310.         {
  311.                 if(alterflog==1)
  312.                 {
  313.                         num=0;         num1=0;
  314.                         writecom(0x01);                writecom(0x80);//清屏
  315.                         for(i=0;i<15;i++){writedate(xianshi4[i]);        }
  316.                 }
  317.         }
  318. }
  319. void keydeal15()                   //确认密码修改键
  320. {
  321.         uchar i;
  322.         alterflog=0;                        //修改标志位归零
  323.         num=0;                                        //数据输入个数清零
  324.         for(i=0;i<8;i++)                //输入数据清空
  325.         {
  326.                 table[i]=0x0f;        
  327.         }
  328.         if(num1==8)                                //如果输入修改数字够八个进入
  329.         {
  330.                 num1=0;                                //将输入修改数字个数清零
  331.                 for(i=0;i<8;i++)        //将修改后八个数字写入存储器中
  332.                 {
  333.                         write24c02(i+1,table1[i]);         delay_xs(5);
  334.                 }
  335.                 writecom(0x01);                  //清屏
  336.                 writecom(0x80);
  337.                 for(i=0;i<15;i++)           //显示alter succeed!!
  338.                 {
  339.                         writedate(xianshi5[i]);
  340.                 }
  341.                 delay_xs(2000);
  342.         }
  343.         else                                          //如果输入数字不够八个进入
  344.         {
  345.                 num1=0;                                  //将输入修改数字个数清零
  346.                 writecom(0x01);                 //清屏
  347.                 writecom(0x80);
  348.                 for(i=0;i<14;i++)          //显示alter error!
  349.                 {
  350.                         writedate(xianshi9[i]);
  351.                 }
  352.         }
  353.         /**************修改后将键入返回程序************/
  354.         if(kai==1)                         //如果锁被打开
  355.         {
  356.                 num=0;                         //输入数字个数清零
  357.                 delay_xs(2000);           //延时两秒钟
  358.                 writecom(0x01);                //清屏
  359.                 writecom(0x80);
  360.                 for(i=0;i<15;i++)                //显示please come in!
  361.                 {
  362.                         writedate(xianshi1[i]);
  363.                         delay_xs(3);
  364.                 }                                                //继续等待上锁或修改密码
  365.                 while((suoflog!=1)&(alterflog!=1))
  366.                 {
  367.                         P3=0xf7;
  368.                         if(P3==0xe7)        suoflog=1;
  369.                         if(P3==0xd7)        alterflog=1;
  370.                         if(suoflog==1)        {         init();                }
  371.                         if(alterflog==1)
  372.                         {
  373.                                 writecom(0x01);        writecom(0x80);//清屏
  374.                                 for(i=0;i<15;i++){ writedate(xianshi4[i]);        }
  375.                         }
  376.                  }
  377.         }
  378.         else                 //如果所没被打开,显示alter error两秒后
  379.         {                                 //进行初始化
  380.                 delay_xs(2000);         init();
  381.         }
  382. }
  383. void keydeal16()           //键16未定义
  384. {
  385.         
  386. }
  387. /******************键盘扫描函数**************************/
  388. void keyscan()
  389. {
  390.         uchar temp;
  391. /**************第一行扫描********************/
  392.         P3=0xfe;
  393.         temp=P3&0xf0;
  394.         if(temp!=0xf0)
  395.         {
  396.                 delay_xs(10);
  397.                 if(temp!=0xf0)        temp=P3;
  398.                 switch(temp)
  399.                 {
  400.                         case 0xee:        keydeal1();        break;
  401.                         case 0xde:        keydeal2();        break;
  402.                         case 0xbe:        keydeal3();        break;
  403.                         case 0x7e:         keydeal4();        break;

  404.                 }
  405.                 while((P3&0xf0)!=0xf0);        //松手检测

  406.         }
  407. /******************第二行扫描**********************/
  408.         P3=0xfd;
  409.         temp=P3&0xf0;
  410.         if(temp!=0xf0)
  411.         {
  412.                 delay_xs(10);
  413.                 if(temp!=0xf0)         temp=P3;
  414.                 switch(temp)
  415.                 {
  416.                         case 0xed:        keydeal5();                break;
  417.                         case 0xdd:         keydeal6();                break;
  418.                         case 0xbd:        keydeal7();                break;
  419.                         case 0x7d:        keydeal8();                break;

  420.                 }
  421.                 while((P3&0xf0)!=0xf0);           //松手检测

  422.         }
  423. /*****************第三行扫描*********************/
  424.         P3=0xfb;
  425.         temp=P3&0xf0;
  426.         if(temp!=0xf0)
  427.         {
  428.                 delay_xs(10);
  429.                 if(temp!=0xf0)        temp=P3;
  430.                 switch(temp)
  431.                 {
  432.                         case 0xeb:         keydeal9();                break;
  433.                         case 0xdb:        keydeal10();        break;
  434.                         case 0xbb:        keydeal11();        break;
  435.                         case 0x7b:        keydeal12();         break;

  436.                 }
  437.                 while((P3&0xf0)!=0xf0);

  438.         }
  439. /********************第四行扫描********************/
  440.         P3=0xf7;
  441.         temp=P3&0xf0;
  442.         if(temp!=0xf0)
  443.         {
  444.                 delay_xs(10);
  445.                 if(temp!=0xf0)        temp=P3;
  446.                 switch(temp)
  447.                 {
  448.                         case 0xe7:                 //        keydeal13();
  449.                                         break;
  450.                         case 0xd7:                //        keydeal14();
  451.                                         break;
  452.                         case 0xb7:         keydeal15(); break;
  453.                         case 0x77:        keydeal16(); break;
  454.                 }
  455.                 while((P3&0xf0)!=0xf0);

  456.         }
  457. }
  458. /****************显示函数*************/
  459. void display()
  460. {
  461.         uint c;
  462.         writecom(0x80+0x40+4);
  463.         if(alterflog==0)        //如果不处于修改密码状态,显示num个*
  464.         {
  465.                 for(c=0;c<num;c++){        writedate('*');        delay_xs(5);        }
  466.         }
  467.         else                  //如果处于密码修改显示num1个*
  468.         {
  469.                 for(c=0;c<num1;c++){ writedate('*'); delay_xs(5);}
  470.         }

  471. }
  472. /*******************初始化函数***********/
  473. void init()
  474. {
  475.         uint i,a,b;
  476.         num=0;                  //输入数据个数清零
  477.         num1=0;
  478.         kai=0;                   //开锁标志位清零
  479.         l1=1;                   //关闭开锁灯
  480.         alterflog=0;   //修改密码标志位清零
  481.         sda=1;                   //24c02进行释放总线
  482.         delay();        scl=1;         delay();
  483.         writecom(0x38);           //液晶初始化
  484.         writecom(0x0c);
  485.         writecom(0x06);
  486.         writecom(0x01);
  487.         for(i=0;i<8;i++)        //读取存储器中密码,并存放于mima[]中
  488.         {
  489.                 mima[i]=read24c02(i+1);
  490.         }
  491.         writecom(0x01);                //清屏
  492.         writecom(0x80);
  493.         for(a=0;a<16;a++)                //显示input password:
  494.         {
  495.                 writedate(xianshi0[a]);                delay_xs(5);
  496.         }
  497.         writecom(0x80+0x40+4);        //第二行显示--------
  498.         for(b=0;b<8;b++){        writedate('-');        }
  499. }
  500. /*****************主函数******************/
  501. void main()
  502. {
  503.         init();          //初始化
  504.         while(1)        //不停地对键盘和显示进行扫描
  505.         {
  506.                 keyscan(); //键盘扫描和密码输入处理
  507.                 display(); //LCD显示
  508.         }
  509. }
复制代码


资料只用于交流学习,请勿用于商业

全部资料51hei下载地址:
PCB和原理图源文件.zip (482.52 KB, 下载次数: 110)

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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