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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC89C52單片機密碼鎖 程序

[復制鏈接]
跳轉到指定樓層
樓主
完整版請看附件
  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 stop()   //停止
  50. {
  51.         sda=0;delay();scl=1;delay();sda=1;delay();
  52. }
  53. void respons()  //應答
  54. {
  55.         uchar i;
  56.         scl=1;        delay();
  57.         while((sda==1)&&(i<250)) i++;
  58.         scl=0;         delay();
  59. }
  60. uchar read_byte()                           //讀一位數據
  61. {
  62.         uchar i,k;
  63.         scl=0;         delay();
  64.         sda=1;        delay();
  65.         for(i=0;i<8;i++)
  66.         {
  67.                 scl=1;        delay();        
  68.                 k=(k<<1)|sda;
  69.                 scl=0;        delay();        
  70.         }
  71.         return k;
  72. }
  73. void write24c02(uchar address,uchar date) //寫一字節函數
  74. {
  75.         start();
  76.         write_byte(0xa0);
  77.         respons();
  78.         write_byte(address);
  79.         respons();
  80.         write_byte(date);
  81.         respons();
  82.         stop();
  83. }

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

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

  389.         }
  390. /******************第二行掃描**********************/
  391.         P3=0xfd;
  392.         temp=P3&0xf0;
  393.         if(temp!=0xf0)
  394.         {
  395.                 delay_xs(10);
  396.                 if(temp!=0xf0)         temp=P3;
  397.                 switch(temp)
  398.                 {
  399.                         case 0xed:        keydeal5();                break;
  400.                         case 0xdd:         keydeal6();                break;
  401.                         case 0xbd:        keydeal7();                break;
  402.                         case 0x7d:        keydeal8();                break;

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

  405.         }
  406. /*****************第三行掃描*********************/
  407.         P3=0xfb;
  408.         temp=P3&0xf0;
  409.         if(temp!=0xf0)
  410.         {
  411.                 delay_xs(10);
  412.                 if(temp!=0xf0)        temp=P3;
  413.                 switch(temp)
  414.                 {
  415.                         case 0xeb:         keydeal9();                break;
  416.                         case 0xdb:        keydeal10();        break;
  417.                         case 0xbb:        keydeal11();        break;
  418.                         case 0x7b:        keydeal12();         break;

  419.                 }
  420.                 while((P3&0xf0)!=0xf0);

  421.         }
  422. /********************第四行掃描********************/
  423.         P3=0xf7;
  424.         temp=P3&0xf0;
  425.         if(temp!=0xf0)
  426.         {
  427.                 delay_xs(10);
  428.                 if(temp!=0xf0)        temp=P3;
  429.                 switch(temp)
  430.                 {
  431.                         case 0xe7:                 //        keydeal13();
  432.                                         break;
  433.                         case 0xd7:                //        keydeal14();
  434.                                         break;
  435.                         case 0xb7:         keydeal15(); break;
  436.                         case 0x77:        keydeal16(); break;
  437.                 }
  438.                 while((P3&0xf0)!=0xf0);

  439.         }
  440. }
  441. /****************顯示函數*************/
  442. void display()
  443. {
  444.         uint c;
  445.         writecom(0x80+0x40+4);
  446.         if(alterflog==0)        //如果不處于修改密碼狀態,顯示num個*
  447.         {
  448.                 for(c=0;c<num;c++){        writedate('*');        delay_xs(5);        }
  449.         }
  450.         else                  //如果處于密碼修改顯示num1個*
  451.         {
  452.                 for(c=0;c<num1;c++){ writedate('*'); delay_xs(5);}
  453.         }

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


密碼鎖實物照片 (2)..jpg (199.72 KB, 下載次數: 51)

密碼鎖實物照片 (2)..jpg

密碼鎖實物照片 (2).jpg (203.68 KB, 下載次數: 48)

密碼鎖實物照片 (2).jpg

密碼鎖實物照片 (3)..jpg (152.29 KB, 下載次數: 54)

密碼鎖實物照片 (3)..jpg

實物照片課設.jpg (86.5 KB, 下載次數: 57)

實物照片課設.jpg

密碼鎖源程序.rar

40.02 KB, 下載次數: 27, 下載積分: 黑幣 -5

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产高清免费在线 | 激情五月婷婷在线 | 国产精品久久免费观看 | 在线观看av免费 | 精品久久久网站 | 精品视频导航 | 国产免费一区 | 精品视频一区在线 | 国产乱码久久久久久 | 干干天天| 欧美性久久| 91在线网站 | 国产一区二区在线观看视频 | 免费成人在线网站 | 成人福利视频网站 | 欧美一级在线观看 | 中文字幕日韩av | 国产伦精品一区二区三区精品视频 | 国内激情av片 | 日日操操| 亚洲导航深夜福利涩涩屋 | 欧美一级网站 | 欧美日韩国产在线观看 | 国产精品亚洲一区 | 欧美一级在线观看 | 免费在线一区二区 | 高清免费在线 | 日韩国产一区二区三区 | 久久久男人的天堂 | 91精品国产高清一区二区三区 | 中文字幕在线观看日韩 | 国产成人免费一区二区60岁 | 久久久久九九九九 | 精品国产久 | 欧美三级久久久 | 激情欧美一区二区三区中文字幕 | 一区二区三区视频在线 | 黄色毛片在线看 | 91精品久久 | 欧美日韩国产三级 | 国产高潮av |