標(biāo)題: 制作51單片機(jī)+oled12864屏幕+掉電儲存密碼鎖源程序 [打印本頁]

作者: 生態(tài)蘑菇    時間: 2022-5-25 13:32
標(biāo)題: 制作51單片機(jī)+oled12864屏幕+掉電儲存密碼鎖源程序
制作密碼鎖,在51黑里受益頗多;這次設(shè)計(jì)結(jié)束,反饋給大家
制作出來的實(shí)物圖如下:

單片機(jī)源程序如下:
  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;                                        //中斷總開關(guān)  
  32.                 TMOD=0x01;                  //設(shè)置定時器0工作方式1后面運(yùn)行TR位啟動
  33.                 TH0=(65536-50000)/256;
  34.                 TL0=(65536-50000)%256;
  35.                 ET0=1;
  36.                
  37. //          IT0 = 1;                 //1:下沿觸發(fā)  0:低電平觸發(fā)
  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才可以繼續(xù)進(jìn)行
  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,"淮北師范大學(xué)",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繼續(xù)執(zhí)行下面語句,否則等待
  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內(nèi)無法操作
  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  //定時器中斷服務(wù)程序
  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. }
復(fù)制代碼

附件是Keil5代碼下載(1個文件):
oled12864(IIC) 掉電儲存密碼鎖.zip (84.67 KB, 下載次數(shù): 85)



作者: 愛迪生電子    時間: 2022-5-26 09:34
有PCB文件嗎?

作者: 生態(tài)蘑菇    時間: 2022-5-27 11:02
本帖最后由 生態(tài)蘑菇 于 2022-5-27 21:57 編輯

學(xué)校發(fā)的板子,給了原理圖

原理圖.png (169.71 KB, 下載次數(shù): 125)

原理圖.png

作者: NO2    時間: 2022-5-28 16:41
生態(tài)蘑菇 發(fā)表于 2022-5-27 11:02
學(xué)校發(fā)的板子,給了原理圖

哪一個是斷電儲存模塊的引腳
作者: NO2    時間: 2022-5-28 17:07
掉電保存在哪里?
作者: 生態(tài)蘑菇    時間: 2022-5-29 10:31
不需要額外引腳,我保存到單片機(jī)內(nèi)部的eeprom里了(2000-2003),單片機(jī)型號就是普通的stc89c52rc
作者: 555555222    時間: 2024-12-18 01:54
初始密碼是啥
作者: lukamodric    時間: 2024-12-18 21:58
太厲害了
作者: 千江水    時間: 2025-2-9 16:14
請問這個需要字庫文件嗎,加載字庫的話,51單片機(jī)容量不會不夠嗎

作者: 千江水    時間: 2025-2-9 16:20
請問這個OLED你用了字庫嗎,51應(yīng)該存不下這么大的文件吧
作者: herui2128    時間: 2025-5-4 13:00
謝謝分享,我主要對單片機(jī)驅(qū)動那個小屏感興趣,看看代碼試試能不能驅(qū)動




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1