久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4086|回復: 9
收起左側

制作51單片機+oled12864屏幕+掉電儲存密碼鎖源程序

  [復制鏈接]
ID:926010 發(fā)表于 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:下沿觸發(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ù)進行
  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繼續(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內無法操作
  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, 下載次數(shù): 85)

評分

參與人數(shù) 1黑幣 +80 收起 理由
admin + 80 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:796844 發(fā)表于 2022-5-26 09:34 | 顯示全部樓層
有PCB文件嗎?
回復

使用道具 舉報

ID:926010 發(fā)表于 2022-5-27 11:02 | 顯示全部樓層
本帖最后由 生態(tài)蘑菇 于 2022-5-27 21:57 編輯

學校發(fā)的板子,給了原理圖
原理圖.png
回復

使用道具 舉報

ID:930312 發(fā)表于 2022-5-28 16:41 | 顯示全部樓層
生態(tài)蘑菇 發(fā)表于 2022-5-27 11:02
學校發(fā)的板子,給了原理圖

哪一個是斷電儲存模塊的引腳
回復

使用道具 舉報

ID:930312 發(fā)表于 2022-5-28 17:07 | 顯示全部樓層
掉電保存在哪里?
回復

使用道具 舉報

ID:926010 發(fā)表于 2022-5-29 10:31 | 顯示全部樓層
不需要額外引腳,我保存到單片機內部的eeprom里了(2000-2003),單片機型號就是普通的stc89c52rc
回復

使用道具 舉報

ID:607802 發(fā)表于 2024-12-18 01:54 來自手機 | 顯示全部樓層
初始密碼是啥
回復

使用道具 舉報

ID:1138967 發(fā)表于 2024-12-18 21:58 | 顯示全部樓層
太厲害了
回復

使用道具 舉報

ID:576900 發(fā)表于 2025-2-9 16:14 | 顯示全部樓層
請問這個需要字庫文件嗎,加載字庫的話,51單片機容量不會不夠嗎
回復

使用道具 舉報

ID:576900 發(fā)表于 2025-2-9 16:20 | 顯示全部樓層
請問這個OLED你用了字庫嗎,51應該存不下這么大的文件吧
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产激情在线观看 | 成人二区 | 在线视频一区二区三区 | 啪啪av| 午夜精品一区 | 欧美日韩成人 | 精品国产一区二区三区久久久四川 | 国产黄色麻豆视频 | 欧美 中文字幕 | 蜜桃av鲁一鲁一鲁一鲁 | 欧美成视频 | 亚洲男人天堂 | 狠狠爱免费视频 | 亚洲一区二区在线播放 | 一区二区精品 | 精品久久久久久久久久 | 久久久久久久久久久高潮一区二区 | 久久精品久久久久久 | 天堂一区二区三区 | 国产精品久久久久久久久久久新郎 | 婷婷色在线播放 | 99这里只有精品 | 国产精品a久久久久 | 欧美一级精品片在线看 | 国产精品18久久久久久白浆动漫 | www.99热| 国产a区| 99精品在线观看 | 人人cao | 成人影院一区二区三区 | 亚洲欧美日韩在线 | 在线观看成人av | 中文字幕在线播放不卡 | 一级黄色片日本 | 日日操夜夜操天天操 | 中文字幕免费 | 亚洲成人一区二区三区 | 97国产一区二区 | 狠狠的干狠狠的操 | 欧美美乳 | 在线播放中文字幕 |