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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機電子密碼鎖

[復制鏈接]
跳轉到指定樓層
樓主
電路原理圖:


單片機源程序如下:
  1. #include<reg52.h>
  2. #include<intrinS.h>
  3. #include<absacc.h>
  4. #include "keyc1.h" //見3.12
  5. #include "LCD1602.h"
  6. #include "24C02.h"   //見2.2
  7.    //見4.1
  8. #define unchar unsigned char
  9. #define uint unsigned int

  10. #define C02_write 0xa0
  11. #define C02_read 0xa1

  12. //----------------------------------------------------------------------------------------------
  13. #define enter 0x0c    //確定
  14. #define backspace 0x0f   //退格
  15. #define A 0x0a           //輸入密碼
  16. #define B 0x0b           //修改密碼
  17. //-----------------------------------------------------------------------------------------------
  18. unchar idata temp5_password[6]=
  19. {0,0,0,0,0,0};           //設置初始密碼為"123456"
  20. unchar num;//錯誤次數
  21. uint  M1,M2=0,M3,M4,M5,M6;
  22. //-----------------------------------------------------------------------------------------------
  23. sbit SET=P3^2;               //恢復出廠密碼設置鍵
  24. sbit Lock_BIT=P2^0;          //鎖控制信號,輸出低電平
  25. sbit SPK=P2^2;             //報警信號輸出端
  26. //-----------------------------------------------------------------------------------------------
  27. unchar int_count_1;
  28. unsigned int int_count_2;
  29. void SPKdelay(uint z)  //蜂鳴器延時
  30. {         uint i;
  31.    for(i=z;i>0;i--);
  32. }

  33. //===============================================================================================
  34. void Longdelay(unsigned int i)  //長時間延時函數
  35. {
  36.         unsigned int j;
  37.         for (;i>0;i--)
  38.         for(j=10000;j>0;j--);

  39. }

  40. //================================================================================================
  41. bit compare_string(unchar *string1,unchar *string2)//密碼對比函數
  42. {
  43.         unchar count;//設置循環對比計數器
  44.         for(count=0;count<6;count++)//設置要對比的密碼為六位
  45.         {
  46.                 if(string1[count]!=string2[count])
  47.                 return(0);//輸入密碼與原密碼不相同時返回出錯函數0

  48.         }
  49.         return(1);//輸入密碼正確返回正確參數1
  50. }
  51. //---------------------------------------------------------------------------------------------------
  52. unchar step_choose(void)//選擇輸入密碼或修改密碼處理函數
  53. {
  54.         unsigned int i;
  55.         unchar key;
  56.         do{
  57.                   WR_CMD(0x01);//清屏
  58.                 WR_CMD(0x06);//AC遞增,畫面不動
  59.                 GotoXY(0,0);//設置顯示“input password”的地址
  60.                 Show_Char("Input Password");//顯示"輸入密碼"
  61.                 GotoXY(0,1);//設置顯示plaese press A的首地址
  62.                 Show_Char("Please Press A");//顯示請輸入A
  63.                 for(i=0;i<30000;i++)//循環讀鍵盤
  64.                         {
  65.                                 key=key1();//讀鍵盤
  66.                                 if((key==A)||(key==B)) break;//如果是A或B就退出
  67.                         }
  68.                 if((key!=A)&&(key!=B))//如果不是A也不是B,就執行下列程序
  69.                   {
  70.                           WR_CMD(0x01);//清屏
  71.                         WR_CMD(0x06);//        AC遞增,畫面不動
  72.                         GotoXY(0,0);//設置顯示“input password”的地址
  73.                         Show_Char("Change Password");//顯示修改密碼
  74.                         GotoXY(0,1);//設置顯示“please press B”的首地址
  75.                         Show_Char("Please Press B");//顯示請輸入B
  76.                         for(i=0;i<30000;i++)//循環讀鍵盤
  77.                         {         
  78.                                 key=key1();//讀鍵盤
  79.                                 if((key==A)||(key==B)) break;//如果是A或B就退出
  80.                         }
  81.                   }
  82.           }
  83.           while((key!=A)&&(key!=B));//如果不是A也不是B,就循環讀鍵盤
  84.           return (key);//是A或B就帶參數返回
  85. }
  86. //=================================================================================================
  87. bit input_password(unchar *password)//輸入密碼函數
  88. {
  89.      unchar count,count1;//設置輸入密碼位數計數器
  90.         unchar key;//設置鍵值變量
  91.         GotoXY(0,1);
  92.         for(count=0;count<7;count++)
  93.         {
  94.                 Longdelay(3);//延時
  95.                 if(count<6);//輸入密碼小于六位嗎?
  96.                 {        
  97.                         do{key=key1();}//是的,讀鍵盤
  98.                         while(key==0xff);//如果鍵盤值為0xff,繼續讀鍵盤
  99.                     if(key==0x0d) break;   //退出鍵,回到初始界面
  100.                         if((key!=backspace)&&(key!=enter)&&(key>=0)&&(key<=9))//不是退格或確認鍵嗎?
  101.                         {         
  102.                                 Show_1_Char('*');//不是,是數字鍵就顯示'*'號
  103.                                 password[count]=key;//鍵值送入輸入密碼數組對應位
  104.                         }
  105.                 if(key==backspace)//是退格鍵嗎?
  106.                         {
  107.                                 if(count>0)//輸入位數大于0嗎?
  108.                                 {
  109.                                         GotoXY(--count,1);//是的,送刪除位的顯示地址
  110.                                         Show_1_Char(' '); //刪除位顯示空白
  111.                                         password[count]=' '; //輸入密碼數組對應位置空白
  112.                                         GotoXY(count,1); //送閃爍位
  113.                                         count--;//密碼位計數器減1

  114.                                 }

  115.                         }
  116.                  if(key==enter)//是確認鍵嗎
  117.                         {
  118.                                 GotoXY(0,0);//是的,改變顯示首地址
  119.                                 return(0);//返回出錯參數0                        

  120.                         }
  121.                 }
  122.                 if(count==6)//密碼位計數器等于6嗎
  123.                 {
  124.                         do{key=key1();}//等于6,讀鍵盤
  125.                         while((key!=backspace)&&(key!=enter));//不是退格鍵或確認鍵,繼續讀鍵盤
  126.                         if(key==backspace)//是退格鍵嗎
  127.                         {
  128.                                 GotoXY(--count,1);//是的,送刪除位的顯示地址
  129.                                 Show_1_Char(' ');//刪除位顯示空白
  130.                                 GotoXY(count,1);//送閃爍位
  131.                                 count--;//密碼位計數器減1
  132.                         }
  133.                            if(key==enter)//是確認鍵嗎
  134.                         {return(1);}//是的,輸入密碼完成,返回正確參數1
  135.                 }
  136.         }
  137. }
  138. //===================================================================================================
  139. void password()//密碼處理函數
  140. {
  141.     uchar key,key2;
  142.         uint kscount=0;
  143.         unchar idata temp1_password[6]={' ',' ',' ',' ',' ',' '};//設置4組6位密碼變量
  144.         unchar idata temp3_password[6]={' ',' ',' ',' ',' ',' '};        //初始化為空白
  145.         unchar idata temp2_password[6]={' ',' ',' ',' ',' ',' '};
  146.         unchar idata temp4_password[6]={' ',' ',' ',' ',' ',' '};
  147.         key=step_choose( );//讀選擇狀態
  148.         if(key==A)//是選擇輸入密碼嗎?
  149.         {
  150.         Read_Flash(temp1_password,0x00,6);//是的從24c02中讀取密碼送入第一組密碼變量中
  151.                 WR_CMD(0x01);//清屏
  152.                 WR_CMD(0x06);//AC遞增,畫面不動
  153.                 GotoXY(0,0);//設置顯示“input password”的首地址
  154.                 Show_Char("Input Password");//顯示“輸入密碼”
  155.                 if(input_password(temp2_password))//完成輸入密碼了嗎?
  156.                 {
  157.                         if(compare_string(temp1_password,temp2_password))//完成,比較密碼正確嗎
  158.                         {        num=0;
  159.                                 WR_CMD(0x01);//清屏
  160.                         WR_CMD(0x06);//AC遞增,畫面不動
  161.                                 GotoXY(0,0);//正確,設置顯示“password correct”的首地址
  162.                                 Show_Char("Password Correct");//顯示"密碼正確"
  163.                                 GotoXY(0,1);//正確,設置顯示“password correct”的首地址
  164.                                 Show_Char("Open Lock");//顯示"密碼正確"        Lock_BIT=0;//密碼正確,開鎖
  165.                            Lock_BIT=0;//關開鎖信號
  166.                            while(1)
  167.                            {
  168.                              kscount++;
  169.                                  if(kscount==1000)
  170.                                   break;
  171.                                 SPK=0;
  172.                                 SPKdelay(10);//發開鎖提示聲
  173.                                 SPK=1;
  174.                            SPKdelay(40);
  175.                                 }        

  176.                     while(1)
  177.                         {  key2=key1();
  178.                             if(key2==0x0e)
  179.                           {
  180.                                 Lock_BIT=1;//關開鎖信號
  181.                                 break;
  182.                                 }
  183.                           }
  184.                                 SPK=0;
  185.                                 //關開鎖提示音
  186.                                 TR0=0;//關定時器0
  187.                                 return;//返回
  188.                         }
  189.                         else
  190.                                 {
  191.                                 WR_CMD(0x01);//清屏
  192.                         WR_CMD(0x06);//AC遞增,畫面不動
  193.                                 GotoXY(0,0);//錯誤,設置顯示“wrong password”的首地址
  194.                                 Show_Char("Wrong Password");//顯示“密碼錯誤”
  195.                                   Longdelay(25);
  196.                                 num++;
  197.                                   if(num==3)
  198.                                   {
  199.                                     WR_CMD(0x01);//清屏
  200.                         WR_CMD(0x06);//AC遞增,畫面不動
  201.                                 GotoXY(0,0);
  202.                                            Show_Char("Please Wait For");
  203.                                            GotoXY(0,1);
  204.                                         Show_Char(" 3 Minute");
  205.                                         while(1)
  206.                                         {
  207.                                            SPK=0;
  208.                                            SPKdelay(100);
  209.                                            SPK=1;
  210.                                            SPKdelay(100);
  211.                                            M1++;
  212.                                            if(M1==24000)
  213.                                             {
  214.                                                  break;
  215.                                                 }
  216.                                         }
  217.                                         Longdelay(1400);
  218.                                      }
  219.                                 Longdelay(10);//延時
  220.                                 return;//返回
  221.                                 }
  222.                 }
  223.                 else
  224.                         {
  225.                                 GotoXY(0,1);//沒有完成密碼輸入,設置顯示“error!”的首地址
  226.                                 Show_Char("Error!");//顯示“出錯”
  227.                                 Longdelay(15);//延時
  228.                         }                                                                                 
  229.         }
  230.         else//是,修改密碼
  231.          {
  232.                  Read_Flash(temp1_password,0x00,6);//從24c02中讀取密碼送入第一組密碼變量中
  233.                 WR_CMD(0x01);//清屏
  234.                 WR_CMD(0x06);//AC遞增,畫面不動
  235.                 GotoXY(0,0);//設置顯示“input old password”的首地址
  236.                 Show_Char("Input Old Password");//顯示輸入舊密碼
  237.                 if(input_password(temp2_password))//完成輸入密碼了嗎(輸入的舊密碼放在數組2中)
  238.                  {
  239.                          if(compare_string(temp1_password,temp2_password))//完成,比較密碼正確嗎?
  240.                          {
  241.                                  GotoXY(0,1);//正確,設置顯示“password correct!”的首地址
  242.                                 Show_Char("Password Correct!");//顯示“密碼正確”
  243.                                 Longdelay(6);//延時
  244.                                 WR_CMD(0x01);
  245.                                 WR_CMD(0x06);
  246.                                 GotoXY(0,0);
  247.                                 Show_Char("Input New Password!");
  248.                                 if(input_password(temp3_password))//完成第一次新密碼輸入嗎?(輸入密碼放在數組三中)
  249.                                 {
  250.                                         WR_CMD(0x01);
  251.                                         WR_CMD(0x06);
  252.                                         GotoXY(0,0);
  253.                                         Show_Char("Input Again");//顯示再次輸入密碼
  254.                                         if(input_password(temp4_password))//完成第二次新密碼輸入嗎?(輸入的密碼放在密碼組4中)
  255.                                         {
  256.                                                 if(compare_string(temp3_password,temp4_password))//比較兩次輸入密碼屬否相同
  257.                                                 {
  258.                                                         Write_Flash(temp3_password,0x00,6);//相同,將新密碼存入24c02中
  259.                                                         WR_CMD(0x01);//清屏
  260.                                                         WR_CMD(0x06);//AC遞增,畫面不動
  261.                                                         GotoXY(0,0);
  262.                                                         Show_Char("Password has");
  263.                                                         GotoXY(0,1);
  264.                                                         Show_Char("been changed");
  265.                                                         Longdelay(10);
  266.                                                         return;
  267.                                                 }
  268.                                                 else
  269.                                                 {
  270.                                                         WR_CMD(0x01);//兩次輸入不同清屏
  271.                                                         WR_CMD(0x06);//AC遞增,畫面不動
  272.                                                         GotoXY(0,0);
  273.                                                         Show_Char("Twice input");  //顯示”兩次輸入“
  274.                                                         GotoXY(0,1);
  275.                                                         Show_Char("is different");        //顯示是“不同的”
  276.                                                         Longdelay(10);
  277.                                                         return;        
  278.                                                 }
  279.                                         }
  280.                                         else
  281.                                         {
  282.                                                 GotoXY(0,1);//沒有正確完成第二次新密碼的輸入,設置顯示“error”的首地址
  283.                                                 Show_Char("Error!");//顯示錯誤
  284.                                                 Longdelay(15);
  285.                                                 return;
  286.                                         }
  287.                                 }
  288.                                 else
  289.                                 {
  290.                                         GotoXY(0,1);//沒有正確完成第一次新密碼輸入,設置顯示“error”的首地址
  291.                                         Show_Char("Error!");
  292.                                         Longdelay(15);
  293.                                         return;
  294.                                 }
  295.                          }
  296.                          else
  297.                             {
  298.                                     WR_CMD(0x01);//兩次輸入不同清屏
  299.                                         WR_CMD(0x06);//AC遞增,畫面不動
  300.                                      GotoXY(3,0);//舊密碼輸入錯誤,設置顯示“wrong password”的首地址
  301.                                     Show_Char("Sorry");
  302.                                     GotoXY(0,1);        
  303.                                     Show_Char("Wrong password");

  304.                                   num++;
  305.                                   if(num==3)
  306.                                   {
  307.                                     WR_CMD(0x01);//清屏
  308.                             WR_CMD(0x06);//AC遞增,畫面不動
  309.                                      GotoXY(0,0);
  310.                                            Show_Char("Please Wait For");
  311.                                            GotoXY(0,1);
  312.                                         Show_Char(" 3 Minute");
  313.                                         while(1)
  314.                                         {
  315.                                            SPK=0;
  316.                                            SPKdelay(100);
  317.                                            SPK=1;
  318.                                            SPKdelay(100);
  319.                                            M1++;
  320.                                            if(M1==24000)
  321.                                             {
  322.                                                  break;
  323.                                                 }
  324.                                         }
  325.                                          Longdelay(1400);
  326.                                         }
  327.                                         Longdelay(25);
  328.                                         return;
  329.                             }
  330.                  }
  331.                     else
  332.                         {
  333.                                     GotoXY(0,1);//沒有正確完成舊密碼的輸入,設置顯示“error!”的首地址
  334.                                         Show_Char("Error!");
  335.                                         Longdelay(15);
  336.                                         return;
  337.                         }
  338.          }
  339. }
  340. //============================================================================================================
  341. void int_service(void) interrupt 0 //外部中斷0處理函數
  342. {
  343.         EA=1;//關CPU中斷
  344.         EX0=1;//關外部中斷0
  345.         for(int_count_1=4;int_count_1>0;int_count_1--)//設置延時時間,10秒
  346.          {
  347.                  for(int_count_2=0xffff;int_count_2>0;int_count_2--)
  348.                 {
  349.                         if(SET==1)//恢復出廠密碼設置鍵松開否?
  350.                          {
  351.                         return;
  352.                          }
  353.                 }
  354.          }                  
  355.          WR_CMD(0x01);
  356.          WR_CMD(0x06);
  357.          Show_Char("Reset Cuccess!");//顯示“恢復出廠密碼”
  358.          Longdelay(50);
  359.          Write_Flash(temp5_password,0x00,6); //初始密碼0000000密碼送入24c02中保存

  360. /*          EA=1;//關CPU中斷
  361.             EX0=1;         */
  362. }
  363. //==========================================================================================

  364. void t0(void) interrupt 1 using 0//定時、計數器0中斷處理函數
  365. {
  366.         TH0=(65536-1000)/256;//重新將定時1000微秒初值的高八位送入TH0
  367.         TL0=(65536-1000)%256;//         重新將定時1000微秒初值的低八位送入TL0
  368.         SPK=~SPK;//信號輸出位取反,即1000微秒反轉一次,產生周期為2ms的方波

  369. }
  370. //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  371. main()
  372.   {        unchar key;
  373.     Initialize(); //1602初始化
  374.         IT0=1;//設INT0為跳變沿沿觸發方式
  375.         EX0=1;//開外部中斷0
  376.         TMOD=0x01;
  377.         TH0=(65536-1000)/256;//重新將定時1000微秒初值的高八位送入TH0
  378.         TL0=(65536-1000)%256;//         重新將定時1000微秒初值的低八位送入TL0
  379.         TR0=0;
  380.         ET0=1;
  381.         EA=1;
  382.          while(1)
  383.         {         
  384.                    password();//運行密碼處理函數
  385.     }
  386. }
  387. //=================================終于完成了==================================================

