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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3949|回復: 6
收起左側

單片機電子密碼鎖程序 如何設定密碼鎖的初始密碼呢?

[復制鏈接]
ID:745179 發表于 2020-5-7 18:03 | 顯示全部樓層 |閱讀模式
5黑幣
能否有大神解答一下,如何設定密碼鎖的初始密碼呢???!!!要想將初始密碼設置為123456應該如何操作呢?

//-----------------------------------------------------------------
//  名稱: 基于單片機的電子密碼鎖設計
//-----------------------------------------------------------------
//  說明: 初始密碼由24C04.BIN設定為"123456".
//             按下數字鍵0-9可輸入密碼,不超過6位,輸入完成后按下A
//             鍵開鎖,密碼正確時LED點亮,液晶屏顯示開鎖成功.
//             其他鍵功能是:B-上鎖 C-重新輸入密碼 D-保存新密碼 E-清除
//             重設密碼時要求先輸入正確的密碼成功開鎖.
//                     
//-----------------------------------------------------------------
  1. #include <reg51.h>
  2. #include <string.h>
  3. #define INT8U unsigned char
  4. #define INT16U  unsigned int
  5. //上次按鍵和當前按鍵序號,該矩陣中序號范圍為0-15,16表示無按鍵
  6. INT8U Pre_KeyNo = 16, keyNo = 16 ;
  7. INT8U DSY_BUFFER[10] = "";                                                        //顯示緩沖
  8. INT8U UserPassword[7] = "";                                                        //用戶輸入的密碼
  9. INT8U IIC_Password[7];                                                                //從IIC存儲器讀取的密碼
  10. extern void Initialize_LCD();                                                //液晶初始化
  11. extern void LCD_ShowString(INT8U, INT8U ,INT8U*);        //顯示字符串
  12. extern void IIC_Init();                                                                //IIC初始化
  13. extern INT8U Random_Read(INT8U,INT16U);                                //從指定地址讀取1字節
  14. extern void Write_IIC(INT8U,INT16U,INT8U);                        //向指定地址寫入1字節
  15. extern void delay_ms(INT16U x);                                                //延時函數
  16. //INT8U Keys_Scan();                                                        //掃描鍵盤返回鍵值
  17. void Beep();                                                                                //蜂鳴器
  18. sbit LED_OPEN =  P2^7;                                                                //開鎖亮燈
  19. sbit BEEP = P3^7;                                                                        //蜂鳴器
  20. // void delay_ms(INT16U ms)
  21. // {
  22. //     INT8U i;
  23. //    while(ms--)
  24. //      for(i=0;i<120;i++);
  25. // }
  26. INT8U Keys_Scan()
  27. {
  28.           //高四位置0,放入四行,掃描四列
  29.     P1=0x0F;delay_ms(1);
  30.     if(P1==0x0F){keyNo=0xFF; return 16;}  //無按鍵時提前返回
  31.     //按鍵后00001111將變成0000XXXX,X中1個為0,3個仍為1
  32.     //下面判斷按鍵發生于0-3列中的哪一列
  33.     switch(P1)
  34.     {
  35.         case 0x0E:keyNo=0;break;       //按鍵在第0列
  36.         case 0x0D:keyNo=1;break;       //按鍵在第1列
  37.         case 0x0B:keyNo=2;break;       //按鍵在第2列
  38.         case 0x07:keyNo=3;break;       //按鍵在第3列
  39.         default: keyNo=16;return 16;    //無按鍵按下,提前返回
  40.     }
  41.     //低四位置0,放入四列,掃描四行
  42.     P1=0xF0;delay_ms(1);
  43.     //按鍵后11110000將變成XXXX0000,X中1個為0,3個仍為1
  44.     //下面判斷按鍵發生于0-3列中的哪一行
  45.     //對0-3行分別附加的起始值為:0,4,8,12
  46.     switch(P1)
  47.     {
  48.         case 0xE0:keyNo+=0;break;       //按鍵在第0行
  49.         case 0xD0:keyNo+=4;break;       //按鍵在第1行
  50.         case 0xB0:keyNo+=8;break;       //按鍵在第2行
  51.         case 0x70:keyNo+=12;break;      //按鍵在第3行
  52.         default: keyNo=16;            //無按鍵按下
  53.    }
  54.    return keyNo;
  55. }
  56. //-----------------------------------------------------------------
  57. // 蜂鳴器子程序         
  58. //-----------------------------------------------------------------
  59. void Beep()
  60. {
  61.         INT8U i;for (i = 0; i < 100; i++) { delay_ms(1); BEEP = ~BEEP; }
  62.         BEEP = 0;         
  63. }
  64. //-----------------------------------------------------------------
  65. // 清除密碼
  66. //-----------------------------------------------------------------
  67. void Clear_Pwd() {UserPassword[0]='\0'; DSY_BUFFER[0]='\0';                       }
  68. //-----------------------------------------------------------------
  69. // 讀取密碼字符串(以'\0'為結束標志)
  70. //-----------------------------------------------------------------
  71. void Read_IIC_Pwd()
  72. {
  73.    INT8U i=-1;                          //因為只限于讀取存儲器前半部分,故;類型可設為INT8U
  74.    //從0x0000地址開始讀取I2C存儲器保存的密碼,長度不超過6個字符
  75.    //下面的循環最多讀取7個字符(0~6:包括密碼字符串最末尾的'\0')
  76.    do {i++;IIC_Password[i]=Random_Read(0xA0,i);}
  77.    while (IIC_Password[i]!='\0' && i<6);
  78.    //如果循環結束后未遇到結束標志,則直接在字符串末尾補上結束標志
  79.    if(IIC_Password[i]!='\0')  
  80.      IIC_Password[i]='\0';


  81. }
  82. //-----------------------------------------------------------------
  83. // 寫密碼字符串(結束標志'\0'注意一并寫入)
  84. //-----------------------------------------------------------------
  85. void Write_IIC_Pwd()
  86. {
  87.     INT8U i=0;
  88.    //循環寫入密碼字符,字符串末尾的'\0'也要寫入,最多7個字符(0~6)
  89.    while(i<=6)
  90.    {   Write_IIC(0xA0,i,UserPassword[i]);  delay_ms(5);
  91.        if(UserPassword[i]=='\0')  break;
  92.            i++;
  93.    }
  94.    //如果循環結束時密碼字符串末尾未遇到'\0'則直接向I2C補充寫入'\0'
  95.    if(UserPassword[i]!='\0')         Write_IIC(0xA0,i,'\0');


  96. }
  97. //-----------------------------------------------------------------
  98. // 主程序
  99. //-----------------------------------------------------------------
  100. void main()
  101. {
  102.      INT8U i=0;
  103.    INT8U IS_Valid_User=0;
  104.    P0=0xFF; P1=0xFF; P2=0xFF;
  105.    delay_ms(10);
  106.    Initialize_LCD();                         //初始化LCD
  107.    LCD_ShowString(0,0,"Your Password...");
  108.    Read_IIC_Pwd();                          //將密碼讀入IIC_Password
  109.    while(1)
  110.    {  P1=0xF0;
  111.           if(P1!=0xF0) keyNo=Keys_Scan();       //掃描鍵盤或許鍵序號
  112.           switch(keyNo)
  113.           { case 0: case 1: case 2: case 3: case 4:
  114.             case 5: case 6: case 7: case 8: case 9:
  115.                      if(i<=5)                       //密碼不超過6位
  116.                            {  //如果i為0則執行一次清屏
  117.                              if(i==0)          LCD_ShowString(1,0,"            ");
  118.                                  UserPassword[i]=keyNo+'0';
  119.                                  UserPassword[i+1]='\0';
  120.                                  DSY_BUFFER[i]='*';
  121.                                  DSY_BUFFER[i+1]='\0'; i++;
  122.                                  LCD_ShowString(1,0,DSY_BUFFER);
  123.                            }
  124.                            break;
  125.                  case 10://按A鍵開鎖
  126.                          Read_IIC_Pwd();            //從I2C存儲器讀取密碼
  127.                                  if(strcmp(UserPassword,IIC_Password)==0)
  128.                                  {  LED_OPEN=0;             //點亮LED
  129.                                     Clear_Pwd();
  130.                                         LCD_ShowString(1,0,"UNLOCK OK !      ");
  131.                                         IS_Valid_User=1;
  132.                                  }  
  133.                                  else
  134.                                  {  LED_OPEN=1;             //關閉LED  
  135.                                      Clear_Pwd();
  136.                                         LCD_ShowString(1,0,"ERROR !      ");
  137.                                         IS_Valid_User=0;
  138.                                  }
  139.                                  i=0;break;
  140.                  case 11://按B鍵上鎖
  141.                                  LED_OPEN=1;
  142.                                  Clear_Pwd();
  143.                                  LCD_ShowString(0,0,"YOUR PASSEORD...");
  144.                                  LCD_ShowString(1,0,"                ");
  145.                                  i=0;  IS_Valid_User=0;break;
  146.                  case 12://按C鍵設置新密碼
  147.                                  //如果是合法用戶則提示輸入新密碼
  148.                                  if(!IS_Valid_User)
  149.                                      LCD_ShowString(1,0,"NO RIGHTS  !");
  150.                                  else
  151.                                  {  i=0;                                        //密碼輸入緩沖索引歸零
  152.                                         LCD_ShowString(0,0,"NEW PASSEORD:...");
  153.                                         LCD_ShowString(1,0,"                ");
  154.                                  }
  155.                                  break;
  156.                  case 13://按D鍵保存新密碼
  157.                                  if(!IS_Valid_User)
  158.                                          LCD_ShowString(1,0,"NO RIGHTS     !");
  159.                                  else
  160.                                  {   //寫入新設置的新密碼,并重新讀回
  161.                                          Write_IIC_Pwd();delay_ms(5);Read_IIC_Pwd();
  162.                                      i=0; //密碼輸入緩沖索引歸0
  163.                                          LCD_ShowString(0,0,"YOUR PASSEORD...");
  164.                                          LCD_ShowString(1,0,"PASSWORD SAVED! ");
  165.                                  }
  166.                                  break;
  167.                  case 14://按E鍵清除所有輸入
  168.                                  i=0;          Clear_Pwd();
  169.                                  LCD_ShowString(1,0,"                ");
  170.       }
  171.           Beep();delay_ms(100); P1=0xF0;
  172.           while(P1!=0xF0);                                                //如果有鍵未釋放則等待
  173.           while(P1==0xF0);                                                //如果沒有再次按下按鍵則等待
  174.    }


  175. }
  176. //-----------------------------------------------------------------
  177. // 液晶控制與顯示程序
  178. //-----------------------------------------------------------------
  179. #include <reg51.h>
  180. #include <intrins.h>
  181. #define INT8U  unsigned char
  182. #define INT16U unsigned int
  183. sbit RS = P2^0;                //寄存器選擇線
  184. sbit RW = P2^1;                //讀/寫控制線
  185. sbit EN = P2^2;                //使能控制線
  186. //-----------------------------------------------------------------
  187. // 延時
  188. //-----------------------------------------------------------------
  189. void delay_ms(INT16U ms){INT8U i; while(ms--) for(i = 0; i < 120; i++);}
  190. //-----------------------------------------------------------------
  191. // 忙等待
  192. //-----------------------------------------------------------------
  193. void Busy_Wait()
  194. {
  195.    INT8U LCD_Status;
  196.     do
  197.     {
  198.        P0=0XFF;                  //液晶屏端口初始置高電平   
  199.        EN=0;RS=0;RW=1;           //LCD禁止,選擇狀態寄存器,準備讀
  200.        EN=1;LCD_Status=P0;       //LCD使能,從P0端口讀取液晶屏狀態字節
  201.        EN=0;                     //LCD禁止
  202.     }while(LCD_Status & 0x80);   //液晶屏忙繼續循環

  203. }

  204. //-----------------------------------------------------------------
  205. // 寫LCD命令
  206. //-----------------------------------------------------------------
  207. void Write_LCD_Command(INT8U cmd)
  208. {
  209.     Busy_Wait();                //LCD忙等待
  210.     EN=0;RS=0;RW=0;             //LCD禁止,選擇命令寄存器,準備寫
  211.     P0=cmd;                     //命令字節放到LCD端口
  212.     EN=1;_nop_();EN=0;          //使能LCD,寫入后禁止LCD

  213. }

  214. //-----------------------------------------------------------------
  215. // 發送數據
  216. //-----------------------------------------------------------------
  217. void Write_LCD_Data(INT8U dat)
  218. {
  219.     Busy_Wait();                //LCD忙等待   
  220.     EN=0;RS=1;RW=0;             //LCD禁止,選擇數據寄存器,準備寫
  221.     P0=dat;                     //數據字節放到LCD端口
  222.     EN=1;_nop_();EN=0;          //使能LCD,寫入后禁止LCD

  223. }

  224. //-----------------------------------------------------------------
  225. // LCD初始化
  226. //-----------------------------------------------------------------
  227. void Initialize_LCD()
  228. {
  229.     Write_LCD_Command(0x38);delay_ms(1);  //置功能,8位,雙行,5*7
  230.     Write_LCD_Command(0x01);delay_ms(1);  //清屏
  231.     Write_LCD_Command(0x06);delay_ms(1);  //字符進入模式:屏幕不動,字符后移
  232.     Write_LCD_Command(0x0C);delay_ms(1);  //顯示開,關光標

  233. }

  234. //-----------------------------------------------------------------
  235. // 顯示字符串
  236. //-----------------------------------------------------------------
  237. void LCD_ShowString(INT8U r, INT8U c,INT8U *str)
  238. {
  239.     INT8U i=0;                           
  240.     code INT8U DDRAM[]={0x80,0xC0};       //1602LCD兩行的起始DDRAM地址
  241.     Write_LCD_Command(DDRAM[r] | c);      //設置顯示起始位置
  242.     for(i=0;str[i]&&i<16;i++)             //輸出字符串
  243.       Write_LCD_Data(str[i]);
  244.     for(;i<16;i++)                        //不足一行時用空格填充
  245.      Write_LCD_Data(' ');

  246. }
  247. //-----------------------------------------------------------------
  248. // 名稱: 24C04 IIC讀寫程序
  249. //-----------------------------------------------------------------
  250. #define INT8U  unsigned char
  251. #define INT16U unsigned int
  252. #include <reg51.h>
  253. #include <intrins.h>
  254. sbit SCL = P3^2;                //串行時鐘
  255. sbit SDA = P3^3;                //串行數據
  256. #include "I2C.h"                //IIC總線通用宏及函數
  257. //-----------------------------------------------------------------
  258. // 向指定的地址寫數據
  259. // 器件選擇碼字節格式 (其中E2,E1為片選位,A8為塊地址位)
  260. // 位: B7 B6 B5 B4 B3 B2 B1 B0
  261. // 值:  1  0  1  0 E2 E1 A8 RW
  262. //-----------------------------------------------------------------
  263. void Write_IIC(INT8U Dev_Addr,INT16U mem_addr,INT8U dat)
  264. {
  265.            IIC_Start();                                                           //啟動總線
  266.     //發送器件地址
  267.         if(mem_addr<0x0100)   IIC_WriteByte(Dev_Addr);
  268.         else                                  IIC_WriteByte(Dev_Addr | 0x02);
  269.         //寫內存地址,或寫成:IIC_WriteByte(men_addr&0xFF);
  270.         IIC_WriteByte(mem_addr);
  271.         IIC_WriteByte(dat);                                                   //寫數據字節
  272.         IIC_Stop();                                //總線停止

  273. }

  274. //-----------------------------------------------------------------
  275. // 從任意地址讀取數據(器件選擇碼字節參上一函數說明)
  276. //-----------------------------------------------------------------
  277. INT8U Random_Read(INT8U Dev_Addr,INT16U mem_addr)
  278. {
  279.            INT8U d;
  280.         IIC_Start();                                                           //總線啟動
  281.         //發送器件地址
  282.         if(mem_addr<0x0100)   IIC_WriteByte(Dev_Addr);
  283.         else                                  IIC_WriteByte(Dev_Addr | 0x02);
  284.         IIC_WriteByte(mem_addr);                                   //寫器件內存地址
  285.         IIC_Start();                                                           //總線重新啟動
  286.         //內存地址mem_addr小于256(0x0100)時,讀器件內存前半部分
  287.         //否則讀器件內存的后半部分,故而有器件地址有:
  288.         //Dev_Addr|0x01及Dev_Addr|0x03這兩種寫法
  289.         if(mem_addr<0x0100)   IIC_WriteByte(Dev_Addr | 0x01);//前半部分
  290.         else                                  IIC_WriteByte(Dev_Addr | 0x03);//后半部分
  291.         d=IIC_ReadByte(); IIC_NAck(); IIC_Stop();//讀取一字節,非應答,停止
  292.         return d;


  293. }
