找回密码
 立即注册

QQ登录

只需一步,快速开始

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

制作51单片机+oled12864屏幕+掉电储存密码锁源程序

[复制链接]
ID:926010 发表于 2022-5-25 13:32 | 显示全部楼层 |阅读模式
制作密码锁,在51黑里受益颇多;这次设计结束,反馈给大家
制作出来的实物图如下:
图片1.png 图片2.png 图片3.png
单片机源程序如下:
  1. #include<reg51.h>
  2. #include<OLED.h>
  3. #include<keypad.h>
  4. #include<intrins.h>
  5. #include<eeprom.h>


  6. #define uchar unsigned char
  7. #define uint unsigned int
  8.         
  9. sbit LED1=P1^7;
  10. sbit BEEP=P3^7;
  11. uchar x=11,count,j;


  12. void Delay()                //@11.0592MHz
  13. {
  14.         
  15. unsigned char i, t, k;

  16.         _nop_();
  17.         _nop_();
  18.         i = 20;
  19.         t = 3;
  20.         k = 203;
  21.         do
  22.         {
  23.                 do
  24.                 {
  25.                         while (--k);
  26.                 } while (--t);
  27.         } while (--i);

  28. }




  29. void Timer_init (void)
  30. {
  31.           EA = 1;                                        //中断总开关  
  32.                 TMOD=0x01;                  //设置定时器0工作方式1后面运行TR位启动
  33.                 TH0=(65536-50000)/256;
  34.                 TL0=(65536-50000)%256;
  35.                 ET0=1;
  36.                
  37. //          IT0 = 1;                 //1:下沿触发  0:低电平触发
  38.            
  39. }


  40. void Tenseconds()
  41.         {
  42.         if(x==10)
  43.   OLED_DisplayText(1,3,"10",OLED_NOT_INVERT_COLOR);        
  44.         if(x==9)
  45.         OLED_DisplayText(1,3," 9",OLED_NOT_INVERT_COLOR);
  46.         if(x==8)
  47.         OLED_DisplayText(1,3," 8",OLED_NOT_INVERT_COLOR);
  48.         if(x==7)
  49.         OLED_DisplayText(1,3," 7",OLED_NOT_INVERT_COLOR);
  50.         if(x==6)
  51.         OLED_DisplayText(1,3," 6",OLED_NOT_INVERT_COLOR);
  52.         if(x==5)
  53.         OLED_DisplayText(1,3," 5",OLED_NOT_INVERT_COLOR);
  54.         if(x==4)
  55.         OLED_DisplayText(1,3," 4",OLED_NOT_INVERT_COLOR);
  56.         if(x==3)
  57.         OLED_DisplayText(1,3," 3",OLED_NOT_INVERT_COLOR);
  58.         if(x==2)        
  59.         OLED_DisplayText(1,3," 2",OLED_NOT_INVERT_COLOR);
  60.         if(x==1)        
  61.         OLED_DisplayText(1,3," 1",OLED_NOT_INVERT_COLOR);
  62.         if(x==0)        
  63.         {
  64.         OLED_Clear();
  65.                 OLED_DisplayText(1,1,"请按返回键返回",OLED_NOT_INVERT_COLOR);
  66.         OLED_DisplayText(3,0,"返回",OLED_NOT_INVERT_COLOR);
  67.                 j=0;
  68.         }
  69. }        
  70.         
  71. void Enter()                 //确定键,只有按下s13才可以继续进行
  72. {   uchar dat;
  73.          do{P2=0xf0;                                                        
  74.               while(P2==0xf0);                                                
  75.           dat=key_scan();
  76.               }while(dat!=0x0a);
  77. }

  78. void System()        
  79. {
  80.         OLED_DisplayText(0,2,"淮北师范大学",OLED_NOT_INVERT_COLOR);
  81.         OLED_DisplayText(1,2,"电子信息工程班",OLED_NOT_INVERT_COLOR);
  82.         OLED_DisplayText(2,2,"20191304032",OLED_NOT_INVERT_COLOR);
  83.                 Delay();
  84. }




  85. void press(uchar *s,uchar x)    //按键输入
  86. {
  87.         uchar dat;
  88.         int num;
  89.         for(num=0;num<=4;num++)
  90.         {  
  91. //**************************************************
  92.                 if(num>=4)
  93. {     P2=0xf0;                                                                  
  94.            while(P2==0xf0);
  95.        dat=key_scan();
  96.            if((dat!=0x0a) && (dat!=0x0b)&& (dat!=0x0c))
  97.                  {
  98.                          num--;
  99.                  }
  100.                   if(dat==0x0a)
  101.                  {
  102.                  OLED_DisplayText(x,num," ",OLED_NOT_INVERT_COLOR);
  103.                  }
  104.                           if(dat==0x0b)
  105.                                  {
  106.                                  OLED_DisplayText(x,num-1,"-",OLED_NOT_INVERT_COLOR);
  107.                                          s--;
  108.                                          num=num-2;
  109.                                  }
  110.                                  if(dat==0x0c)
  111.                                  {
  112.                                          s=s-num;
  113.                                  num=-1;
  114.                                          OLED_DisplayText(x,0,"----",OLED_NOT_INVERT_COLOR);
  115.                                  }
  116.            
  117.          }                                 
  118.                     else                        
  119.                                 {
  120.            P2=0xf0;                                                         
  121.            while(P2==0xf0);                                                
  122.        dat=key_scan();
  123.            if((dat!=0x0a)&&(dat!=0x0b)&&(dat!=0x0c))
  124.          {   *s=dat;
  125.                          OLED_DisplayText(x,num,"*",OLED_NOT_INVERT_COLOR);
  126.                                          s++;        
  127.                         
  128.                   }
  129.                                 if(dat==0x0b)
  130.                                  {
  131.                                  OLED_DisplayText(x,num-1,"-",OLED_NOT_INVERT_COLOR);
  132.                                          s--;
  133.                                          num=num-2;
  134.                                  }        
  135.                                  if(dat==0x0c)
  136.                                  {
  137.                                          s=s-num;
  138.                                  num=-1;
  139.                                          OLED_DisplayText(x,0,"----",OLED_NOT_INVERT_COLOR);
  140.                                  }
  141.                          }
  142.         }
  143.         
  144. }
  145.         

  146. void main()
  147. { int dat,x;
  148.         OLED_Init();
  149.         Timer_init ();
  150.         System();
  151.                
  152.   read();//第一次输入烧录时,请将这里改为 “write();”!!!!
  153.         
  154.         do{
  155.                 LED1=1;
  156.                 BEEP=1;
  157.                 OLED_Clear();
  158.                 OLED_DisplayText(0,0,"请输入密码:",OLED_NOT_INVERT_COLOR);//OLED显示文本(行(0到3行), 列(0到15列),文本, 是否反色)        
  159.                 OLED_DisplayText(1,0,"----",OLED_NOT_INVERT_COLOR);//OLED显示文本(行(0到3行), 列(0到15列),文本, 是否反色)
  160.                 OLED_DisplayText(3,0,"确定",OLED_NOT_INVERT_COLOR);//OLED显示文本(行(0到3行), 列(0到15列),文本, 是否反色)
  161.                 OLED_DisplayText(3,12,"删除",OLED_NOT_INVERT_COLOR);//OLED显示文本(行(0到3行), 列(0到15列),文本, 是否反色)
  162.           press(key,1);
  163.         if((key[0]==iic[0])&&(key[1]==iic[1])&&(key[2]==iic[2])&&(key[3]==iic[3]))
  164.         {  
  165.                 j=0;
  166.                 OLED_Clear();
  167.                 OLED_DisplayText(3,12,"    ",OLED_NOT_INVERT_COLOR);
  168.                 OLED_DisplayText(0,0,"直接开锁请按1",OLED_NOT_INVERT_COLOR);
  169.                 OLED_DisplayText(1,0,"修改密码请按2",OLED_NOT_INVERT_COLOR);
  170.                 do
  171.                     {
  172.                        P2=0xf0;                                                        //键入1或2继续执行下面语句,否则等待
  173.                    while(P2==0xf0);                                                
  174.                dat=key_scan();
  175.                  }while(dat!=0x01&&dat!=0x02);
  176.                     if(dat==1)                                                       //开锁
  177.                     {
  178.                                         OLED_Clear();
  179.                         LED1=0;
  180.                                 OLED_DisplayText(1,4,"开锁成功!",OLED_INVERT_COLOR );
  181.                                         OLED_DisplayText(3,0,"返回",OLED_NOT_INVERT_COLOR );
  182.                                         Enter();
  183.                            
  184.                      }
  185.                     if(dat==2)                                                        //修改密码
  186.                    {    OLED_Clear();
  187.                        do{
  188.                                                  OLED_Clear();
  189.                              OLED_DisplayText(0,0,"输入修改密码:",OLED_NOT_INVERT_COLOR);
  190.                                                    OLED_DisplayText(1,0,"----",OLED_NOT_INVERT_COLOR);
  191.                                   press(key,1);
  192.                                  OLED_DisplayText(2,0,"确定密码:",OLED_NOT_INVERT_COLOR);   //再次输入密码
  193.                                                  OLED_DisplayText(3,0,"----",OLED_NOT_INVERT_COLOR);
  194.                                   press(iic,3);
  195.                                       if((key[0]==iic[0])&&(key[1]==iic[1])&&(key[2]==iic[2])&&(key[3]==iic[3]))
  196.                                       {
  197.                                                                 OLED_Clear();
  198.                                         OLED_DisplayText(1,4,"修改成功!",OLED_INVERT_COLOR);
  199.                                                                 OLED_DisplayText(3,0,"返回",OLED_NOT_INVERT_COLOR );
  200.                                                                
  201.                  Erase();//第一次输入烧录时,请将这里注释掉!!!!
  202.                  write();//第一次输入烧录时,请将这里注释掉!!!!
  203.                                                                
  204.                                                                 Enter();break;                        //修改密码成功
  205.                                        }
  206.                                       else                             //修改密码不成功,重新修改
  207.                                           {
  208.                                                         OLED_Clear();
  209.                                                                 OLED_DisplayText(3,12,"    ",OLED_NOT_INVERT_COLOR);
  210.                                               OLED_DisplayText(1,2,"两次密码不一致",OLED_INVERT_COLOR);
  211.                                                         OLED_DisplayText(2,4,"请重新输入",OLED_INVERT_COLOR);
  212.                                                         OLED_DisplayText(3,0,"返回",OLED_NOT_INVERT_COLOR );
  213.                                                         Enter();
  214.                                            }
  215.                                   }while(1);   
  216.                     }
  217.         }
  218.                  
  219.                 else                                                                           //密码不正确,重新输入密码
  220.                 {
  221.                         
  222.                          j++;
  223.                         if(j==3)         //如果输错超过3次,开启定时器中断,键盘锁住,10s内无法操作
  224.                         {
  225.                           TR0=1;
  226.                                 
  227.                          }
  228.                         OLED_Clear();
  229.                         
  230.                          if (j<=2)
  231.                          {
  232.                                  BEEP=0;
  233.                          }
  234.                          else
  235.                          {BEEP=1;}
  236.                         
  237.                                  OLED_DisplayText(3,12,"     ",OLED_NOT_INVERT_COLOR);
  238.                   OLED_DisplayText(1,4,"密码错误",OLED_INVERT_COLOR);
  239.                          OLED_DisplayText(3,0,"返回",OLED_NOT_INVERT_COLOR );
  240.                          Enter();
  241.                  }        
  242.          }        
  243.         while(1);
  244. }




  245. void TimeInterrupt() interrupt 1  //定时器中断服务程序
  246. {
  247.                
  248.                 TH0=(65536-50000)/256;
  249.                 TL0=(65536-50000)%256;
  250.         count++;
  251.     if (count>=20)
  252.     {
  253.                         count=0;
  254.                    x--;
  255.                         OLED_DisplayText(1,5,"秒后解锁",OLED_NOT_INVERT_COLOR);        
  256.                         Tenseconds();
  257.                         if(x<=0)
  258.                   {
  259.                                 TR0=0;
  260.                                 x=11;
  261.                   }
  262.                 }
  263. }
复制代码

附件是Keil5代码下载(1个文件):
oled12864(IIC) 掉电储存密码锁.zip (84.67 KB, 下载次数: 85)

评分

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

查看全部评分

回复

使用道具 举报

ID:796844 发表于 2022-5-26 09:34 | 显示全部楼层
有PCB文件吗?
回复

使用道具 举报

ID:926010 发表于 2022-5-27 11:02 | 显示全部楼层
本帖最后由 生态蘑菇 于 2022-5-27 21:57 编辑

学校发的板子,给了原理图
原理图.png
回复

使用道具 举报

ID:930312 发表于 2022-5-28 16:41 | 显示全部楼层
生态蘑菇 发表于 2022-5-27 11:02
学校发的板子,给了原理图

哪一个是断电储存模块的引脚
回复

使用道具 举报

ID:930312 发表于 2022-5-28 17:07 | 显示全部楼层
掉电保存在哪里?
回复

使用道具 举报

ID:926010 发表于 2022-5-29 10:31 | 显示全部楼层
不需要额外引脚,我保存到单片机内部的eeprom里了(2000-2003),单片机型号就是普通的stc89c52rc
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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