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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3052|回復: 0
打印 上一主題 下一主題
收起左側

STC單片機電子密碼鎖原理圖PCB與源程序分享

[復制鏈接]
跳轉到指定樓層
樓主
基于STC單片機電子密碼鎖制作出來的實物圖如下:


單片機源程序如下:
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define        uchar unsigned char
  4. sbit l1=P1^0;        //LED指示
  5. sbit bump=P2^2;        //蜂鳴器控制
  6. sbit relay=P2^3;//繼電器輸出
  7. sbit lcden=P2^7;//LCD1602液晶控制端
  8. sbit lcdrs=P2^6;
  9. sbit sda=P2^0;        //AT24C02數據端口
  10. sbit scl=P2^1;        //時鐘端口
  11. /**********顯示內容**************************/
  12. uchar code xianshi0[]="input  password:";
  13. uchar code xianshi1[]="please come in!";
  14. uchar code xianshi2[]="*";
  15. uchar code xianshi3[]=" you are thief!";
  16. uchar code xianshi4[]=" new  password:";
  17. uchar code xianshi5[]=" alter succeed!";
  18. uchar code xianshi6[]="  first error!";
  19. uchar code xianshi7[]="  second error!";
  20. uchar code xianshi8[]="  third error!";
  21. uchar code xianshi9[]="  alter fail!!";
  22. uchar table[8];                         //給按鍵輸入留取存儲空間
  23. uchar table1[8];                 //給密碼修改留取存儲空間
  24. uchar mima[8];                         //給從存儲中讀取密碼留取存儲空間
  25. uchar num,num1,num2,num3,etimes,fanhui,kai;
  26. bit alterflog,cpflog,suoflog;//定義各種標志位 修改密碼鍵按下標志   密碼比較正確標志  上鎖標志
  27. void keyscan();                                                  //聲明鍵盤掃描函數
  28. void init();
  29. void keydeal15();
  30. void keydeal16();                                                  //聲明初始化函數
  31. /********************延時一毫秒函數**************/        
  32. void delay_xs(uint x)
  33. {          uint i,j;
  34.         for(i=x;i>0;i--)         for(j=110;j>0;j--);}
  35. void writecom(uchar com)        //寫命令
  36. {
  37.         lcdrs=0;         P0=com;                 delay_xs(5);
  38.         lcden=1;          delay_xs(5);                 lcden=0;
  39. }
  40. /*********************液晶寫命令數據函數******************/
  41. void writedate(uchar date)        //寫命令
  42. {
  43.         lcdrs=1;         P0=date;        delay_xs(5);
  44.         lcden=1;         delay_xs(5);        lcden=0;
  45. }
  46. /***************24c02讀取寫入數據初始化****************/
  47. void delay()  //微妙級延時函數
  48. { ;; }
  49. void start()  //開始信號
  50. {        
  51.         sda=1;         delay(); scl=1;        delay(); sda=0;        delay();
  52. }

  53. void stop()   //停止
  54. {
  55.         sda=0;delay();scl=1;delay();sda=1;delay();
  56. }
  57. void respons()  //應答
  58. {
  59.         uchar i;
  60.         scl=1;        delay();
  61.         while((sda==1)&&(i<250)) i++;
  62.         scl=0;         delay();
  63. }
  64. void write_byte(uchar date)                //寫一位數據
  65. {
  66.         uchar i,temp;
  67.         temp=date;


  68.         for(i=0;i<8;i++)
  69.         {
  70.                 temp=temp<<1;
  71.                 scl=0; delay();        sda=CY;        delay();
  72.                 scl=1; delay();
  73.         }
  74.         scl=0;         delay();
  75.         sda=1;         delay();
  76. }

  77. uchar read_byte()                           //讀一位數據
  78. {
  79.         uchar i,k;
  80.         scl=0;         delay();
  81.         sda=1;        delay();
  82.         for(i=0;i<8;i++)
  83.         {
  84.                 scl=1;        delay();        
  85.                 k=(k<<1)|sda;
  86.                 scl=0;        delay();        
  87.         }
  88.         return k;
  89. }
  90. void write24c02(uchar address,uchar date) //寫一字節函數
  91. {
  92.         start();
  93.         write_byte(0xa0);
  94.         respons();
  95.         write_byte(address);
  96.         respons();
  97.         write_byte(date);
  98.         respons();
  99.         stop();
  100. }

  101. uchar read24c02(uchar address)                //讀一字節函數
  102. {
  103.         uchar date;
  104.         start();
  105.         write_byte(0xa0);
  106.         respons();
  107.         write_byte(address);
  108.         respons();
  109.         start();
  110.         write_byte(0xa1);
  111.         respons();
  112.         date=read_byte();
  113.         stop();
  114.         return date;
  115. }
  116. /************各按鍵對應處理函數***************/
  117. /*************各按鍵功能********************
  118. 1-2-3-4-5-6-7-8-9-0-確認-重新輸入-未定義-上鎖-密碼修改
  119. -密碼修改確認-未定義*************************/
  120. void keydeal1()                                 //按鍵1
  121. {
  122.         table[num]=1;
  123.         num++;
  124.         if(alterflog==1){table1[num1]=1;num1++;        }
  125. }
  126. void keydeal2()                                //按鍵2
  127. {
  128.         table[num]=2;
  129.         num++;
  130.         if(alterflog==1){table1[num1]=2;num1++;        }
  131. }
  132. void keydeal3()                               //按鍵3
  133. {
  134.         table[num]=3;
  135.         num++;
  136.         if(alterflog==1){table1[num1]=3;num1++;        }
  137. }
  138. void keydeal4()                               //按鍵4
  139. {
  140.         table[num]=4;
  141.         num++;
  142.         if(alterflog==1){table1[num1]=4;num1++;        }
  143. }
  144. void keydeal5()                               //按鍵5
  145. {
  146.         table[num]=5;
  147.         num++;
  148.         if(alterflog==1) {table1[num1]=5;num1++;}
  149. }
  150. void keydeal6()                                        //按鍵6
  151. {
  152.         table[num]=6;
  153.         num++;
  154.         if(alterflog==1){table1[num1]=6;num1++;        }
  155. }
  156. void keydeal7()                                        //按鍵7
  157. {
  158.         table[num]=7;
  159.         num++;
  160.         if(alterflog==1){table1[num1]=7;num1++;        }
  161. }
  162. void keydeal8()                                          //按鍵8
  163. {
  164.         table[num]=8;
  165.         num++;
  166.         if(alterflog==1){table1[num1]=8;num1++;        }
  167. }
  168. void keydeal9()                                           //按鍵9
  169. {
  170.         table[num]=9;
  171.         num++;
  172.         if(alterflog==1){table1[num1]=9; num1++;        }
  173. }
  174. void keydeal10()                                   //按鍵10
  175. {
  176.         table[num]=0;          num++;
  177.         if(alterflog==1){table1[num1]=0;num1++;        }
  178. }
  179. void compare()                         //比較密碼正確與否函數
  180. {
  181.         uchar j;
  182.                 for(j=0;j<8;j++)
  183.                 {
  184.                         if(table[j]==mima[j]){cpflog=1;l1=0;}
  185.                         else        cpflog=0;
  186.                         l1=1;
  187.                 }         
  188. }
  189. void keydeal11()                                  //確認鍵
  190. {
  191.         uchar j;
  192.         if(alterflog==1)
  193.         goto n;                                        //如果密碼修改鍵按下再按此鍵無效
  194.         if(num==8)                                 //判斷是否輸入八個數字
  195.         {
  196.                 num=0;                                 //將輸入數字個數清零
  197.                 compare();                         //進行密碼比較
  198.                 for(j=0;j<8;j++)                 //用FFFFFFFF將輸入的數據清空
  199.                 {
  200.                         table[j]=0x0f;
  201.                 }
  202.         }
  203.         if(cpflog==1)                                 //如果密碼正確,標志位為1
  204.         {
  205.                 l1=0;                                         //點亮開鎖燈
  206.                 cpflog=0;                                 //使比較密碼標志位歸零
  207.                 etimes=0;                                 //使記錯次數歸零
  208.                 kai=1;                                         //使打開鎖標志位置1
  209.                 writecom(0x01);                         //液晶屏清空顯示
  210.                 writecom(0x80);                         //讓液晶顯示“please come in!”
  211.                 for(j=0;j<15;j++)
  212.                 {
  213.                         writedate(xianshi1[j]);                delay_xs(3);
  214.                 }
  215.                 for(j=0;j<2;j++)                  //蜂鳴器響兩聲提示開鎖成功
  216.                 {
  217.                         bump=0;        delay_xs(200);
  218.                         bump=1;        delay_xs(200);
  219.                         bump=0;        delay_xs(200);
  220.                         bump=1;        delay_xs(200);
  221.                 }
  222.          /*********等待按下上鎖鍵或者密碼修改鍵**********/
  223.                 while((suoflog!=1)&(alterflog!=1))
  224.                 {
  225.                         P3=0xf7;
  226.                         if(P3==0xe7)  suoflog=1;  //上鎖鍵按下上鎖標志位置1                                
  227.                         if(P3==0xd7) alterflog=1;  //密碼修改鍵按下標志位置1               
  228.                         if(suoflog==1)          //上鎖后進行初始化
  229.                         {
  230.                                 init();
  231.                         }
  232.                 n:        if(alterflog==1) //密碼修改鍵按下顯示new passsword
  233.                         {
  234.                                 writecom(0x01);                writecom(0x38);
  235.                                 for(j=0;j<15;j++){writedate(xianshi4[j]); }
  236.                         }
  237.                 }
  238.                 suoflog=0;           //上鎖標志位清零
  239.         }
  240.         else                        //否則密碼錯誤,執行密碼錯誤指令
  241.         {
  242.                 num=0;                //將輸入數據個數清零
  243.                 num1=0;                //將修改密碼輸入數字個數清零
  244.                 etimes++;        //記錄錯誤次數加1
  245.                 bump=0;                              //報警一聲
  246.                 delay_xs(500);        bump=1;
  247.                 for(j=0;j<8;j++)                  //清空修改密碼輸入數據
  248.                 { table1[j]=0x0f;                }
  249.                 if(etimes==1)                          //如果輸錯一次
  250.                 {
  251.                         writecom(0x01);                   //清屏
  252.                         writecom(0x80);
  253.                         for(j=0;j<14;j++)           //顯示first error
  254.                         { writedate(xianshi6[j]);        }
  255.                         delay_xs(2000);                   //延時兩秒
  256.                         writecom(0xc);
  257.                         writecom(0x80);
  258.                         for(j=0;j<16;j++)           //第一行顯示input passsword
  259.                         {
  260.                                 writedate(xianshi0[j]);                delay_xs(5);
  261.                         }                                          
  262.                         writecom(0x80+0x40+4);         //第二行顯示--------
  263.                         for(j=0;j<8;j++) {writedate('-');                         }
  264.                 }
  265.                 if(etimes==2)                           //如果輸錯兩次
  266.                 {
  267.                         writecom(0x01);        writecom(0x80);
  268.                         for(j=0;j<15;j++)           //顯示second error
  269.                         {
  270.                                 writedate(xianshi7[j]);
  271.                         }
  272.                         delay_xs(2000);                   //延時兩秒
  273.                         writecom(0xc);
  274.                         writecom(0x80);
  275.                         for(j=0;j<16;j++)                //第一行顯示input passsword
  276.                         {
  277.                                 writedate(xianshi0[j]);        delay_xs(5);
  278.                         }
  279.                         writecom(0x80+0x40+4);
  280.                         for(j=0;j<8;j++)                //第二行顯示--------
  281.                         {
  282.                                 writedate('-');
  283.                         }
  284.                 }
  285.                 if(etimes==3)                                //如果輸錯三次
  286.                 {
  287.                         writecom(0x01);
  288.                         writecom(0x80);
  289.                         for(j=0;j<15;j++)                //顯示you are thief!
  290.                         {
  291.                                 writedate(xianshi3[j]);
  292.                         }
  293.                         for(j=0;j<10;j++)                //報警十秒鐘
  294.                         {
  295.                                 bump=0;                delay_xs(500);
  296.                                 bump=1;                delay_xs(500);
  297.                         }
  298.                         init();                                        //初始化
  299.                 }
  300.         }
  301. }
  302. void keydeal12()                                        //重新輸入鍵
  303. {
  304.         uint i;
  305.         if(kai==0)                                        //如果所沒被打開
  306.         {                                                        //初始化回到輸入密碼狀態
  307.                 init();
  308.         }
  309.         else                                //如果鎖被打開,則顯示new password:
  310.         {
  311.                 if(alterflog==1)
  312.                 {
  313.                         num=0;         num1=0;
  314.                         writecom(0x01);                writecom(0x80);//清屏
  315.                         for(i=0;i<15;i++){writedate(xianshi4[i]);        }
  316.                 }
  317.         }
  318. }
  319. void keydeal15()                   //確認密碼修改鍵
  320. {
  321.         uchar i;
  322.         alterflog=0;                        //修改標志位歸零
  323.         num=0;                                        //數據輸入個數清零
  324.         for(i=0;i<8;i++)                //輸入數據清空
  325.         {
  326.                 table[i]=0x0f;        
  327.         }
  328.         if(num1==8)                                //如果輸入修改數字夠八個進入
  329.         {
  330.                 num1=0;                                //將輸入修改數字個數清零
  331.                 for(i=0;i<8;i++)        //將修改后八個數字寫入存儲器中
  332.                 {
  333.                         write24c02(i+1,table1[i]);         delay_xs(5);
  334.                 }
  335.                 writecom(0x01);                  //清屏
  336.                 writecom(0x80);
  337.                 for(i=0;i<15;i++)           //顯示alter succeed!!
  338.                 {
  339.                         writedate(xianshi5[i]);
  340.                 }
  341.                 delay_xs(2000);
  342.         }
  343.         else                                          //如果輸入數字不夠八個進入
  344.         {
  345.                 num1=0;                                  //將輸入修改數字個數清零
  346.                 writecom(0x01);                 //清屏
  347.                 writecom(0x80);
  348.                 for(i=0;i<14;i++)          //顯示alter error!
  349.                 {
  350.                         writedate(xianshi9[i]);
  351.                 }
  352.         }
  353.         /**************修改后將鍵入返回程序************/
  354.         if(kai==1)                         //如果鎖被打開
  355.         {
  356.                 num=0;                         //輸入數字個數清零
  357.                 delay_xs(2000);           //延時兩秒鐘
  358.                 writecom(0x01);                //清屏
  359.                 writecom(0x80);
  360.                 for(i=0;i<15;i++)                //顯示please come in!
  361.                 {
  362.                         writedate(xianshi1[i]);
  363.                         delay_xs(3);
  364.                 }                                                //繼續等待上鎖或修改密碼
  365.                 while((suoflog!=1)&(alterflog!=1))
  366.                 {
  367.                         P3=0xf7;
  368.                         if(P3==0xe7)        suoflog=1;
  369.                         if(P3==0xd7)        alterflog=1;
  370.                         if(suoflog==1)        {         init();                }
  371.                         if(alterflog==1)
  372.                         {
  373.                                 writecom(0x01);        writecom(0x80);//清屏
  374.                                 for(i=0;i<15;i++){ writedate(xianshi4[i]);        }
  375.                         }
  376.                  }
  377.         }
  378.         else                 //如果所沒被打開,顯示alter error兩秒后
  379.         {                                 //進行初始化
  380.                 delay_xs(2000);         init();
  381.         }
  382. }
  383. void keydeal16()           //鍵16未定義
  384. {
  385.         
  386. }
  387. /******************鍵盤掃描函數**************************/
  388. void keyscan()
  389. {
  390.         uchar temp;
  391. /**************第一行掃描********************/
  392.         P3=0xfe;
  393.         temp=P3&0xf0;
  394.         if(temp!=0xf0)
  395.         {
  396.                 delay_xs(10);
  397.                 if(temp!=0xf0)        temp=P3;
  398.                 switch(temp)
  399.                 {
  400.                         case 0xee:        keydeal1();        break;
  401.                         case 0xde:        keydeal2();        break;
  402.                         case 0xbe:        keydeal3();        break;
  403.                         case 0x7e:         keydeal4();        break;

  404.                 }
  405.                 while((P3&0xf0)!=0xf0);        //松手檢測

  406.         }
  407. /******************第二行掃描**********************/
  408.         P3=0xfd;
  409.         temp=P3&0xf0;
  410.         if(temp!=0xf0)
  411.         {
  412.                 delay_xs(10);
  413.                 if(temp!=0xf0)         temp=P3;
  414.                 switch(temp)
  415.                 {
  416.                         case 0xed:        keydeal5();                break;
  417.                         case 0xdd:         keydeal6();                break;
  418.                         case 0xbd:        keydeal7();                break;
  419.                         case 0x7d:        keydeal8();                break;

  420.                 }
  421.                 while((P3&0xf0)!=0xf0);           //松手檢測

  422.         }
  423. /*****************第三行掃描*********************/
  424.         P3=0xfb;
  425.         temp=P3&0xf0;
  426.         if(temp!=0xf0)
  427.         {
  428.                 delay_xs(10);
  429.                 if(temp!=0xf0)        temp=P3;
  430.                 switch(temp)
  431.                 {
  432.                         case 0xeb:         keydeal9();                break;
  433.                         case 0xdb:        keydeal10();        break;
  434.                         case 0xbb:        keydeal11();        break;
  435.                         case 0x7b:        keydeal12();         break;

  436.                 }
  437.                 while((P3&0xf0)!=0xf0);

  438.         }
  439. /********************第四行掃描********************/
  440.         P3=0xf7;
  441.         temp=P3&0xf0;
  442.         if(temp!=0xf0)
  443.         {
  444.                 delay_xs(10);
  445.                 if(temp!=0xf0)        temp=P3;
  446.                 switch(temp)
  447.                 {
  448.                         case 0xe7:                 //        keydeal13();
  449.                                         break;
  450.                         case 0xd7:                //        keydeal14();
  451.                                         break;
  452.                         case 0xb7:         keydeal15(); break;
  453.                         case 0x77:        keydeal16(); break;
  454.                 }
  455.                 while((P3&0xf0)!=0xf0);

  456.         }
  457. }
  458. /****************顯示函數*************/
  459. void display()
  460. {
  461.         uint c;
  462.         writecom(0x80+0x40+4);
  463.         if(alterflog==0)        //如果不處于修改密碼狀態,顯示num個*
  464.         {
  465.                 for(c=0;c<num;c++){        writedate('*');        delay_xs(5);        }
  466.         }
  467.         else                  //如果處于密碼修改顯示num1個*
  468.         {
  469.                 for(c=0;c<num1;c++){ writedate('*'); delay_xs(5);}
  470.         }

  471. }
  472. /*******************初始化函數***********/
  473. void init()
  474. {
  475.         uint i,a,b;
  476.         num=0;                  //輸入數據個數清零
  477.         num1=0;
  478.         kai=0;                   //開鎖標志位清零
  479.         l1=1;                   //關閉開鎖燈
  480.         alterflog=0;   //修改密碼標志位清零
  481.         sda=1;                   //24c02進行釋放總線
  482.         delay();        scl=1;         delay();
  483.         writecom(0x38);           //液晶初始化
  484.         writecom(0x0c);
  485.         writecom(0x06);
  486.         writecom(0x01);
  487.         for(i=0;i<8;i++)        //讀取存儲器中密碼,并存放于mima[]中
  488.         {
  489.                 mima[i]=read24c02(i+1);
  490.         }
  491.         writecom(0x01);                //清屏
  492.         writecom(0x80);
  493.         for(a=0;a<16;a++)                //顯示input password:
  494.         {
  495.                 writedate(xianshi0[a]);                delay_xs(5);
  496.         }
  497.         writecom(0x80+0x40+4);        //第二行顯示--------
  498.         for(b=0;b<8;b++){        writedate('-');        }
  499. }
  500. /*****************主函數******************/
  501. void main()
  502. {
  503.         init();          //初始化
  504.         while(1)        //不停地對鍵盤和顯示進行掃描
  505.         {
  506.                 keyscan(); //鍵盤掃描和密碼輸入處理
  507.                 display(); //LCD顯示
  508.         }
  509. }
