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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 1722|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

51單片機(jī)密碼鎖程序 存儲(chǔ)在I2C 密碼掉電不丟失

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
設(shè)計(jì)內(nèi)容:
1、密碼存儲(chǔ)在I2C器件中,實(shí)現(xiàn)密碼掉電不丟失。
2、電路板一上電四個(gè)數(shù)碼管顯示“-“
3、實(shí)現(xiàn)數(shù)字鍵0-9和功能鍵的設(shè)計(jì):
4、四個(gè)功能鍵:
(1)密碼輸入
(2)退出
(3)密碼修改:當(dāng)密碼密碼修改鍵按下,若輸入密碼正確后,按下此鍵時(shí),將修改的密碼進(jìn)行存儲(chǔ)。輸入密碼正確顯示”8888“
輸入失敗顯示”HHHH“

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)

單片機(jī)源程序如下:
  1. #include <reg51.h>
  2. #include <intrins.h>
  3. #include <string.h>

  4. typedef unsigned char u8;
  5. typedef unsigned int u16;

  6. #define SMG_PORT P0
  7. #define KEY_MATRIX_PORT  P1
  8. #define AT24C02_ADDRESS  0xA0

  9. u8 gsmg_code[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f,0x40,0x76};//0-9 "-" "H"
  10. u8 e_mima[4] = {1, 2, 3, 4}; // 初始密碼是1234
  11. u8 read_mima[4];
  12. u8 entered_password[4];  // 存儲(chǔ)用戶輸入的密碼
  13. u8 input_index = 0;
  14. u8 key = 0;
  15. u8 wei=0;
  16. u8 panduan=0;//判斷密碼是否正確
  17. u8 state=0;
  18. u8 xiugai=0;
  19. u8 wdata=0;
  20. u8 show_h=0;

  21. sbit led=P2^7;
  22. sbit LSA = P2^2;
  23. sbit LSB = P2^3;
  24. sbit LSC = P2^4;

  25. sbit sda=P2^0;  
  26. sbit scl=P2^1;

  27. u8 chushi = 1;

  28. //@11.0592MHz
  29. void Delay10ms()
  30. {
  31.     unsigned char i, j;
  32.     i = 108;
  33.     j = 145;
  34.     do
  35.     {
  36.         while (--j);
  37.     } while (--i);
  38. }

  39. //@11.0592MHz
  40. void delay_us(unsigned int us)
  41. {
  42.     unsigned int i;
  43.     while(us--)
  44.     {
  45.         i = 11;  // 11 是根據(jù) 11.0592MHz 晶振頻率調(diào)整的數(shù)值
  46.         while (--i);
  47.     }
  48. }

  49. void delayms(u16 x)
  50. {
  51. u8 i;
  52. while(x--)
  53. {
  54.   for(i=150;i>0;i--);
  55. }
  56. }


  57. void nop()
  58. {
  59.         _nop_();
  60.         _nop_();
  61. }
  62. /////////24C02讀寫驅(qū)動(dòng)程序////////////////////
  63. void delay1(unsigned int m)
  64. {        unsigned int n;
  65.           for(n=0;n<m;n++);
  66. }

  67. void init()  //24c02初始化子程序
  68. {
  69.         scl=1;
  70.         nop();
  71.         sda=1;
  72.         nop();
  73. }

  74. void start()        //啟動(dòng)I2C總線
  75. {
  76.         sda=1;
  77.         nop();
  78.         scl=1;
  79.         nop();
  80.         sda=0;
  81.         nop();
  82.         scl=0;
  83.         nop();
  84. }

  85. void stop()         //停止I2C總線
  86. {
  87.         sda=0;
  88.         nop();
  89.         scl=1;
  90.         nop();
  91.         sda=1;
  92.         nop();
  93. }

  94. void writebyte(unsigned char j)  //寫一個(gè)字節(jié)
  95. {
  96.         unsigned char i,temp;
  97.            temp=j;
  98.            for (i=0;i<8;i++)
  99.    {
  100.            temp=temp<<1;
  101.            scl=0;
  102.            nop();
  103.            sda=CY;                //temp左移時(shí),移出的值放入了CY中
  104.            nop();
  105.            scl=1;                //待sda線上的數(shù)據(jù)穩(wěn)定后,將scl拉高
  106.            nop();
  107.    }
  108.    scl=0;
  109.    nop();
  110.    sda=1;
  111.    nop();
  112. }

  113. unsigned char readbyte()   //讀一個(gè)字節(jié)
  114. {
  115.    unsigned char i,j,k=0;
  116.    scl=0; nop(); sda=1;
  117.    for (i=0;i<8;i++)
  118.    {  
  119.                 nop(); scl=1; nop();
  120.               if(sda==1)
  121.                 j=1;
  122.               else
  123.                 j=0;
  124.               k=(k<<1)|j;
  125.                   scl=0;
  126.         }
  127.            nop();
  128.         return(k);
  129. }

  130. void clock()         //I2C總線時(shí)鐘
  131. {
  132.    unsigned char i=0;
  133.    scl=1;
  134.    nop();
  135.    while((sda==1)&&(i<255))
  136.              i++;
  137.    scl=0;
  138.    nop();
  139. }

  140. ////////從24c02的地址address中讀取一個(gè)字節(jié)數(shù)據(jù)/////
  141. unsigned char read24c02(unsigned char address)
  142. {
  143.    unsigned char i;
  144.    start();
  145.    writebyte(0xa0);
  146.    clock();
  147.    writebyte(address);
  148.    clock();
  149.    start();
  150.    writebyte(0xa1);
  151.    clock();
  152.    i=readbyte();
  153.    stop();
  154.    delay1(10);
  155.    return(i);
  156. }

  157. //////向24c02的address地址中寫入一字節(jié)數(shù)據(jù)info/////
  158. void write24c02(unsigned char address,unsigned char info)
  159. {
  160.    start();
  161.    writebyte(0xa0);
  162.    clock();
  163.    writebyte(address);
  164.    clock();
  165.    writebyte(info);
  166.    clock();
  167.    stop();
  168.    delay1(50);
  169. }

  170. u8 key_matrix_ranks_scan(void)
  171. {
  172.     u8 key_value = 0;
  173.     KEY_MATRIX_PORT = 0xf7; //第一列為低電平
  174.     if (KEY_MATRIX_PORT!= 0xf7) //有按鍵按下
  175.     {
  176.         Delay10ms();
  177.         switch(KEY_MATRIX_PORT)
  178.         {
  179.             case 0x77: key_value = 1; break; //S1按下時(shí)
  180.             case 0xb7: key_value = 4; break;
  181.             case 0xd7: key_value = 7; break;
  182.             case 0xe7: key_value = 10; break;
  183.         }
  184.     }
  185.     while(KEY_MATRIX_PORT!= 0xf7); //等待釋放,當(dāng)按鍵按下時(shí)KEY值不等于0xf7,一直循環(huán),當(dāng)按鍵釋放時(shí),KEY等于0xf7,跳出循環(huán)

  186.     KEY_MATRIX_PORT = 0xfb; //第二列為低電平
  187.     if (KEY_MATRIX_PORT!= 0xfb) //有按鍵按下
  188.     {
  189.         Delay10ms();
  190.         switch(KEY_MATRIX_PORT)
  191.         {
  192.             case 0x7b: key_value = 2; break;
  193.             case 0xbb: key_value = 5; break;
  194.             case 0xdb: key_value = 8; break;
  195.             case 0xeb:/* key_value = 11;*/ break;
  196.         }
  197.     }
  198.     while(KEY_MATRIX_PORT!= 0xfb);

  199.     KEY_MATRIX_PORT = 0xfd; //第三列為低電平
  200.     if (KEY_MATRIX_PORT!= 0xfd) //有按鍵按下
  201.     {
  202.         Delay10ms();
  203.         switch(KEY_MATRIX_PORT)
  204.         {
  205.             case 0x7d: key_value = 3; break;
  206.             case 0xbd: key_value = 6; break;
  207.             case 0xdd: key_value = 9; break;
  208.             case 0xed:/* key_value = 12; */break;
  209.         }
  210.     }
  211.     while(KEY_MATRIX_PORT!= 0xfd);

  212.     KEY_MATRIX_PORT = 0xfe; //第四列為低電平
  213.     if (KEY_MATRIX_PORT!= 0xfe)
  214.     {
  215.         Delay10ms();
  216.         switch(KEY_MATRIX_PORT)
  217.         {
  218.             case 0x7e: key_value = 13; break; //S1按鍵按下時(shí)
  219.             case 0xbe: key_value = 14; break;
  220.             case 0xde: key_value = 15; break;
  221.             case 0xee: key_value = 16; break;
  222.         }
  223.     }
  224.     while(KEY_MATRIX_PORT!= 0xfe);

  225.     return key_value;
  226. }

  227. // 顯示單個(gè)數(shù)字到指定的數(shù)碼管位
  228. void display_on_smg(u8 num, u8 pos)
  229. {
  230.     switch (pos)
  231.     {
  232.         case 1: LSC = 1; LSB = 1; LSA = 1; break; // 第1位
  233.         case 2: LSC = 1; LSB = 1; LSA = 0; break; // 第2位
  234.         case 3: LSC = 1; LSB = 0; LSA = 1; break; // 第3位
  235.         case 4: LSC = 1; LSB = 0; LSA = 0; break; // 第4位
  236.     }
  237.     SMG_PORT = 0x00;
  238.     SMG_PORT = gsmg_code[num];
  239.                 delay_us(5);
  240.                 SMG_PORT = 0x00;
  241. }


  242. void clear_display(void)
  243. {
  244.     LSC = 1; LSB = 0; LSA = 0;
  245.     SMG_PORT = 0x00; // 清空顯示
  246. }

  247. void show_8888(void)
  248. {
  249.   display_on_smg(8,1);
  250.         display_on_smg(8,2);
  251.         display_on_smg(8,3);
  252.         display_on_smg(8,4);
  253. }

  254. void show_HHHH(void)
  255. {
  256.   display_on_smg(11,1);
  257.         display_on_smg(11,2);
  258.         display_on_smg(11,3);
  259.         display_on_smg(11,4);
  260. }

  261. void show____(void)
  262. {
  263.         display_on_smg(10,1);
  264.         display_on_smg(10,2);
  265.         display_on_smg(10,3);
  266.         display_on_smg(10,4);
  267. }

  268. //輸入密碼
  269. void import_ss()
  270. {
  271.         u8 i;
  272.         for (i = 0; i < 4; i++)
  273.         {
  274.                         e_mima[i] = read_mima[i];
  275.         }
  276.   if (key!= 0 && key!=13 && key!=14 && key!=15 && key!=16)
  277.         {
  278.                 wei++;
  279.                 entered_password[input_index] = key-1;
  280.                 input_index++;
  281.                 if (input_index >= 4)
  282.                 {
  283.                         input_index = 0;
  284.                 }
  285.         }
  286.         if(wei==1)
  287.         {
  288.           display_on_smg(10, 1);
  289.   }
  290.         else if(wei==2)
  291.         {
  292.           display_on_smg(10, 1);
  293.                 display_on_smg(10, 2);
  294.         }
  295.         else if(wei==3)
  296.         {
  297.           display_on_smg(10, 1);
  298.                 display_on_smg(10, 2);
  299.                 display_on_smg(10, 3);
  300.         }
  301.         else if(wei==4)
  302.         {
  303.                 display_on_smg(10, 1);
  304.                 display_on_smg(10, 2);
  305.                 display_on_smg(10, 3);
  306.                 display_on_smg(10, 4);
  307.                 panduan=1;
  308.                 wei=0;
  309.         }
  310.         if(panduan==1)
  311.         {
  312.                 if(panduan==1)
  313.                 {
  314.                         // 比較密碼
  315.                         if (entered_password[0] == e_mima[0] && entered_password[1] == e_mima[1] && entered_password[2] == e_mima[2] && entered_password[3] == e_mima[3])
  316.                         {
  317.                                 show_8888();
  318.                                 led=0;
  319.                         }
  320.                         else
  321.                         {
  322.                                 show_HHHH();
  323.                                 led=1;
  324.                         }
  325.                 }
  326.         }
  327. }
  328. // 密碼修改
  329. void xiugai_ss(void)
  330. {
  331.         u8 i,j;
  332.         
  333.         for (i = 0; i < 4; i++)
  334.         {
  335.                         e_mima[i] = read_mima[i];
  336.         }
  337.     if (key!= 0 && key!= 13 && key!= 14 && key!= 15 && key!= 16)
  338.     {
  339.         entered_password[input_index] = key - 1;
  340.         input_index++;
  341.         if (input_index >= 4)
  342.         {
  343.             if (state == 0)
  344.             {
  345.                 // 輸入原密碼階段
  346.                 if (entered_password[0] == e_mima[0] && entered_password[1] == e_mima[1] && entered_password[2] == e_mima[2] && entered_password[3] == e_mima[3])
  347.                 {
  348.                     state = 1; // 原密碼正確,進(jìn)入輸入新密碼狀態(tài)
  349.                     input_index = 0;
  350.                     clear_display();
  351.                                                                           led=0;
  352.                                                                         show_h=0;
  353.                 }
  354.                 else
  355.                 {
  356.                     show_h=1;
  357.                     state = 0;
  358.                     input_index = 0;
  359.                 }
  360.             }
  361.             else if (state == 1)
  362.             {
  363.                 // 輸入新密碼階段
  364.                 if (input_index == 4 )
  365.                 {
  366.                                                                           // 輸入新密碼階段
  367.                 if (input_index == 4)
  368.                 {
  369.                     state = 2; // 輸入新密碼完成,進(jìn)入確認(rèn)狀態(tài)
  370.                     input_index = 0;
  371.                 }
  372.                 }
  373.             }
  374.         }
  375.     }
  376.     // 顯示已輸入的密碼
  377.     for (j = 0; j < input_index; j++)
  378.     {
  379.         display_on_smg(10, j + 1);
  380.     }
  381.                 if (state == 2 && key == 16)
  382.     {
  383.                         led=1;
  384.         // 確認(rèn)修改密碼
  385.         for (i = 0; i < 4; i++)
  386.         {
  387.            e_mima[i] = entered_password[i];
  388.                                  }
  389.                                 wdata=1;
  390.                                 show_8888();
  391.         state = 0;
  392.         input_index = 0;
  393.         chushi = 1;
  394.         xiugai = 0;
  395.         show____(); // 修改完成后返回初始界面顯示
  396.     }
  397. }


  398. void main()
  399. {
  400.         u8 i;
  401.         led=1;
  402.         init();        //初始化24C02
  403.         // 上電從 24C02 讀取數(shù)據(jù)
  404.         for (i = 0; i < 4; i++)
  405.         {
  406.                 read_mima[i] = read24c02(i);
  407.                 delayms(3);
  408.         }
  409.     while(1)
  410.     {
  411.                         // 上電從 24C02 讀取數(shù)據(jù)
  412.                         for (i = 0; i < 4; i++)
  413.                         {
  414.                                 read_mima[i] = read24c02(i);
  415.                                 delayms(3);
  416.                         }
  417.                         if(wdata==1)
  418.                         {
  419.                           write24c02(0, entered_password[0]); // 將修改后的密碼發(fā)送給 24C02
  420.                                 delayms(3);
  421.         write24c02(1, entered_password[1]);
  422.                                 delayms(3);
  423.                                 write24c02(2, entered_password[2]);
  424.                                 delayms(3);
  425.                                 write24c02(3, entered_password[3]);
  426.                                 delayms(3);
  427.                                 wdata=0;
  428.                         }
  429.                         if(show_h==1)
  430.                         {
  431.                           show_HHHH();
  432.                         }
  433.                         
  434.         key = key_matrix_ranks_scan();
  435.         if (key == 13)//輸入鍵
  436.         {
  437.                                         chushi = 0;
  438.                                         panduan=0;
  439.                                         clear_display();
  440.         }
  441.                                 if(key==14)//退出鍵
  442.                                 {
  443.                                   chushi=1;
  444.                                 }
  445.                                 if(key==15)//密碼修改
  446.                                 {
  447.                                         show_h=0;
  448.                                         chushi=2;
  449.                                         panduan=0;
  450.                                   clear_display();
  451.                                 }
  452.                                 if(key==16)
  453.                                 {
  454.                                         xiugai=1;
  455.                                 }
  456.                                 
  457.                                 if(chushi==1)
  458.                                 {
  459.                                         show____();
  460.                                         led=1;
  461.                                 }
  462.         else if (chushi == 0)
  463.         {
  464.            import_ss();
  465.         }
  466.                                 else if(chushi==2)
  467.                                 {
  468.                                   xiugai_ss();
  469.                                 }
  470.     }
  471. }