復制代碼


最佳答案

查看完整內容

給你個思路吧,如果初始密碼只用一次,修改后就失效,可以先讀一次存儲器,新的AT24C04每個地址存的都是0XFF,假設只用三個地址來存6位密碼,若初始讀出來為(255*100+255)×100+255,則寫入初始密碼123456。 mima=AT24C02_read_date(200); //讀取存儲在AT24C02的密碼 mima=mima*100+AT24C02_read_date(201); mima=mima*100+AT24C02_read_date(202); if(mima==2575755) ...
回復

使用道具 舉報

ID:452950 發表于 2020-5-7 18:03 | 顯示全部樓層
本帖最后由 xxpp2011 于 2020-5-11 19:33 編輯
AA11 發表于 2020-5-11 13:36
那請問應該如何進行保存的呢?

給你個思路吧,如果初始密碼只用一次,修改后就失效,可以先讀一次存儲器,新的AT24C04每個地址存的都是0XFF,假設只用三個地址來存6位密碼,若初始讀出來為(255*100+255)×100+255,則寫入初始密碼123456。
        mima=AT24C02_read_date(200);                         //讀取存儲在AT24C02的密碼
        mima=mima*100+AT24C02_read_date(201);
        mima=mima*100+AT24C02_read_date(202);
  if(mima==2575755)
        {
        AT24C02_write_date(200,12);
        AT24C02_write_date(201,34);
        AT24C02_write_date(202,56);
        mima=123456;                  
        }
