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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機密碼鎖制作 含PPT教程 原理圖 源碼 實物圖

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:140725 發(fā)表于 2016-10-21 17:53 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式


所有資料下載:
單片機密碼鎖.zip (4.71 MB, 下載次數(shù): 150)



1. 電子密碼鎖采用51單片機作為主控芯片,4x4矩陣鍵盤作為輸入設(shè)備,通過LCD1602顯示,使用24C02芯片用于存儲用戶密碼。
2.系統(tǒng)密碼長度設(shè)置為7位,具有輸入密碼,更改密碼,恢復(fù)初始密碼功能,密碼具有掉電存儲功能。密碼輸入錯誤達到三次,則鎖住鍵盤,并報警。
3.電子密碼鎖使用繼電器進行模擬開鎖過程。開鎖聲光提示。

密碼鎖的ppt教程:



原理圖:


密碼鎖單片機程序源碼:
  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};           //設(shè)置初始密碼為"123456"
  20. unchar num;//錯誤次數(shù)
  21. uint  M1,M2=0,M3,M4,M5,M6;
  22. //-----------------------------------------------------------------------------------------------
  23. sbit SET=P3^2;               //恢復(fù)出廠密碼設(shè)置鍵
  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)  //長時間延時函數(shù)
  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)//密碼對比函數(shù)
  42. {
  43.         unchar count;//設(shè)置循環(huán)對比計數(shù)器
  44.         for(count=0;count<6;count++)//設(shè)置要對比的密碼為六位
  45.         {
  46.                 if(string1[count]!=string2[count])
  47.                 return(0);//輸入密碼與原密碼不相同時返回出錯函數(shù)0

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

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

  121.                         }
  122.                 }
  123.                 if(count==6)//密碼位計數(shù)器等于6嗎
  124.                 {
  125.                         do{key=key1();}//等于6,讀鍵盤
  126.                         while((key!=backspace)&&(key!=enter));//不是退格鍵或確認(rèn)鍵,繼續(xù)讀鍵盤
  127.                         if(key==backspace)//是退格鍵嗎
  128.                         {
  129.                                 GotoXY(--count,1);//是的,送刪除位的顯示地址
  130.                                 Show_1_Char(' ');//刪除位顯示空白
  131.                                 GotoXY(count,1);//送閃爍位
  132.                                 count--;//密碼位計數(shù)器減1
  133.                         }
  134.                            if(key==enter)//是確認(rèn)鍵嗎
  135.                         {return(1);}//是的,輸入密碼完成,返回正確參數(shù)1
  136.                 }
  137.         }
  138. }
  139. //===================================================================================================
  140. void password()//密碼處理函數(shù)
  141. {
  142.     uchar key,key2;
  143.         uint kscount=0;
  144.         unchar idata temp1_password[6]={' ',' ',' ',' ',' ',' '};//設(shè)置4組6位密碼變量
  145.         unchar idata temp3_password[6]={' ',' ',' ',' ',' ',' '};        //初始化為空白
  146.         unchar idata temp2_password[6]={' ',' ',' ',' ',' ',' '};
  147.         unchar idata temp4_password[6]={' ',' ',' ',' ',' ',' '};
  148.         key=step_choose( );//讀選擇狀態(tài)
  149.         if(key==A)//是選擇輸入密碼嗎?
  150.         {
  151.         Read_Flash(temp1_password,0x00,6);//是的從24c02中讀取密碼送入第一組密碼變量中
  152.                 WR_CMD(0x01);//清屏
  153.                 WR_CMD(0x06);//AC遞增,畫面不動
  154.                 GotoXY(0,0);//設(shè)置顯示“input password”的首地址
  155.                 Show_Char("Input Password");//顯示“輸入密碼”
  156.                 if(input_password(temp2_password))//完成輸入密碼了嗎?
  157.                 {
  158.                         if(compare_string(temp1_password,temp2_password))//完成,比較密碼正確嗎
  159.                         {        num=0;
  160.                                 WR_CMD(0x01);//清屏
  161.                         WR_CMD(0x06);//AC遞增,畫面不動
  162.                                 GotoXY(0,0);//正確,設(shè)置顯示“password correct”的首地址
  163.                                 Show_Char("Password Correct");//顯示"密碼正確"
  164.                                 GotoXY(0,1);//正確,設(shè)置顯示“password correct”的首地址
  165.                                 Show_Char("Open Lock");//顯示"密碼正確"        Lock_BIT=0;//密碼正確,開鎖
  166.                            Lock_BIT=0;//關(guān)開鎖信號
  167.                            while(1)
  168.                            {
  169.                              kscount++;
  170.                                  if(kscount==1000)
  171.                                   break;
  172.                                 SPK=0;
  173.                                 SPKdelay(10);//發(fā)開鎖提示聲
  174.                                 SPK=1;
  175.                            SPKdelay(40);
  176.                                 }       
  177.                          
  178.                     while(1)
  179.                         {  key2=key1();
  180.                             if(key2==0x0e)
  181.                           {
  182.                                 Lock_BIT=1;//關(guān)開鎖信號
  183.                                 break;
  184.                                 }
  185.                           }
  186.                                 SPK=0;
  187.                                 //關(guān)開鎖提示音
  188.                                 TR0=0;//關(guān)定時器0
  189.                                 return;//返回
  190.                         }
  191.                         else
  192.                                 {
  193.                                 WR_CMD(0x01);//清屏
  194.                         WR_CMD(0x06);//AC遞增,畫面不動
  195.                                 GotoXY(0,0);//錯誤,設(shè)置顯示“wrong password”的首地址
  196.                                 Show_Char("Wrong Password");//顯示“密碼錯誤”
  197.                                   Longdelay(25);
  198.                                 num++;
  199.                                   if(num==3)
  200.                                   {
  201.                                     WR_CMD(0x01);//清屏
  202.                         WR_CMD(0x06);//AC遞增,畫面不動
  203.                                 GotoXY(0,0);
  204.                                            Show_Char("Please Wait For");
  205.                                            GotoXY(0,1);
  206.                                         Show_Char(" 3 Minute");
  207.                                         while(1)
  208.                                         {
  209.                                            SPK=0;
  210.                                            SPKdelay(100);
  211.                                            SPK=1;
  212.                                            SPKdelay(100);
  213.                                            M1++;
  214.                                            if(M1==24000)
  215.                                             {
  216.                                                  break;
  217.                                                 }
  218.                                         }
  219.                                         Longdelay(1400);
  220.                                      }
  221.                                 Longdelay(10);//延時
  222.                                 return;//返回
  223.                                 }
  224.                 }
  225.                 else
  226.                         {
  227.                                 GotoXY(0,1);//沒有完成密碼輸入,設(shè)置顯示“error!”的首地址
  228.                                 Show_Char("Error!");//顯示“出錯”
  229.                                 Longdelay(15);//延時
  230.                         }                                                                                 
  231.         }
  232.         else//是,修改密碼
  233.          {
  234.                  Read_Flash(temp1_password,0x00,6);//從24c02中讀取密碼送入第一組密碼變量中
  235.                 WR_CMD(0x01);//清屏
  236.                 WR_CMD(0x06);//AC遞增,畫面不動
  237.                 GotoXY(0,0);//設(shè)置顯示“input old password”的首地址
  238.                 Show_Char("Input Old Password");//顯示輸入舊密碼
  239.                 if(input_password(temp2_password))//完成輸入密碼了嗎(輸入的舊密碼放在數(shù)組2中)
  240.                  {
  241.                          if(compare_string(temp1_password,temp2_password))//完成,比較密碼正確嗎?
  242.                          {
  243.                                  GotoXY(0,1);//正確,設(shè)置顯示“password correct!”的首地址
  244.                                 Show_Char("Password Correct!");//顯示“密碼正確”
  245.                                 Longdelay(6);//延時
  246.                                 WR_CMD(0x01);
  247.                                 WR_CMD(0x06);
  248.                                 GotoXY(0,0);
  249.                                 Show_Char("Input New Password!");
  250.                                 if(input_password(temp3_password))//完成第一次新密碼輸入嗎?(輸入密碼放在數(shù)組三中)
  251.                                 {
  252.                                         WR_CMD(0x01);
  253.                                         WR_CMD(0x06);
  254.                                         GotoXY(0,0);
  255.                                         Show_Char("Input Again");//顯示再次輸入密碼
  256.                                         if(input_password(temp4_password))//完成第二次新密碼輸入嗎?(輸入的密碼放在密碼組4中)
  257.                                         {
  258.                                                 if(compare_string(temp3_password,temp4_password))//比較兩次輸入密碼屬否相同
  259.                                                 {
  260.                                                         Write_Flash(temp3_password,0x00,6);//相同,將新密碼存入24c02中
  261.                                                         WR_CMD(0x01);//清屏
  262.                                                         WR_CMD(0x06);//AC遞增,畫面不動
  263.                                                         GotoXY(0,0);
  264.                                                         Show_Char("Password has");
  265.                                                         GotoXY(0,1);
  266.                                                         Show_Char("been changed");
  267.                                                         Longdelay(10);
  268.                                                         return;
  269.                                                 }
  270.                                                 else
  271.                                                 {
  272.                                                         WR_CMD(0x01);//兩次輸入不同清屏
  273.                                                         WR_CMD(0x06);//AC遞增,畫面不動
  274.                                                         GotoXY(0,0);
  275.                                                         Show_Char("Twice input");  //顯示”兩次輸入“
  276.                                                         GotoXY(0,1);
  277.                                                         Show_Char("is different");        //顯示是“不同的”
  278.                                                         Longdelay(10);
  279.                                                         return;       
  280.                                                 }
  281.                                         }
  282.                                         else
  283.                                         {
  284.                                                 GotoXY(0,1);//沒有正確完成第二次新密碼的輸入,設(shè)置顯示“error”的首地址
  285.                                                 Show_Char("Error!");//顯示錯誤
  286.                                                 Longdelay(15);
  287.                                                 return;
  288.                                         }
  289.                                 }
  290.                                 else
  291.                                 {
  292.                                         GotoXY(0,1);//沒有正確完成第一次新密碼輸入,設(shè)置顯示“error”的首地址
  293.                                         Show_Char("Error!");
  294.                                         Longdelay(15);
  295.                                         return;
  296.                                 }
  297.                          }
  298.                          else
  299.                             {
  300.                                     WR_CMD(0x01);//兩次輸入不同清屏
  301.                                         WR_CMD(0x06);//AC遞增,畫面不動
  302.                                      GotoXY(3,0);//舊密碼輸入錯誤,設(shè)置顯示“wrong password”的首地址
  303.                                     Show_Char("Sorry");
  304.                                     GotoXY(0,1);       
  305.                                     Show_Char("Wrong password");

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

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

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


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

使用道具 舉報

沙發(fā)
ID:143811 發(fā)表于 2016-10-21 20:49 | 只看該作者
好牛bbbbbbb哦
回復(fù)

使用道具 舉報

板凳
ID:143367 發(fā)表于 2016-10-24 09:37 | 只看該作者
啊啊啊,每次5個黑幣,心疼。但是還是想看看,學(xué)習(xí)一下
回復(fù)

使用道具 舉報

地板
ID:152682 發(fā)表于 2016-12-23 21:33 | 只看該作者
word哥,晶振和復(fù)位呢??這圖有問題啊!!
回復(fù)

使用道具 舉報

5#
ID:158014 發(fā)表于 2016-12-28 12:53 來自手機 | 只看該作者
矩陣鍵盤的程序沒看懂
回復(fù)

使用道具 舉報

6#
ID:192635 發(fā)表于 2017-5-28 10:02 | 只看該作者
老哥哥,晶振和復(fù)位呢??這圖有問題啊!!莫非?
回復(fù)

使用道具 舉報

7#
ID:270758 發(fā)表于 2018-1-3 14:11 | 只看該作者
佩服的五體投地,多謝你了
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 天天爽天天操 | 中文字幕免费在线 | 精品网 | 日本三级在线 | 欧美精品中文字幕久久二区 | av日韩精品 | 不卡一区二区三区四区 | 亚洲a毛片| 精品二| 久久男人天堂 | 九九九视频精品 | 国产精品国产自产拍高清 | 亚洲精品视频观看 | 91精品国产乱码久久久久久久久 | 91视频久久 | 久久久久亚洲精品中文字幕 | 一区影院 | 日本视频在线 | 国产精品久久久久久久粉嫩 | 天天爽一爽 | 国产一级电影网 | 国产91丝袜在线播放 | 犬夜叉在线观看 | 国产精品一区二区av | 鲁大师一区影视 | 日韩淫片免费看 | 国产探花 | 亚洲一区av| 在线观看亚洲一区二区 | 中文av在线播放 | 色婷婷婷婷色 | 国产欧美在线播放 | 国产真实乱对白精彩久久小说 | 精品国产精品一区二区夜夜嗨 | 一级毛片成人免费看a | 亚洲成网| 蜜桃精品在线 | 久久精品一二三影院 | 国产成人精品一区二区三区 | 精品视频99 | 伊人精品国产 |