復(fù)制代碼

仿真程序.7z (222.12 KB, 下載次數(shù): 0)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:433219 發(fā)表于 2025-1-22 09:10 | 只看該作者
mcu 有 IAP功能,當(dāng)eeprom 可省略iic的24c
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产成人高清 | 成人激情视频在线观看 | 亚洲国产精品视频 | 99国内精品久久久久久久 | 久久久久久中文字幕 | 亚洲乱码一区二区 | 天天插天天射天天干 | 婷婷在线网站 | 精品日韩 | 久久这里只有精品首页 | 国产91在线 | 中日 | 日韩在线观看一区 | 日韩国产欧美一区 | 91在线资源 | 日韩一区二区三区视频 | 成人欧美一区二区三区黑人孕妇 | 成年人黄色小视频 | 福利一区二区在线 | 美日韩免费| 日韩亚洲欧美一区 | 91资源在线 | 免费一区二区三区 | 97色免费视频| 国产精品久久久久久久久久久久 | 成人在线视频网站 | 亚洲国产精品一区在线观看 | 国产精品海角社区在线观看 | 在线观看av不卡 | 懂色中文一区二区在线播放 | 成人一区二 | 麻豆久久久久久久久久 | 丁香久久 | 成人一区二区在线 | 亚洲aⅴ精品 | 亚洲国产欧美一区二区三区久久 | 久久成人国产 | 成人午夜电影网 | 成人小视频在线观看 | 自拍偷拍亚洲一区 | 国产成人精品午夜视频免费 | 成人小视频在线免费观看 |