復制代碼

所有資料51hei提供下載:
基于STC單片機電子密碼鎖.7z (2.78 MB, 下載次數: 69)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产高清视频在线 | www.成人久久 | 国产天天操 | 91精品国产一区二区三区 | 国产欧美性成人精品午夜 | 久久一二| 日韩视频在线免费观看 | 免费网站在线 | 久国产视频 | 欧美a级成人淫片免费看 | 91视频免费观看 | 欧美成人一级 | 欧美日韩国产一区二区三区 | 亚洲一区二区视频 | 午夜久久久 | 国产999在线观看 | 国内精品久久久久 | 国产精品久久久 | 4hu最新网址 | 久久综合伊人一区二区三 | 久久久国产精品 | 国产一区二区在线免费观看 | 国产日韩欧美一区 | 成人精品国产 | 久久精品久久久 | 午夜免费福利电影 | 色久五月 | 日韩av一区二区在线观看 | 亚洲自拍一区在线观看 | 久久精彩 | 精品国产乱码久久久久久88av | 成年人在线视频 | 99热在线免费 | 日韩中文不卡 | 日韩精品一区二区三区中文字幕 | 婷婷色国产偷v国产偷v小说 | 国产精品一二三区 | 91国内在线观看 | 黄a在线观看| 久久精品国产久精国产 | 精品免费视频一区二区 |