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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機密碼鎖資料 可以掉電儲存數(shù)據(jù)

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:239210 發(fā)表于 2017-10-13 17:54 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
網(wǎng)上找的清翔密碼鎖代碼
希望可以幫到大家


  1. /*********************************************************************************
  2. * 【編寫時間】: 2014年3月5日
  3. * 【作    者】: 清翔電子:03
  4. * 【版    本】: 1.0
  5. * 【實驗平臺】: QX-MCS51 單片機開發(fā)板
  6. * 【外部晶振】: 11.0592mhz
  7. * 【主控芯片】: STC89C52
  8. * 【編譯環(huán)境】: Keil μVisio3
  9. * 【程序功能】: 此程序應用AT24C02芯片可以掉電儲存數(shù)據(jù)                           
  10. * 【使用說明】:
  11. *  說明:免費開源,不提供源代碼分析.
  12. **********************************************************************************/
  13. /********************************************************************************
  14.         功能鍵
  15.       S6---S115 數(shù)字鍵0-9
  16.     S16---更改密碼  S17---更改密碼完畢后確認
  17.     S18---重試密碼、重新設(shè)定 S19---關(guān)閉密碼鎖
  18.     初始密碼:000000  密碼位數(shù):6位
  19.     注意:掉電后,所設(shè)密碼會丟失,重新上點時,密碼恢復為原始的000000
  20.     與P1相連的8位發(fā)光LED點亮代表鎖被打開;熄滅代表鎖被鎖上
  21. 程序功能:
  22.     1、開鎖:
  23.     下載程序后,直接按六次S6(即代表數(shù)字0),8位LED亮,鎖被打開,輸入密碼時,
  24.     六位數(shù)碼管依次顯示小橫杠。
  25.     2、更改密碼:
  26.     只有當開鎖(LED亮)后,該功能方可使用。
  27.     首先按下更改密碼鍵S16,然后設(shè)置相應密碼,此時六位數(shù)碼管會顯示設(shè)置密碼對應
  28.     的數(shù)字。最后設(shè)置完六位后,按下S17確認密碼更改,此后新密碼即生效。
  29.     3、重試密碼:
  30.     當輸入密碼時,密碼輸錯后按下鍵S18,可重新輸入六位密碼。
  31.     當設(shè)置密碼時,設(shè)置中途想更改密碼,也可按下此鍵重新設(shè)置。
  32.     4、關(guān)閉密碼鎖:
  33.     按下S19即可將打開的密碼鎖關(guān)閉。
  34. 推薦初級演示步驟:輸入原始密碼000000按6次S6密碼正確后LED全部亮表示鎖已打開---按下更
  35. 改密碼按鍵S16---按S6到S15設(shè)置密碼---按S17
  36.    確認密碼更改---按S19關(guān)閉密碼鎖---輸入新的密碼打開密碼鎖
  37. *******************************************************************************/
  38. #include<reg52.h>
  39. #include <intrins.h>
  40. #define uint unsigned int
  41. #define uchar unsigned char
  42. uchar old1,old2,old3,old4,old5,old6; //原始密碼000000
  43. uchar new1,new2,new3,new4,new5,new6;  //每次MCU采集到的密碼輸入
  44. uchar a=16,b=16,c=16,d=16,e=16,f=16; //送入數(shù)碼管顯示的變量
  45. uchar wei,key,temp;
  46. bit allow,genggai,ok,wanbi,retry,close;  //各個狀態(tài)位
  47. sbit dula=P2^6;
  48. sbit wela=P2^7;
  49. sbit beep=P2^3;
  50. sbit sda=P2^0;                          //IO口定義
  51. sbit scl=P2^1;
  52. unsigned char code table[]=
  53. {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
  54. 0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40};
  55. /*****************IIC芯片24C02存儲器驅(qū)動程序************************************/
  56. void nop()
  57. {
  58. _nop_();
  59. _nop_();
  60. }
  61. /////////24C02讀寫驅(qū)動程序////////////////////
  62. void delay1(unsigned int m)
  63. { unsigned int n;
  64.    for(n=0;n<m;n++);
  65. }
  66. void init()  //24c02初始化子程序
  67. {
  68. scl=1;
  69. nop();
  70. sda=1;
  71. nop();
  72. }
  73. void start()        //啟動I2C總線
  74. {
  75. sda=1;
  76. nop();
  77. scl=1;
  78. nop();
  79. sda=0;
  80. nop();
  81. scl=0;
  82. nop();
  83. }
  84. void stop()         //停止I2C總線
  85. {
  86. sda=0;
  87. nop();
  88. scl=1;
  89. nop();
  90. sda=1;
  91. nop();
  92. }
  93. void writebyte(unsigned char j)  //寫一個字節(jié)
  94. {
  95. unsigned char i,temp;
  96.     temp=j;
  97.     for (i=0;i<8;i++)
  98.    {
  99.     temp=temp<<1;
  100.     scl=0;
  101.     nop();
  102.     sda=CY;  //temp左移時,移出的值放入了CY中
  103.     nop();
  104.     scl=1;  //待sda線上的數(shù)據(jù)穩(wěn)定后,將scl拉高
  105.     nop();
  106.    }
  107.    scl=0;
  108.    nop();
  109.    sda=1;
  110.    nop();
  111. }
  112. unsigned char readbyte()   //讀一個字節(jié)
  113. {
  114.    unsigned char i,j,k=0;
  115.    scl=0; nop(); sda=1;
  116.    for (i=0;i<8;i++)
  117.    {  
  118.   nop(); scl=1; nop();
  119.        if(sda==1)
  120.   j=1;
  121.        else
  122.   j=0;
  123.        k=(k<<1)|j;
  124.     scl=0;
  125. }
  126.     nop();
  127. return(k);
  128. }
  129. void clock()         //I2C總線時鐘
  130. {
  131.    unsigned char i=0;
  132.    scl=1;
  133.    nop();
  134.    while((sda==1)&&(i<255))
  135.       i++;
  136.    scl=0;
  137.    nop();
  138. }
  139. ////////從24c02的地址address中讀取一個字節(jié)數(shù)據(jù)/////
  140. unsigned char read24c02(unsigned char address)
  141. {
  142.    unsigned char i;
  143.    start();
  144.    writebyte(0xa0);
  145.    clock();
  146.    writebyte(address);
  147.    clock();
  148.    start();
  149.    writebyte(0xa1);
  150.    clock();
  151.    i=readbyte();
  152.    stop();
  153.    delay1(100);
  154.    return(i);
  155. }
  156. //////向24c02的address地址中寫入一字節(jié)數(shù)據(jù)info/////
  157. void write24c02(unsigned char address,unsigned char info)
  158. {
  159.    start();
  160.    writebyte(0xa0);
  161.    clock();
  162.    writebyte(address);
  163.    clock();
  164.    writebyte(info);
  165.    clock();
  166.    stop();
  167.    delay1(5000); //這個延時一定要足夠長,否則會出錯。因為24c02在從sda上取得數(shù)據(jù)后,還需要一定時間的燒錄過程。
  168. }
  169. /****************************密碼鎖程序模塊********************************************************/
  170. void delay(unsigned char i)
  171. {
  172. uchar j,k;
  173.   for(j=i;j>0;j--)
  174.     for(k=125;k>0;k--);
  175. }
  176. void display(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f)
  177. {
  178.    dula=0;
  179.    P0=table[a];
  180.    dula=1;
  181.    dula=0;
  182.    
  183.    wela=0;
  184.    P0=0xfe;
  185.    wela=1;
  186.    wela=0;
  187.    delay(5);
  188.    
  189.    P0=table[b];
  190.    dula=1;
  191.    dula=0;
  192.    
  193.    P0=0xfd;
  194.    wela=1;
  195.    wela=0;
  196.    delay(5);
  197.    P0=table[c];
  198.    dula=1;
  199.    dula=0;
  200.    
  201.    P0=0xfb;
  202.    wela=1;
  203.    wela=0;
  204.    delay(5);
  205.    
  206.    P0=table[d];
  207.    dula=1;
  208.    dula=0;
  209.    
  210.    P0=0xf7;
  211.    wela=1;
  212.    wela=0;
  213.    delay(5);
  214.    
  215.    P0=table[e];
  216.    dula=1;
  217.    dula=0;
  218.    
  219.    P0=0xef;
  220.    wela=1;
  221.    wela=0;
  222.    delay(5);
  223.    
  224.    P0=table[f];
  225.    dula=1;
  226.    dula=0;
  227.    
  228.    P0=0xdf;
  229.    wela=1;
  230.    wela=0;
  231.    delay(5);
  232. }

  233. void keyscan()
  234. {
  235.   {
  236.     P3=0xfe;
  237.     temp=P3;
  238.     temp=temp&0xf0;
  239.     if(temp!=0xf0)
  240.     {
  241.       delay(10);
  242.       if(temp!=0xf0)
  243.       {
  244.         temp=P3;
  245.         switch(temp)
  246.         {
  247.           case 0xee:
  248.                key=0;
  249.       wei++;
  250.                break;
  251.           case 0xde:
  252.                key=1;
  253.       wei++;
  254.                break;
  255.           case 0xbe:
  256.                key=2;
  257.       wei++;
  258.                break;
  259.           case 0x7e:
  260.                key=3;
  261.       wei++;
  262.                break;
  263.          }
  264.          while(temp!=0xf0)
  265.         {
  266.            temp=P3;
  267.            temp=temp&0xf0;
  268.            beep=0;
  269.          }
  270.          beep=1;
  271.       }
  272.     }
  273.     P3=0xfd;
  274.     temp=P3;
  275.     temp=temp&0xf0;
  276.     if(temp!=0xf0)
  277.     {
  278.       delay(10);
  279.       if(temp!=0xf0)
  280.       {
  281.         temp=P3;
  282.         switch(temp)
  283.         {
  284.           case 0xed:
  285.                key=4;
  286.       wei++;
  287.                break;
  288.           case 0xdd:
  289.                key=5;
  290.       wei++;
  291.                break;
  292.           case 0xbd:
  293.                key=6;
  294.       wei++;
  295.                break;
  296.           case 0x7d:
  297.                key=7;
  298.       wei++;
  299.                break;
  300.          }
  301.          while(temp!=0xf0)
  302.          {
  303.            temp=P3;
  304.            temp=temp&0xf0;
  305.            beep=0;
  306.          }
  307.          beep=1;
  308.       }
  309.       }
  310.     P3=0xfb;
  311.     temp=P3;
  312.     temp=temp&0xf0;
  313.     if(temp!=0xf0)
  314.     {
  315.       delay(10);
  316.       if(temp!=0xf0)
  317.       {
  318.         temp=P3;
  319.         switch(temp)
  320.         {
  321.           case 0xeb:
  322.                key=8;
  323.       wei++;
  324.                break;
  325.           case 0xdb:
  326.                key=9;
  327.       wei++;
  328.                break;
  329.       
  330.           case 0xbb:
  331.                genggai=1;
  332.       wei=0;
  333.                break;
  334.           case 0x7b:
  335.         if(allow)
  336.                ok=1;
  337.                break;
  338.          }
  339.         while(temp!=0xf0)
  340.          {
  341.            temp=P3;
  342.            temp=temp&0xf0;
  343.            beep=0;
  344.          }
  345.          beep=1;
  346.       }
  347.       }
  348.    P3=0xf7;
  349.     temp=P3;
  350.     temp=temp&0xf0;
  351.     if(temp!=0xf0)
  352.     {
  353.       delay(10);
  354.       if(temp!=0xf0)
  355.       {
  356.         temp=P3;
  357.         switch(temp)
  358.         {
  359.           case 0xe7:
  360.         retry=1;
  361.                break;
  362.           case 0xd7:
  363.         close=1;
  364.                break;
  365.          }
  366.         while(temp!=0xf0)
  367.          {
  368.            temp=P3;
  369.            temp=temp&0xf0;
  370.            beep=0;
  371.          }
  372.          beep=1;
  373.       }
  374.       }
  375. }
  376. }
  377. void shumima()  //對按鍵采集來的數(shù)據(jù)進行分配
  378. {
  379. if(!wanbi)
  380. {
  381. switch(wei)
  382. {
  383.   case 1:new1=key;
  384.        if(!allow) a=17;
  385.       else a=key; break;
  386.   case 2:new2=key;
  387.     if(a==17) b=17;
  388.     else b=key; break;
  389.   case 3:new3=key;
  390.     if(a==17) c=17;
  391.     else c=key; break;
  392.   case 4:new4=key;
  393.     if(a==17) d=17;
  394.     else d=key; break;
  395.   case 5:new5=key;
  396.     if(a==17) e=17;
  397.     else e=key; break;
  398.   case 6:new6=key;
  399.     if(a==17) f=17;
  400.     else f=key;
  401.     wanbi=1; break;
  402. }
  403. }
  404. }
  405. void yanzheng()   //驗證密碼是否正確
  406. {
  407. if(wanbi)  //只有當六位密碼均輸入完畢后方進行驗證
  408. {
  409. if((new1==old1)&(new2==old2)&(new3==old3)&(new4==old4)&(new5==old5)&(new6==old6))
  410.   allow=1; //當輸入的密碼正確,會得到allowe置一
  411. }
  412. }
  413. void main()
  414. {

  415. init();        //初始化24C02
  416. /*********下面的一小段程序的功能為格式化密碼存儲區(qū)。************
  417. ******當24c02中這些存儲區(qū)由于其他程序的運行而導致***************
  418. *******所存數(shù)據(jù)發(fā)生了變化,或者密碼遺忘時, ********************
  419. ******可以刪掉其前面的注釋線,然后重新編譯下載。****************
  420. ******而將密碼還原為000000后,請將下面的程序用******************
  421. ******注釋屏蔽掉,重新編譯、下載,方可正常使用****************/
  422. // write24c02(110,0x00);
  423. // write24c02(111,0x00);//24c02的第110到115地址單元作為密碼存儲區(qū)
  424. // write24c02(112,0x00);
  425. // write24c02(113,0x00);
  426. // write24c02(114,0x00);
  427. // write24c02(115,0x00);
  428. /*******************************************************************/

  429. old1=read24c02(110);  
  430. old2=read24c02(111);
  431. old3=read24c02(112);
  432. old4=read24c02(113);
  433. old5=read24c02(114);
  434. old6=read24c02(115);
  435. while(1)
  436. {
  437.   keyscan();
  438.   shumima();
  439.   yanzheng();
  440.   if(allow)  //驗證完后,若allow為1,則開鎖
  441.   {
  442.    P1=0x00;
  443.    if(!genggai)
  444.     wanbi=0;
  445.   }
  446.   if(genggai)   //當S16更改密碼鍵被按下,genggai會被置一
  447.   {
  448.    if(allow)  //若已經(jīng)把鎖打開,才有更改密碼的權(quán)限
  449.    {
  450.     while(!wanbi) //當新的六位密碼沒有設(shè)定完,則一直在這里循環(huán)
  451.     {
  452.       keyscan();
  453.      shumima();
  454.      if(retry|close)  //而當探測到重試鍵S18或者關(guān)閉密碼鎖鍵S19被按下時,則跳出
  455.      { wanbi=1;
  456.       break;
  457.      }
  458.      display(a,b,c,d,e,f);
  459.     }
  460.    }
  461.   }
  462.   if(ok)   //更改密碼時,當所有六位新密碼均被按下時,可以按下此鍵,結(jié)束密碼更改
  463.   {    //其他時間按下此鍵無效
  464.    ok=0; wei=0;
  465.    genggai=0;
  466.    old1=new1;old2=new2;old3=new3; //此時,舊的密碼將被代替
  467.    old4=new4;old5=new5;old6=new6;
  468.    //新密碼寫入存儲區(qū)。
  469.    write24c02(110,old1);
  470.    write24c02(111,old2);
  471.    write24c02(112,old3);
  472.    write24c02(113,old4);
  473.    write24c02(114,old5);
  474.    write24c02(115,old6);
  475.    a=16;b=16;c=16;d=16;e=16;f=16;
  476.   }
  477.   if(retry) //當重試按鍵S18被按下,retry會被置位
  478.   {
  479.   retry=0; wei=0;wanbi=0;
  480.   a=16;b=16;c=16;d=16;e=16;f=16;
  481.   new1=0;new2=0;new3=0;new4=0;new5=0;new6=0;  
  482.   }
  483.   if(close)  //當關(guān)閉密碼鎖按鍵被按下,close會被置位
  484.   {
  485.    close=0;genggai=0;//所有變量均被清零。
  486.    wei=0; wanbi=0;
  487.    allow=0;
  488.    P1=0xff;
  489.    a=16;b=16;c=16;d=16;e=16;f=16;
  490.    new1=0;new2=0;new3=0;new4=0;new5=0;new6=0;
  491.   }
  492.   display(a,b,c,d,e,f); //實時顯示
  493. }
  494. }
