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

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

QQ登錄

只需一步,快速開(kāi)始

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

單片機(jī)密碼鎖源代碼(掉電可記憶密碼)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:260372 發(fā)表于 2017-12-12 11:43 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
仿真原理圖:http://www.zg4o1577.cn/bbs/dpj-101350-1.html
單片機(jī)源程序如下:
  1. /********************************************************************************
  2.                                                                 功能鍵
  3.                                                 S6---S115        數(shù)字鍵0-9
  4.                                 S16---更改密碼                S17---更改密碼完畢后確認(rèn)
  5.                                 S18---重試密碼、重新設(shè)定        S19---關(guān)閉密碼鎖
  6.                                 初始密碼:000000         密碼位數(shù):6位
  7.                                 注意:掉電后,所設(shè)密碼會(huì)丟失,重新上點(diǎn)時(shí),密碼恢復(fù)為原始的000000
  8.                                 與P1相連的8位發(fā)光LED點(diǎn)亮代表鎖被打開(kāi);熄滅代表鎖被鎖上

  9. 程序功能:
  10.                   1、開(kāi)鎖:
  11.                   下載程序后,直接按六次S6(即代表數(shù)字0),8位LED亮,鎖被打開(kāi),輸入密碼時(shí),
  12.                   六位數(shù)碼管依次顯示小橫杠。
  13.                   2、更改密碼:
  14.                   只有當(dāng)開(kāi)鎖(LED亮)后,該功能方可使用。
  15.                   首先按下更改密碼鍵S16,然后設(shè)置相應(yīng)密碼,此時(shí)六位數(shù)碼管會(huì)顯示設(shè)置密碼對(duì)應(yīng)
  16.                   的數(shù)字。最后設(shè)置完六位后,按下S17確認(rèn)密碼更改,此后新密碼即生效。
  17.                   3、重試密碼:
  18.                   當(dāng)輸入密碼時(shí),密碼輸錯(cuò)后按下鍵S18,可重新輸入六位密碼。
  19.                   當(dāng)設(shè)置密碼時(shí),設(shè)置中途想更改密碼,也可按下此鍵重新設(shè)置。
  20.                   4、關(guān)閉密碼鎖:
  21.                   按下S19即可將打開(kāi)的密碼鎖關(guān)閉。
  22. 推薦初級(jí)演示步驟:輸入原始密碼000000按6次S6密碼正確后LED全部亮表示鎖已打開(kāi)---按下更
  23. 改密碼按鍵S16---按S6到S15設(shè)置密碼---按S17
  24.                         確認(rèn)密碼更改---按S19關(guān)閉密碼鎖---輸入新的密碼打開(kāi)密碼鎖
  25. *******************************************************************************/
  26. #include<reg52.h>
  27. #include <intrins.h>
  28. #define uint unsigned int
  29. #define uchar unsigned char

  30. uchar old1,old2,old3,old4,old5,old6; //原始密碼000000
  31. uchar new1,new2,new3,new4,new5,new6;  //每次MCU采集到的密碼輸入
  32. uchar a=16,b=16,c=16,d=16,e=16,f=16; //送入數(shù)碼管顯示的變量
  33. uchar wei,key,temp;

  34. bit allow,genggai,ok,wanbi,retry,close;         //各個(gè)狀態(tài)位

  35. sbit dula=P2^6;
  36. sbit wela=P2^7;
  37. sbit beep=P2^3;
  38. sbit sda=P2^0;                          //IO口定義
  39. sbit scl=P2^1;

  40. unsigned char code table[]=
  41. {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
  42. 0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40};

  43. /*****************IIC芯片24C02存儲(chǔ)器驅(qū)動(dòng)程序************************************/

  44. void nop()
  45. {
  46.         _nop_();
  47.         _nop_();
  48. }
  49. /////////24C02讀寫驅(qū)動(dòng)程序////////////////////
  50. void delay1(unsigned int m)
  51. {        unsigned int n;
  52.           for(n=0;n<m;n++);
  53. }

  54. void init()  //24c02初始化子程序
  55. {
  56.         scl=1;
  57.         nop();
  58.         sda=1;
  59.         nop();
  60. }

  61. void start()        //啟動(dòng)I2C總線
  62. {
  63.         sda=1;
  64.         nop();
  65.         scl=1;
  66.         nop();
  67.         sda=0;
  68.         nop();
  69.         scl=0;
  70.         nop();
  71. }

  72. void stop()         //停止I2C總線
  73. {
  74.         sda=0;
  75.         nop();
  76.         scl=1;
  77.         nop();
  78.         sda=1;
  79.         nop();
  80. }

  81. void writebyte(unsigned char j)  //寫一個(gè)字節(jié)
  82. {
  83.         unsigned char i,temp;
  84.            temp=j;
  85.            for (i=0;i<8;i++)
  86.    {
  87.            temp=temp<<1;
  88.            scl=0;
  89.            nop();
  90.            sda=CY;                //temp左移時(shí),移出的值放入了CY中
  91.            nop();
  92.            scl=1;                //待sda線上的數(shù)據(jù)穩(wěn)定后,將scl拉高
  93.            nop();
  94.    }
  95.    scl=0;
  96.    nop();
  97.    sda=1;
  98.    nop();
  99. }

  100. unsigned char readbyte()   //讀一個(gè)字節(jié)
  101. {
  102.    unsigned char i,j,k=0;
  103.    scl=0; nop(); sda=1;
  104.    for (i=0;i<8;i++)
  105.    {  
  106.                 nop(); scl=1; nop();
  107.               if(sda==1)
  108.                 j=1;
  109.               else
  110.                 j=0;
  111.               k=(k<<1)|j;
  112.                   scl=0;
  113.         }
  114.            nop();
  115.         return(k);
  116. }

  117. void clock()         //I2C總線時(shí)鐘
  118. {
  119.    unsigned char i=0;
  120.    scl=1;
  121.    nop();
  122.    while((sda==1)&&(i<255))
  123.              i++;
  124.    scl=0;
  125.    nop();
  126. }

  127. ////////從24c02的地址address中讀取一個(gè)字節(jié)數(shù)據(jù)/////
  128. unsigned char read24c02(unsigned char address)
  129. {
  130.    unsigned char i;
  131.    start();
  132.    writebyte(0xa0);
  133.    clock();
  134.    writebyte(address);
  135.    clock();
  136.    start();
  137.    writebyte(0xa1);
  138.    clock();
  139.    i=readbyte();
  140.    stop();
  141.    delay1(100);
  142.    return(i);
  143. }

  144. //////向24c02的address地址中寫入一字節(jié)數(shù)據(jù)info/////
  145. void write24c02(unsigned char address,unsigned char info)
  146. {
  147.    start();
  148.    writebyte(0xa0);
  149.    clock();
  150.    writebyte(address);
  151.    clock();
  152.    writebyte(info);
  153.    clock();
  154.    stop();
  155.    delay1(5000); //這個(gè)延時(shí)一定要足夠長(zhǎng),否則會(huì)出錯(cuò)。因?yàn)?4c02在從sda上取得數(shù)據(jù)后,還需要一定時(shí)間的燒錄過(guò)程。
  156. }
  157. /****************************密碼鎖程序模塊********************************************************/

  158. void delay(unsigned char i)
  159. {
  160.         uchar j,k;
  161.   for(j=i;j>0;j--)
  162.     for(k=125;k>0;k--);
  163. }

  164. void display(uchar a,uchar b,uchar c,uchar d,uchar e,uchar f)
  165. {
  166.    dula=0;
  167.    P0=table[a];
  168.    dula=1;
  169.    dula=0;
  170.    
  171.    wela=0;
  172.    P0=0xfe;
  173.    wela=1;
  174.    wela=0;
  175.    delay(5);
  176.    
  177.    P0=table[b];
  178.    dula=1;
  179.    dula=0;
  180.    
  181.    P0=0xfd;
  182.    wela=1;
  183.    wela=0;
  184.    delay(5);

  185.    P0=table[c];
  186.    dula=1;
  187.    dula=0;
  188.    
  189.    P0=0xfb;
  190.    wela=1;
  191.    wela=0;
  192.    delay(5);
  193.    
  194.    P0=table[d];
  195.    dula=1;
  196.    dula=0;
  197.    
  198.    P0=0xf7;
  199.    wela=1;
  200.    wela=0;
  201.    delay(5);
  202.    
  203.    P0=table[e];
  204.    dula=1;
  205.    dula=0;
  206.    
  207.    P0=0xef;
  208.    wela=1;
  209.    wela=0;
  210.    delay(5);
  211.    
  212.    P0=table[f];
  213.    dula=1;
  214.    dula=0;
  215.    
  216.    P0=0xdf;
  217.    wela=1;
  218.    wela=0;
  219.    delay(5);
  220. }


  221. void keyscan()
  222. {
  223.   {        
  224.     P3=0xfe;
  225.     temp=P3;
  226.     temp=temp&0xf0;
  227.     if(temp!=0xf0)
  228.     {
  229.       delay(10);
  230.       if(temp!=0xf0)
  231.       {        
  232.         temp=P3;
  233.         switch(temp)
  234.         {
  235.           case 0xee:
  236.                key=0;
  237.                            wei++;
  238.                break;

  239.           case 0xde:
  240.                key=1;
  241.                            wei++;
  242.                break;

  243.           case 0xbe:
  244.                key=2;
  245.                            wei++;
  246.                break;

  247.           case 0x7e:
  248.                key=3;
  249.                            wei++;
  250.                break;
  251.          }
  252.          while(temp!=0xf0)
  253.         {
  254.            temp=P3;
  255.            temp=temp&0xf0;
  256.            beep=0;
  257.          }
  258.          beep=1;
  259.       }
  260.     }
  261.     P3=0xfd;
  262.     temp=P3;
  263.     temp=temp&0xf0;
  264.     if(temp!=0xf0)
  265.     {
  266.       delay(10);
  267.       if(temp!=0xf0)
  268.       {
  269.         temp=P3;
  270.         switch(temp)
  271.         {
  272.           case 0xed:
  273.                key=4;
  274.                            wei++;
  275.                break;

  276.           case 0xdd:
  277.                key=5;
  278.                            wei++;
  279.                break;

  280.           case 0xbd:
  281.                key=6;
  282.                            wei++;
  283.                break;

  284.           case 0x7d:
  285.                key=7;
  286.                            wei++;
  287.                break;
  288.          }
  289.          while(temp!=0xf0)
  290.          {
  291.            temp=P3;
  292.            temp=temp&0xf0;
  293.            beep=0;
  294.          }
  295.          beep=1;
  296.       }
  297.       }
  298.     P3=0xfb;
  299.     temp=P3;
  300.     temp=temp&0xf0;
  301.     if(temp!=0xf0)
  302.     {
  303.       delay(10);
  304.       if(temp!=0xf0)
  305.       {
  306.         temp=P3;
  307.         switch(temp)
  308.         {
  309.           case 0xeb:
  310.                key=8;
  311.                            wei++;
  312.                break;

  313.           case 0xdb:
  314.                key=9;
  315.                            wei++;
  316.                break;
  317.                            
  318.           case 0xbb:
  319.                genggai=1;
  320.                            wei=0;
  321.                break;

  322.           case 0x7b:
  323.                              if(allow)
  324.                ok=1;
  325.                break;
  326.          }
  327.         while(temp!=0xf0)
  328.          {
  329.            temp=P3;
  330.            temp=temp&0xf0;
  331.            beep=0;
  332.          }
  333.          beep=1;
  334.       }
  335.       }
  336.           P3=0xf7;
  337.     temp=P3;
  338.     temp=temp&0xf0;
  339.     if(temp!=0xf0)
  340.     {
  341.       delay(10);
  342.       if(temp!=0xf0)
  343.       {
  344.         temp=P3;
  345.         switch(temp)
  346.         {
  347.           case 0xe7:
  348.                              retry=1;
  349.                break;

  350.           case 0xd7:
  351.                              close=1;
  352.                break;
  353.          }
  354.         while(temp!=0xf0)
  355.          {
  356.            temp=P3;
  357.            temp=temp&0xf0;
  358.            beep=0;
  359.          }
  360.          beep=1;
  361.       }
  362.       }
  363. }
  364. }

  365. void shumima()                //對(duì)按鍵采集來(lái)的數(shù)據(jù)進(jìn)行分配
  366. {
  367.         if(!wanbi)
  368.         {
  369.         switch(wei)
  370.         {
  371.                 case 1:new1=key;
  372.                             if(!allow)        a=17;
  373.                            else a=key;        break;
  374.                 case 2:new2=key;
  375.                                 if(a==17) b=17;
  376.                                 else b=key;        break;
  377.                 case 3:new3=key;
  378.                                 if(a==17) c=17;
  379.                                 else c=key;        break;
  380.                 case 4:new4=key;
  381.                                 if(a==17) d=17;
  382.                                 else d=key;        break;
  383.                 case 5:new5=key;
  384.                                 if(a==17) e=17;
  385.                                 else e=key;        break;
  386.                 case 6:new6=key;
  387.                                 if(a==17) f=17;
  388.                                 else f=key;
  389.                                 wanbi=1;        break;
  390.         }
  391.         }
  392. }

  393. void yanzheng()          //驗(yàn)證密碼是否正確
  394. {
  395.         if(wanbi)         //只有當(dāng)六位密碼均輸入完畢后方進(jìn)行驗(yàn)證
  396.         {
  397.         if((new1==old1)&(new2==old2)&(new3==old3)&(new4==old4)&(new5==old5)&(new6==old6))
  398.                 allow=1;        //當(dāng)輸入的密碼正確,會(huì)得到allowe置一
  399.         }
  400. }

  401. void main()
  402. {
  403.         
  404.         init();        //初始化24C02
  405. /*********下面的一小段程序的功能為格式化密碼存儲(chǔ)區(qū)。************
  406. ******當(dāng)24c02中這些存儲(chǔ)區(qū)由于其他程序的運(yùn)行而導(dǎo)致***************
  407. *******所存數(shù)據(jù)發(fā)生了變化,或者密碼遺忘時(shí),        ********************
  408. ******可以刪掉其前面的注釋線,然后重新編譯下載。****************
  409. ******而將密碼還原為000000后,請(qǐng)將下面的程序用******************
  410. ******注釋屏蔽掉,重新編譯、下載,方可正常使用****************/
  411. //        write24c02(110,0x00);
  412. //        write24c02(111,0x00);//24c02的第110到115地址單元作為密碼存儲(chǔ)區(qū)
  413. //        write24c02(112,0x00);
  414. //        write24c02(113,0x00);
  415. //        write24c02(114,0x00);
  416. //        write24c02(115,0x00);
  417. /*******************************************************************/


  418.         old1=read24c02(110);  
  419.         old2=read24c02(111);
  420.         old3=read24c02(112);
  421.         old4=read24c02(113);
  422.         old5=read24c02(114);
  423.         old6=read24c02(115);

  424.         while(1)
  425.         {
  426.                 keyscan();
  427.                 shumima();
  428.                 yanzheng();
  429. ……………………

  430. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
密碼鎖(掉電可記憶密碼).rar (36.07 KB, 下載次數(shù): 25)


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

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美一级片 | 久久av一区二区三区 | 欧美日韩国产不卡 | 久久久性色精品国产免费观看 | 国产一区二区在线视频 | 秋霞性生活 | 黑人巨大精品欧美一区二区免费 | 91精品国产99 | 艹逼网| 欧美一区二区视频 | 国产高清在线观看 | 久久久精品一区二区 | 国产精品一二三区 | 国产日韩免费观看 | 成人性视频在线播放 | 精品久久久久久久久久 | 欧美a在线| 国产一区2区 | 国内自拍偷拍视频 | 欧美13videosex性极品 | 欧美国产一区二区 | 91久久国产综合久久91精品网站 | 一级毛片免费视频观看 | 国产小u女发育末成年 | 久久久久久久国产 | 日韩午夜激情 | 一区在线免费视频 | 亚洲午夜电影 | 人人精品 | 国产一区二 | 九九热精品视频在线观看 | 不卡一区二区三区四区 | 日韩一区二区三区在线视频 | 免费黄色片在线观看 | 精品国产不卡一区二区三区 | 久久丁香| 久久精品91久久久久久再现 | 97成人在线 | 波多野吉衣在线播放 | 欧美日韩久久精品 | 另类亚洲视频 |