找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机密码锁程序-无储存

[复制链接]
跳转到指定楼层
楼主
ID:405619 发表于 2018-11-30 16:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
密码锁-无储存(掉电密码丢失,可根据自己需求加存储如24c02)

单片机源程序如下:
  1. #include<reg52.h>
  2. #include"LCD.H"
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. uchar count=1,ci=0;//修改密码时,只清屏一次,给wei=-1赋初值
  6. uchar mima[4];
  7. bit flag,flag1,flag2;//flag为按键14,15是否有效,flag1为修改密码是否有效,flag2为初始化密码是否有效
  8. sbit beep=P1^5;
  9. uchar table[4];//初始密码
  10. uchar code table1[]="pass word!";
  11. uchar code table2[]="welcome!";
  12. uchar code table3[]="error!";
  13. uchar code table4[]="alarm!";
  14. uchar code table5[]="new mima!";

  15. void feng()        //蜂鸣器函数
  16. {
  17. uchar i;
  18. for(i=0;i<10;i++)
  19. {
  20.   beep=0;
  21.   delayms(200);
  22.   beep=1;
  23.   delayms(200);
  24. }
  25. }

  26. void chushi()  //初始函数
  27. {
  28. uchar i;
  29. write_byte(0,0x82);
  30. for(i=0;i<10;i++)
  31. {
  32.   write_byte(1,table1[i]);
  33. }
  34. write_byte(1,'[');
  35. write_byte(1,0x30+count); //count是输入密码次数,当3次时,蜂鸣器报错
  36. write_byte(1,']');
  37. }

  38. void bijiao()        //比较函数
  39. {
  40. uchar i;
  41. keyscan();                //键盘扫描函数
  42. if(flag1==0)        //当修改密码没有按下时,正常输入密码
  43. {
  44.   if((keynum>=0)&&(keynum<=9))
  45.   {
  46.    write_byte(0,0xc0+wei);
  47.    if((wei>=0)&&(wei<=3))//密码为4位,wei位密码位数
  48.    {
  49.      write_byte(1,'*');
  50.      mima[wei]=keynum;        //将密码存入到mima[]数组中,用于比较
  51.    }
  52.   }
  53. }
  54. if(flag1==1)//当密码修改按下时
  55. {
  56.   if(ci==0)         //清屏,wei=-1,只执行一次
  57.   {
  58.    write_byte(0,0x01);
  59.    delayms(20);
  60.    wei=-1;
  61.    ci++;          //
  62.   }
  63.   else
  64.   {
  65.    write_byte(0,0x84);           //修改密码
  66.    for(i=0;i<8;i++)
  67.    {
  68.     write_byte(1,table5[i]);
  69.    }
  70.    if((keynum>=0)&&(keynum<=9))        //修改密码位数为4
  71.    {
  72.     write_byte(0,0xc0+wei);
  73.     if((wei>=0)&&(wei<=3))
  74.     {
  75.      write_byte(1,0x30+keynum);
  76.          table[wei]=keynum;
  77.     }
  78.    }
  79.    flag=1;          //开按键14,关按键15
  80.    flag2=1;          //将修改后的密码存入table[]中
  81.    count=1;          //输入密码次数为1
  82.   }
  83. }

  84. if(flag==0)        //按键15有效
  85. {
  86.   if(flag2==0)         //初始密码有效
  87.   {
  88.    table[0]=1;table[1]=2;table[2]=3;table[3]=4;
  89.   }
  90.   if(keynum==15)  
  91.   {
  92.    if((mima[0]==table[0])&&(mima[1]==table[1])&&
  93.       (mima[2]==table[2])&&(mima[3]==table[3]))        //密码比较 ,正确的话显示welcome
  94.    {
  95.     write_byte(0,0x01);
  96.     delayms(20);
  97.     write_byte(0,0x82);
  98.     for(i=0;i<8;i++)
  99.     {
  100.      write_byte(1,table2[i]);
  101.     }
  102.     while(1);
  103.    }         
  104.    else                                  //错误的话显示error
  105.    {
  106.     write_byte(0,0x01);
  107.     delayms(20);
  108.     write_byte(0,0x84);
  109.     for(i=0;i<6;i++)
  110.     {
  111.      write_byte(1,table3[i]);
  112.     }
  113.     count++;                 //输入次数,最多三次
  114.     flag=1;                         //按键14打开,15关闭
  115.         if(count>=4)        //多余三次蜂鸣器响
  116.         {       
  117.          write_byte(0,0x84);
  118.      for(i=0;i<6;i++)
  119.      {
  120.       write_byte(1,table4[i]);
  121.      }
  122.          feng();
  123.          while(1);
  124.         }
  125.    }
  126.   }
  127.   if(keynum==13) //按键13修改密码有效
  128.   {
  129.    flag1=1;
  130.   }
  131. }
  132. if(flag==1)   //按键14有效
  133. {
  134.   if(keynum==14)         //清屏,初始化,输入次数加一
  135.   {
  136.    write_byte(0,0x01);
  137.    delayms(20);
  138.    chushi();
  139.    wei=-1;
  140.    flag=0;                //按键15有效
  141.    flag1=0;                //修改密码无效
  142.   }
  143. }
  144. }


  145. void main()
  146. {
  147. init_lcd1602();
  148. chushi();
  149. while(1)
  150. {
  151.   bijiao();
  152. }
  153. }
复制代码

所有资料51hei提供下载:
密码锁-无存储.zip (37.42 KB, 下载次数: 10)


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

使用道具 举报

沙发
ID:1 发表于 2018-12-1 02:17 | 只看该作者
补全原理图或者详细说明一下电路连接即可获得100+黑币
回复

使用道具 举报

板凳
ID:282457 发表于 2018-12-1 10:54 | 只看该作者
其实,使用STC单片机的话,如STC89C52,根本不需要AT24CXX的,CPU本身就有5K的eeprom,如果对实时性要求不高,一般场合使用足矣。起始地址0x2000,以扇区为单位,每个扇区512B.即0x2000为一个扇区开始;0x2200为第二个扇区开始,扇区间隔0x200,以此类推。

eeprom.rar

1.19 KB, 下载次数: 3, 下载积分: 黑币 -5

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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