如果初始密碼一直有效就容易點,判斷密碼是否正確時可以并列條件,輸入123456和修改后的密碼都能通過。
回復

使用道具 舉報

ID:328014 發表于 2020-5-10 18:35 | 顯示全部樓層
看樣子是保存在存儲芯片里面的
回復

使用道具 舉報

ID:452950 發表于 2020-5-10 18:48 | 顯示全部樓層
假如用新的AT24C04的六個地址來存6位密碼,那每個地址初始讀出來的都是255,需要先寫一段代碼將123456寫進對應地址。
回復

使用道具 舉報

ID:748862 發表于 2020-5-11 10:22 | 顯示全部樓層
把123456寫到程序執行的條件中,只有當輸入為123456才可執行對應的程序
回復

使用道具 舉報

ID:745179 發表于 2020-5-11 11:46 | 顯示全部樓層
xxpp2011 發表于 2020-5-10 18:48
假如用新的AT24C04的六個地址來存6位密碼,那每個地址初始讀出來的都是255,需要先寫一段代碼將123456寫進 ...

那請問該如何修改呢,能用keil軟件編譯嗎?
回復

使用道具 舉報

ID:745179 發表于 2020-5-11 13:36 | 顯示全部樓層
51hei團團 發表于 2020-5-10 18:35
看樣子是保存在存儲芯片里面的

那請問應該如何進行保存的呢?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品久久久99 | 成人免费片 | 亚洲激精日韩激精欧美精品 | 日韩精品极品视频在线观看免费 | 自拍 亚洲 欧美 老师 丝袜 | 毛片a级 | 精品国产一区二区三区性色av | 欧美一级一区 | 国产精品欧美一区二区 | 欧美寡妇偷汉性猛交 | 日韩国产中文字幕 | 久久精品国产一区二区三区 | 成年人在线观看 | www日韩| 免费观看黄色片视频 | 一区二区高清不卡 | 亚洲精品v日韩精品 | 久久看精品 | 中文字幕日韩欧美 | 91精品国产91久久综合桃花 | 国产综合av | 午夜小视频在线播放 | 欧美成人精品一区二区男人看 | 国产日韩欧美一区二区 | 天天拍天天操 | 久久免费视频网 | 黄色片免费看视频 | 综合成人在线 | 日韩亚洲欧美一区 | 欧美片网站免费 | 欧美男人天堂 | 成人久久一区 | 国产精品免费一区二区三区 | 欧美视频网 | 女人夜夜春| 91原创视频 | 夜操| 在线观看中文字幕视频 | 三级高清 | 一区二区三区视频在线 | 日韩免费在线视频 |