復制代碼

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

使用道具 舉報

沙發(fā)
ID:358326 發(fā)表于 2018-6-25 12:40 | 只看該作者
大哥  有圖嗎?
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美激情欧美激情在线五月 | 成人在线观看网址 | 97偷拍视频 | 精品永久 | 天天色天天色 | 亚洲福利一区 | 四虎影视免费在线 | 日韩中文字幕免费在线观看 | 欧美成人手机在线 | 国产视频第一页 | av第一页| 久久国产欧美日韩精品 | 亚洲欧美中文字幕在线观看 | 亚洲欧美精品国产一级在线 | 一区二区三区亚洲 | 国产精品久久久久久婷婷天堂 | a在线视频 | 欧美日韩免费视频 | 日韩欧美手机在线 | 国产九九九 | 亚洲自拍偷拍视频 | 亚洲国产一区在线 | 91久久婷婷 | 亚洲在线免费观看 | 亚洲成人精品在线 | 欧美国产亚洲一区二区 | 国产精品免费在线 | 激情五月婷婷综合 | 午夜小电影 | 黄色网络在线观看 | 伊人春色在线 | 日韩一区在线播放 | 久久久久久久一区 | av在线一区二区 | 成人欧美一区二区三区黑人孕妇 | 国产成人一区二 | 9191在线播放 | 乳色吐息在线观看 | 日韩精品一区二区三区在线 | 欧美精品成人 | 国产成人精品一区二区三区在线观看 |