找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC89C52单片机密码锁 程序

[复制链接]
跳转到指定楼层
楼主
完整版请看附件
  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 stop()   //停止
  50. {
  51.         sda=0;delay();scl=1;delay();sda=1;delay();
  52. }
  53. void respons()  //应答
  54. {
  55.         uchar i;
  56.         scl=1;        delay();
  57.         while((sda==1)&&(i<250)) i++;
  58.         scl=0;         delay();
  59. }
  60. uchar read_byte()                           //读一位数据
  61. {
  62.         uchar i,k;
  63.         scl=0;         delay();
  64.         sda=1;        delay();
  65.         for(i=0;i<8;i++)
  66.         {
  67.                 scl=1;        delay();        
  68.                 k=(k<<1)|sda;
  69.                 scl=0;        delay();        
  70.         }
  71.         return k;
  72. }
  73. void write24c02(uchar address,uchar date) //写一字节函数
  74. {
  75.         start();
  76.         write_byte(0xa0);
  77.         respons();
  78.         write_byte(address);
  79.         respons();
  80.         write_byte(date);
  81.         respons();
  82.         stop();
  83. }

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

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

  389.         }
  390. /******************第二行扫描**********************/
  391.         P3=0xfd;
  392.         temp=P3&0xf0;
  393.         if(temp!=0xf0)
  394.         {
  395.                 delay_xs(10);
  396.                 if(temp!=0xf0)         temp=P3;
  397.                 switch(temp)
  398.                 {
  399.                         case 0xed:        keydeal5();                break;
  400.                         case 0xdd:         keydeal6();                break;
  401.                         case 0xbd:        keydeal7();                break;
  402.                         case 0x7d:        keydeal8();                break;

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

  405.         }
  406. /*****************第三行扫描*********************/
  407.         P3=0xfb;
  408.         temp=P3&0xf0;
  409.         if(temp!=0xf0)
  410.         {
  411.                 delay_xs(10);
  412.                 if(temp!=0xf0)        temp=P3;
  413.                 switch(temp)
  414.                 {
  415.                         case 0xeb:         keydeal9();                break;
  416.                         case 0xdb:        keydeal10();        break;
  417.                         case 0xbb:        keydeal11();        break;
  418.                         case 0x7b:        keydeal12();         break;

  419.                 }
  420.                 while((P3&0xf0)!=0xf0);

  421.         }
  422. /********************第四行扫描********************/
  423.         P3=0xf7;
  424.         temp=P3&0xf0;
  425.         if(temp!=0xf0)
  426.         {
  427.                 delay_xs(10);
  428.                 if(temp!=0xf0)        temp=P3;
  429.                 switch(temp)
  430.                 {
  431.                         case 0xe7:                 //        keydeal13();
  432.                                         break;
  433.                         case 0xd7:                //        keydeal14();
  434.                                         break;
  435.                         case 0xb7:         keydeal15(); break;
  436.                         case 0x77:        keydeal16(); break;
  437.                 }
  438.                 while((P3&0xf0)!=0xf0);

  439.         }
  440. }
  441. /****************显示函数*************/
  442. void display()
  443. {
  444.         uint c;
  445.         writecom(0x80+0x40+4);
  446.         if(alterflog==0)        //如果不处于修改密码状态,显示num个*
  447.         {
  448.                 for(c=0;c<num;c++){        writedate('*');        delay_xs(5);        }
  449.         }
  450.         else                  //如果处于密码修改显示num1个*
  451.         {
  452.                 for(c=0;c<num1;c++){ writedate('*'); delay_xs(5);}
  453.         }

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


密码锁实物照片 (2)..jpg (199.72 KB, 下载次数: 42)

密码锁实物照片 (2)..jpg

密码锁实物照片 (2).jpg (203.68 KB, 下载次数: 39)

密码锁实物照片 (2).jpg

密码锁实物照片 (3)..jpg (152.29 KB, 下载次数: 47)

密码锁实物照片 (3)..jpg

实物照片课设.jpg (86.5 KB, 下载次数: 50)

实物照片课设.jpg

密码锁源程序.rar

40.02 KB, 下载次数: 27, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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