復制代碼



電子密碼鎖原理圖.doc

107.5 KB, 下載次數: 9, 下載積分: 黑幣 -5

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:497494 發表于 2019-11-25 13:25 | 只看該作者
請問樓主可以分享一下hex文件嗎?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜一区二区三区在线观看 | 真人一级毛片 | 国产精品久久久久国产a级 欧美日韩国产免费 | 久久免费精品视频 | 色婷婷综合网站 | 91精品国产一区 | 四虎成人在线播放 | 男女污污动态图 | 中文字幕一二三区 | 免费高清成人 | 欧美福利在线 | 国产精品一区在线观看你懂的 | 久草中文在线 | 浴室洗澡偷拍一区二区 | 欧美精品福利 | 亚洲精彩视频在线观看 | 亚洲精品欧洲 | 在线只有精品 | 久久成人精品视频 | 91.com在线观看 | 国产黄色大片在线免费观看 | 97人澡人人添人人爽欧美 | 伦理午夜电影免费观看 | 久久久久亚洲精品 | 91麻豆精品国产91久久久更新资源速度超快 | 精品欧美乱码久久久久久1区2区 | 亚洲精品久久久久中文字幕欢迎你 | 超碰97人人人人人蜜桃 | 中文字幕 国产 | 黄网站涩免费蜜桃网站 | 国产一级免费在线观看 | 欧美日韩视频在线 | 国产精品激情 | 91成人免费| 欧美精品成人 | 日韩一区二区三区av | 欧美激情精品久久久久久 | 成人精品在线观看 | 国产a级毛毛片 | 久久亚洲国产 | 久久99久久 |