wwwxxx国产_337p日本欧洲亚洲大胆张筱雨_免费在线看成人av_日本黄色不卡视频_国产精品成熟老女人_99视频一区_亚洲精品97久久中文字幕_免费精品视频在线_亚洲色图欧美视频_欧美一区二三区

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機密碼鎖,有代碼有原理圖,繼電器和蜂鳴器沒有反應

[復制鏈接]
跳轉到指定樓層
樓主


單片機源程序如下:
  1. #include<REG51.h>
  2. #include<intrins.h>


  3. #define LCM_Data P0   //將P0口定義為LCM_Data
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. //1602的控制腳
  7. sbit lcd1602_rs=P2^5;//RS引腳為寄存器(1-數據寄存器,0-命令寄存器)
  8. sbit lcd1602_rw=P2^6;//RW為讀寫操作引腳(1-讀,0-寫)
  9. sbit lcd1602_en=P2^7;//使能信號
  10. sbit Scl=P3^4;       //24c02串行時鐘
  11. sbit Sda=P3^5;       //24c02串行數據
  12. sbit ALAM=P2^1;      //報警,蜂鳴器
  13. sbit KEY=P3^6;       //開鎖
  14. bit pass=0;          //密碼正確標志
  15. bit ReInputEn=0;     //重置輸入允許標志
  16. bit s3_keydown=0;    //3秒按鍵標志位
  17. bit key_disable=0;   //鎖定鍵盤標志

  18. unsigned char countt0,second; //t0中斷次數,秒計數
  19. //void Delay5Ms(void);      //聲明延時函數
  20. unsigned char code a[]={0xFE,0xFD,0xFB,0xF7};//控盤掃描控制表
  21. //液晶顯示數據數組
  22. unsigned char code start_line[] = {"password:       "};
  23. unsigned char code name[]       = {"===Coded Lock==="}; //顯示名稱
  24. unsigned char code Correct[]    = {"     correct    "};//輸入正確
  25. unsigned char code Error[]      = {"      error     "};//輸入錯誤
  26. unsigned char code codepass[]   = {"       pass     "};
  27. unsigned char code LockOpen[]   = {"       open     "};//open
  28. unsigned char code SetNew[]     = {"SetNewWordEnable"};
  29. unsigned char code Input[]      = {"input:          "};//input
  30. unsigned char code ResetOK[]    = {"ResetPasswordOK "};
  31. unsigned char code initword[]   = {"Init password..."};
  32. unsigned char code Er_try[]     = {"error,try again!"};
  33. unsigned char code again[]      = {"input again     "};

  34. unsigned char InputData[6];//輸入密碼暫存區
  35. unsigned char CurrentPassword[6]={0,0,0,0,0,0};//讀取EEPROM密碼暫存數組
  36. unsigned char TempPassword[6];
  37. unsigned char N=0;//密碼輸入位數計數
  38. unsigned char ErrorCont;//錯誤次數計數
  39. unsigned char CorrectCont;//正確輸入計數
  40. unsigned char ReInputCont;//重新輸入計數
  41. unsigned char code initpassword[6]={0,0,0,0,0,0};//輸入管理員密碼后將密碼初始為000000
  42. unsigned char code adminpassword[6]={1,3,1,4,2,0};//輸入管理員密碼后將密碼初始為000000

  43. #include<delay.h>

  44. //=========================5ms延時==========================
  45. void Delay5Ms(void)
  46. {
  47.         unsigned int TempCyc = 5552;
  48.         while(TempCyc--);
  49. }

  50. //===========================400ms延時============================
  51. void Delay400Ms(void)
  52. {
  53.         unsigned char TempCycA = 5;
  54.         unsigned int TempCycB;
  55.         while(TempCycA--)
  56.         {
  57.                 TempCycB=7269;
  58.                 while(TempCycB--);
  59.         }
  60. }

  61. //===========================24c02===========================

  62. void mDelay(uint t)//延時
  63. {
  64.         uchar i;
  65.         while(t--)
  66.         {
  67.                 for(i=0;i<125;i++)
  68.                 {;}
  69.         }
  70. }
  71. void Nop(void)//空操作
  72. {
  73.         _nop_();       //僅作延時用一條語句大約1us
  74.         _nop_();
  75.         _nop_();
  76.         _nop_();
  77. }




  78. /*****24c02程序參照24c02時序圖
  79. /*起始條件*/

  80. void Start(void)
  81. {
  82.         Sda=1;
  83.         Scl=1;
  84.         Nop();
  85.         Sda=0;
  86.         Nop();
  87. }

  88. //停止條件
  89. void Stop(void)
  90. {
  91.         Sda=0;
  92.         Scl=1;
  93.         Nop();
  94.         Sda=1;
  95.         Nop();
  96. }

  97. //應答位
  98. void Ack(void)
  99. {
  100.         Sda=0;
  101.         Nop();
  102.         Scl=1;
  103.         Nop();
  104.         Scl=0;
  105. }

  106. //反向應答位
  107. void NoAck(void)
  108. {
  109.         Sda=1;
  110.         Nop();
  111.         Scl=1;
  112.         Nop();
  113.         Scl=0;
  114. }




  115. //發送數據子程序,Data為要求發送的數據
  116. void Send(uchar Data)
  117. {
  118.         uchar BitCounter=8;
  119.         uchar temp;
  120.         do
  121.         {
  122.                 temp=Data;//將待發送數據暫存temp
  123.                 Scl=0;
  124.                 Nop();
  125.                 if((temp&0x80)==0x80)//將讀到的數據&0x80
  126.                         Sda=1;
  127.                 else
  128.                         Sda=0;
  129.                 Scl=1;
  130.                 temp=Data<<1;//數據左移
  131.                 Data=temp;//數據左移后重新賦值Data
  132.                 BitCounter--;//該變量減到0時,數據也就傳送完成了
  133.         }
  134.         while(BitCounter);//判斷是否傳送完成
  135.         Scl=0;
  136. }

  137. //讀一字節的數據,并返回該字節值
  138. uchar Read(void)
  139. {
  140.         uchar temp=0;
  141.         uchar temp1=0;
  142.         uchar BitCounter=8;
  143.         Sda=1;
  144.         do
  145.         {
  146.                 Scl=0;
  147.                 Nop();
  148.                 Scl=1;
  149.                 Nop();
  150.                 if(Sda)              //數據位是否為1
  151.                         temp=temp|0x01;    //為1 temp的最低位為1(|0x01,就是將最低位變為1)
  152.                 else                 //如果為0
  153.                         temp=temp&0xfe;    //temp最低位為0(&0xfe(11111110)最地位就是0)
  154.                 if(BitCounter-1)     //BitCounter減1后是否為真
  155.                 {
  156.                         temp1=temp<<1;     //temp左移
  157.                         temp=temp1;
  158.                 }
  159.                 BitCounter--;        //BitCounter減到0時,數據就接收完了
  160.         }while(BitCounter);    //判斷是否接收完成
  161.         return(temp);
  162. }



  163. void WrToROM(uchar Data[],uchar Address,uchar Num)
  164. {
  165.         uchar i;
  166.         uchar *PData;
  167.         PData=Data;
  168.         for(i=0;i<Num;i++)
  169.         {
  170.                 Start();
  171.                 Send(0xa0);
  172.                 Ack();
  173.                 Send(Address+i);
  174.                 Ack();
  175.                 Send(*(PData+i));
  176.                 Ack();
  177.                 Stop();
  178.                 mDelay(20);
  179.         }
  180. }
  181. void RdFromROM(uchar Data[],uchar Address,uchar Num)
  182. {
  183.         uchar i;
  184.         uchar *PData;
  185.         PData=Data;
  186.         for(i=0;i<Num;i++)
  187.         {
  188.                 Start();
  189.                 Send(0xa0);
  190.                 Ack();
  191.                 Send(Address+i);
  192.                 Ack();
  193.                 Start();
  194.                 Send(0xa1);
  195.                 Ack();
  196.                 *(PData+i)=Read();
  197.                 Scl=0;
  198.                 NoAck();
  199.                 Stop();
  200.         }
  201. }





  202. //=============================LCD1603==============================
  203. #define yi 0x80   //LCD第一行的初始位置,因為LCD1602字符地址首位D7恒定為1
  204. #define er 0x80+0x40   //LCD第二行初始位置(因為第二行第一個字符位置地址是0x40)

  205. //-----------------延時函數,后面經常調用-------------------------------
  206. void delay(uint xms)//延時函數,有參函數
  207. {
  208.   uint x,y;
  209.         for(x=xms;x>0;x--)
  210.         for(y=110;y>0;y--);
  211. }

  212. //===============寫指令======================
  213. void write_1602com(uchar com)   //液晶寫入指令函數
  214. {
  215.         lcd1602_rs=0;   //數據/指令選擇置為指令
  216.         lcd1602_rw=0;   //讀寫選擇置為寫
  217.         P0=com;         //送入數據
  218.         delay(1);
  219.         lcd1602_en=1;  //拉高使能端,為制造有效的下降沿做準備
  220.         delay(1);
  221.         lcd1602_en=0;  //en由高變低。產生下降沿,液晶執行命令
  222. }


  223. //=============================寫數據==================================
  224. void write_1602dat(uchar dat)   //液晶寫入數據函數
  225. {
  226.         lcd1602_rs=1;  //數據/指令選擇置為數據
  227.         lcd1602_rw=0;  //讀寫選擇置為寫
  228.   P0=dat;        //送入數據
  229.         delay(1);
  230.         lcd1602_en=1;  //en置高電平,為制造下降沿做準備
  231.         delay(1);
  232.         lcd1602_en=0;  //en由高變低,產生下降沿,液晶執行命令
  233. }
  234. //===================================初始化=========================================
  235. void lcd_init(void)
  236. {
  237.         write_1602com(0x38);  //設置液晶工作模式,意思:16*2行顯示,5*7點陣,8位數據
  238.         write_1602com(0x0c);  //開顯示不顯示光標
  239.   write_1602com(0x06);  //整屏不移動,光標自動右移
  240.   write_1602com(0x01);  //清顯示
  241. }
  242. //========================================
  243. //=================================================================
  244. //===============將按鍵值編碼為數值============================
  245. unsigned char coding(unsigned char m)
  246. {
  247.         unsigned char k;
  248.         switch(m)
  249.         {
  250.                 case(0x11):k=1;break;
  251.                 case(0x21):k=2;break;
  252.                 case(0x41):k=3;break;
  253.           case(0x81):k='A';break;
  254.           case(0x12):k=4;break;
  255.           case(0x22):k=5;break;
  256.           case(0x42):k=6;break;
  257.           case(0x82):k='B';break;
  258.           case(0x14):k=7;break;
  259.           case(0x24):k=8;break;
  260.           case(0x44):k=9;break;
  261.           case(0x84):k='C';break;
  262.           case(0x18):k='*';break;
  263.           case(0x28):k=0;break;
  264.           case(0x48):k='#';break;
  265.           case(0x88):k='D';break;
  266.         }
  267.         return(k);
  268. }



  269. //====================按鍵檢測并返回按鍵值========================
  270. unsigned char keynum(void)
  271. {
  272.         unsigned char row,col,i;
  273.         P1=0xf0;  //所有行線為0,列線為輸入
  274.         if((P1&0xf0)!=0xf0)  //一旦有鍵被按下,列線上的四位便不再全為1
  275.         {
  276.                 Delay5Ms();
  277.                 Delay5Ms();
  278.                 if((P1&0xf0)!=0xf0)  //如果有鍵被按下
  279.                 {
  280.                         col=P1^0xf0;   //確定列線,任何一個數(0,1)與1異或,結果取反,與0異或,結果為其本身
  281.                   i=0;
  282.                   P1=a[i];  //精確定位
  283.                   while(i<4)  //逐行掃描
  284.                         {
  285.                                 if((P1&0xf0)!=0xf0)
  286.                                 {
  287.                                         row=~(P1&0xff);  //確定行線
  288.                             break;  //已定位后提前退出
  289.                                 }
  290.                                 else
  291.                                 {
  292.                                          i++;
  293.                              P1=a[i];
  294.                                 }
  295.                         }
  296.                 }
  297.                 else
  298.                 {
  299.                         return 0;
  300.                 }
  301.                 while((P1&0xf0)!=0xf0);
  302.     return(col|row);  //行線與列線組合后返回
  303.         }
  304.         else return 0;  //無鍵按下時返回0
  305. }


  306. //===================一聲提示音,表示有效輸入=============================
  307. void OneAlam(void)
  308. {
  309.         ALAM=0;
  310.         Delay5Ms();
  311.         ALAM=1;
  312. }
  313. //====================兩聲提示音,表示操作成功===============================
  314. void TwoAlam(void)
  315. {
  316.         ALAM=0;
  317.         Delay5Ms();
  318.         ALAM=1;
  319.         Delay5Ms();
  320.         ALAM=0;
  321.         Delay5Ms();
  322.         ALAM=1;
  323. }
  324. //====================三聲提示音,表示錯誤=============================
  325. void ThreeAlam(void)
  326. {
  327.         ALAM=0;
  328.         Delay5Ms();
  329.         ALAM=1;
  330.         Delay5Ms();
  331.         ALAM=0;
  332.         Delay5Ms();
  333.         ALAM=1;
  334.         Delay5Ms();
  335.         ALAM=0;
  336.         Delay5Ms();
  337.         ALAM=1;
  338. }
  339. //====================一直響,表示錯誤=============================

  340. void Alam_KeyUnable(void){
  341.                 ALAM=0;         //提示音一直響
  342. }


  343. //==================顯示提示輸入==============================
  344. void DisplayChar(void)
  345. {
  346.         unsigned char i;
  347.         if(pass==1)
  348.         {
  349.                 write_1602com(er);   //在二行開始顯示
  350.                 for(i=0;i<16;i++)
  351.                 {
  352.                         write_1602dat(LockOpen[i]);   //顯示open,開鎖成功
  353.                 }
  354.         }
  355.         else
  356.         {
  357.                 if(N==0)   //輸入密碼位數
  358.                 {
  359.                         write_1602com(er);
  360.                   for(i=0;i<16;i++)
  361.                         {
  362.                                 write_1602dat(Error[i]);  //顯示錯誤
  363.                         }
  364.                 }
  365.                 else
  366.                 {
  367.                         write_1602com(er);
  368.                         for(i=0;i<16;i++)
  369.                         {
  370.                                 write_1602dat(start_line[i]);   //顯示開始輸入
  371.                         }
  372.                 }
  373.         }
  374. }
  375.                         



  376. //========================確認鍵,并通過相應標志位執行相應功能
  377. void Ensure(void)
  378. {
  379.         unsigned char i,j;
  380.         RdFromROM(CurrentPassword,0,6);  //從24c02里讀出存儲密碼
  381.         if(N==6)
  382.         {
  383.             if(ReInputEn==0)   //重置密碼功能未開啟
  384.                         {
  385.                                 if((CurrentPassword[0]==InputData[0])&&(CurrentPassword[1]==InputData[1])&&(CurrentPassword[2]==InputData[2])&&(CurrentPassword[3]==InputData[3])&&(CurrentPassword[4]==InputData[4]))
  386.                                 {
  387.                                         ErrorCont=0;   //只要密碼正確了就將錯誤次數清零
  388.                                         CorrectCont++;   //輸入正確變量++
  389.                                         if(CorrectCont==1)
  390.                                         {
  391.                                           write_1602com(er);
  392.                                           for(j=0;j<16;j++)
  393.                                           {
  394.                                                   write_1602dat(LockOpen[j]);  //顯示open開鎖畫面
  395.                                           }
  396.                                           TwoAlam();   //操作成功提示音
  397.                                           KEY=0;   //開鎖
  398.                                           pass=1;   //密碼正確標志位置1
  399.                                           for(j=0;j<6;j++)  //將輸入清除
  400.                                           {
  401.                                                   InputData[i]=0;   //開鎖后將輸入位清零
  402.                                           }
  403.                                   }
  404.                                         else  //當兩次輸入正確時,開啟重置密碼功能
  405.                                         {
  406.                                                 write_1602com(er);
  407.                                                 for(j=0;j<16;j++)
  408.                                                 {
  409.                                                         write_1602dat(SetNew[j]);  //顯示重置密碼界面
  410.                                                 }
  411.                                                 TwoAlam();   //操作成功提示
  412.                                                 ReInputEn=1;   //允許重置密碼輸入
  413.                                                 CorrectCont=0;  //正確計數器清零
  414.                                         }
  415.                                 }
  416.                                         else if((InputData[0]==adminpassword[0])&&(InputData[1]==adminpassword[1])&&(InputData[2]==adminpassword[2])&&(InputData[3]==adminpassword[3])&&(InputData[4]==adminpassword[4]))
  417.                                         {
  418.                                                 WrToROM(initpassword,0,6);   //強制將初始密碼寫入24c02存儲
  419.                                                 write_1602com(er);
  420.                                                 for(j=0;j<16;j++)
  421.                                                 {
  422.                                                         write_1602dat(initword[j]);  //顯示初始化密碼
  423.                                                 }
  424.                                                 TwoAlam();  //成功提示音
  425.                                                 Delay400Ms();  //延時400ms
  426.                                                 N=0;
  427.                                         }
  428.                                         else   //密碼錯誤時
  429.                                         {
  430.                                                 CorrectCont=0;   //正確計數器清零,密碼一旦錯誤,對密碼正確次數重新清零
  431.                                                 ErrorCont++;   //錯誤次數++
  432.                                                 write_1602com(er);
  433.                                                 for(j=0;j<16;j++)
  434.                                                 {
  435.                                                         write_1602dat(Error[j]);   //顯示錯誤信息
  436.                                                 }
  437.                                                 pass=0;
  438.                                                 TR0=1;   //開啟定時
  439.                                                 key_disable=1;   //鎖定鍵盤
  440.                                                 KEY=1;   //關閉鎖
  441.                                                 if(ErrorCont==3)   //錯誤輸入連續達3次時,報警并鎖定鍵盤
  442.                                                 {
  443.                                                         write_1602com(er);
  444.                                                         for(i=0;i<16;i++)
  445.                                                         {
  446.                                                                 write_1602dat(Error[i]);
  447.                                                         }
  448.                                                 do
  449.                                                         Alam_KeyUnable();
  450.                                                 while(1);   //死循環,超過三次密碼錯誤則一直報警并鎖定鍵盤,直到重新運行或按下復位鍵
  451.                                           }
  452.                                 }
  453.                         }
  454.         else   //當已經開啟重置密碼功能時,而按下確認鍵
  455.         {
  456.                 write_1602com(er);
  457.                 for(j=0;j<16;j++)
  458.                 {
  459.                         write_1602dat(Er_try[j]);   //錯誤,請重新輸入
  460.                 }
  461.                 ThreeAlam();   //錯誤提示音
  462.         }
  463. }
  464. else    //密碼沒有輸入到6位時,按下確認鍵
  465. {
  466.         write_1602com(er);
  467.         for(j=0;j<16;j++)
  468.         {
  469.                 write_1602dat(Error[j]);   //顯示錯誤
  470.         }
  471.         ThreeAlam();    //錯誤提示音
  472.         pass=0;
  473. }
  474. N=0;   //將輸入數據計數器清零,為下一次輸入做準備
  475. }
  476. void ResetPassword(void)
  477. {
  478.         unsigned char i;
  479.         unsigned char j;
  480.         if(pass==0)   //沒開鎖時
  481.         {
  482.                 pass=0;
  483.                 DisplayChar();   //顯示開始輸入password
  484.                 ThreeAlam();    //沒開鎖時按下重置密碼報警3聲
  485.         }
  486.         else   //開鎖狀態下才能進行密碼重置
  487.         {
  488.                 if(ReInputEn==1)    //開鎖狀態下,ReInputEn置1,重置密碼允許
  489.                 {
  490.                         if(N==6)   //輸入6位密碼
  491.                         {
  492.                                 ReInputCont++;    //重置密碼次數計數
  493.                                 if(ReInputCont==1)   //輸入一次密碼時
  494.                                 {
  495.                                         OneAlam();
  496.                                         for(i=0;i<6;i++)
  497.                                         {
  498.                                                 TempPassword[i]=InputData[i];    //將第一次輸入的數據暫存起來
  499.                                         }
  500.                                         write_1602com(er);
  501.                                         for(j=0;j<16;j++)
  502.                                         {
  503.                                                 write_1602dat(again[j]);    //顯示再輸入一次
  504.                                         }
  505.                                 }
  506.                                 if(ReInputCont==2)    //輸入兩次密碼時
  507.                                 {
  508.                                         if((TempPassword[0]==InputData[0])&&(TempPassword[1]==InputData[1])&&(TempPassword[2]==InputData[2])&&(TempPassword[3]==InputData[3])&&(TempPassword[4]==InputData[4]))
  509.                                         {
  510.                                                 write_1602com(er);
  511.                                                 for(j=0;j<16;j++)
  512.                                                 {
  513.                                                         write_1602dat(ResetOK[j]);   //密碼修改成功,顯示
  514.                                                 }
  515.                                                 TwoAlam();     //操作成功顯示
  516.                                                 WrToROM(TempPassword,0,6);   //將新密碼寫入24c02存儲
  517.                                                 ReInputEn=0;   //關閉重置功能
  518.                                         }
  519.                                         else     //如果兩次的密碼不同
  520.                                         {
  521.                                                 write_1602com(er);
  522.                                                 for(j=0;j<16;j++)
  523.                                                 {
  524.                                                         write_1602dat(Error[j]);   //顯示錯誤Error
  525.                                                 }
  526.                                                 ThreeAlam();   //錯誤提示
  527.                                                 pass=0;    //關鎖
  528.                                                 ReInputEn=0;   //關閉重置功能
  529.                                                 ReInputCont=0;   //重置密碼次數清零
  530.                                                 KEY=1;     //關閉鎖
  531.                                                 DisplayChar();
  532.                                         }
  533.                                         ReInputCont=0;
  534.                                         CorrectCont=0;
  535.                                 }
  536.                                 N=0;   //輸入數據位數計數器清零
  537.                         }
  538.                         else     //密碼沒有輸入到6位時,按下重置鍵時
  539.                         {
  540.                                 write_1602com(er);
  541.                                 for(j=0;j<16;j++)
  542.                                 {
  543.                                         write_1602dat(Error[j]);  //顯示錯誤
  544.                                 }
  545.                                 ThreeAlam();   //錯誤提示音
  546.                                 N=0;
  547.                         }
  548.                 }
  549.         }
  550. }



  551. //===========================輸入密碼錯誤超過三次,報警并鎖死鍵盤======================================================================


  552. //========================取消所有操作=======================================================================
  553. void Cancel(void)
  554. {
  555.         unsigned char i;
  556.         unsigned char j;
  557.         //DisplayListChar(0,1,start_line);
  558.         write_1602com(er);
  559.         for(j=0;j<16;j++)
  560.         {
  561.                 write_1602dat(start_line[j]);   //顯示開機輸入密碼界面
  562.         }
  563.         TwoAlam();   //提示音
  564.         for(i=0;i<6;i++)
  565.         {
  566.                 InputData[i]=0;   //將輸入密碼清零
  567.         }
  568.         KEY=1;   //關閉鎖
  569.         ALAM=1;   //報警關
  570.         pass=0;   //密碼正確標志清零
  571.         ReInputEn=0;   //重置輸入允許標志清零
  572.         ErrorCont=0;   //密碼錯誤輸入次數清零
  573.         CorrectCont=0;   //密碼正確輸入次數清零
  574.         ReInputCont=0;   //重置密碼輸入次數清理
  575.         s3_keydown=0;
  576.         key_disable=0;    //鎖定鍵盤標志清零
  577.          N=0;      //輸入位數計數器清零
  578. }
  579. //=========================主函數=======================================================================================================================================

  580. void main(void)
  581. {
  582.         unsigned char KEY,NUM;
  583.         unsigned char i,j;
  584.         P1=0xFF;     //P1口復位
  585.         TMOD=0x01;   //定義工作方式
  586.         TL0=0xB0;  
  587.         TH0=0x3C;    //定時器賦初值,定時50ms
  588.         EA=1;        //打開中斷總開關
  589.         ET0=1;       //打開中斷允許開關
  590.         TR0=1;       //打開定時器開關
  591.         Delay400Ms();           //啟動等待,等LCM講入工作狀態
  592.         lcd_init();            //LCD初始化
  593.         write_1602com(yi);    //日歷顯示固定符號從第一行第0個位置之后開始顯示
  594.         for(i=0;i<16;i++)
  595.         {
  596.                 write_1602dat(name[i]);   //向液晶屏寫開機畫面
  597.         }
  598.         write_1602com(er);
  599.         for(i=0;i<16;i++)
  600.         {
  601.                 write_1602dat(start_line[i]);    //寫輸入密碼等待界面
  602.         }
  603.         write_1602com(er+9);    //設置光標位置
  604.         write_1602com(0x0f);     //設置光標為閃爍
  605.         Delay5Ms();   //延時片刻(可不要)
  606.         N=0;   //初始化數據輸入位數
  607.         while(1)   //進入循環
  608.         {
  609.                 if(key_disable==1)     //鎖定鍵盤標志為1時
  610.                         Alam_KeyUnable();    //報警鍵盤鎖
  611.                 else
  612.                         ALAM=1;             //關報警
  613.                 KEY=keynum();         //讀按鍵的位置碼
  614.                 if(KEY!=0)            //當有按鍵按下時
  615.                 {
  616.                         if(key_disable==1)   //鎖定鍵盤標志為1時
  617.                         {
  618.                                 second=0;    //秒清零
  619.                         }
  620.                         else    //沒有鎖定鍵盤時
  621.                         {
  622.                                 NUM=coding(KEY);    //根據按鍵的位置將其編碼,編碼值賦值給NUM
  623.                                 {
  624.                                         switch(NUM)   //判斷按鍵值
  625.                                         {
  626.                                                 case ('A'):      ;                   break;
  627.                                                 case ('B'):      ;                   break;
  628.                                                 case ('C'):      ;                   break;   //ABC是無意義按鍵
  629.                                                 case ('D'):ResetPassword();          break;   //重新設置密碼
  630.                                                 case ('*'):Cancel();                 break;   //取消當前輸入
  631.                                                 case ('#'):Ensure();                 break;   //確認鍵
  632.                                                 default:      //如果不是功能鍵按下時,就是數字鍵按下
  633.                                                 {
  634.                                                         if(N<6)   //當輸入密碼少于6位時,接受輸入并保存,大于6位時則無效
  635.                                                         {
  636.                                                                 write_1602com(er);
  637.                                                                 for(i=0;i<16;i++)
  638.                                                                 {
  639.                                                                         write_1602dat(Input[i]);   //顯示輸入畫面
  640.                                                                 }
  641.                                                                 OneAlam();   //按鍵提示音
  642.                                                                 for(j=0;j<=N;j++)
  643.                                                                 {
  644.                                                                         write_1602com(er+6+j);   //顯示位數隨輸入增加而增加
  645.                                                                         write_1602dat('*');     //但不顯示實際數字,用*代替
  646.                                                                 }
  647.                                                                 InputData[N]=NUM;   //將數字鍵的碼賦值給InputData【】數組暫存
  648.                                                                 N++;   //密碼位數加
  649.                                                         }
  650.                                                         else   //輸入數據位數大于6后,忽略輸入
  651.                                                         {
  652.                                                                 N=6;     //密碼輸入大于6位時,不接受輸入
  653.                                                                 break;
  654.                                                         }
  655.                                                 }
  656.                                         }
  657.                                 }
  658.                         }
  659.                 }
  660.         }
  661. }
  662. //=========================中斷服務函數=======================================================================================================================================
  663. void time0_int(void) interrupt 1    //定時器T0
  664. {
  665.         TL0=0xB0;
  666.         TH0=0x3C;    //定時器重新賦初值
  667.         countt0++;    //計時器變量加,加1次時50ms
  668.         if(countt0==20)   //加到20次就是1s
  669.         {
  670.                 countt0=0;   //變量清零
  671.                 second++;    //秒加
  672.                 if(!pass)    //不在開鎖狀態時
  673.                 {
  674.                         if(second==3)   //秒加到3時
  675.                         {
  676.                                 TR0=0;    //關閉定時器
  677.                                 second=0;   //秒清零
  678.                                 key_disable=0;    //鎖定鍵盤清零
  679.                                 s3_keydown=0;   //3秒鍵盤標志位清0
  680.                                 TL0=0xB0;   
  681.                                 TH0=0x3C;    //重新賦初值
  682.                         }
  683.                         else
  684.                                 TR0=1;        //打開定時器
  685.                 }
  686.         }
  687. }
復制代碼

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

使用道具 舉報

沙發
ID:1023753 發表于 2025-5-29 08:27 | 只看該作者
蜂鳴器是不是選的無源的,需要2K方波才能響
回復

使用道具 舉報

板凳
ID:1023753 發表于 2025-5-29 08:29 | 只看該作者
繼電器用的是12V的  你的VCC應該是5v,電壓不夠,改用5V的繼電器
回復

使用道具 舉報

地板
ID:76027 發表于 2025-5-29 08:52 | 只看該作者
這個例程是論壇上的,我試過無法重置密碼。其它的都正常。
回復

使用道具 舉報

5#
ID:76027 發表于 2025-5-29 08:57 | 只看該作者
還有這個數組是6位密碼,你用5位輸入進行比較,能開鎖嗎?
回復

使用道具 舉報

6#
ID:1133081 發表于 2025-5-29 09:39 | 只看該作者
蜂鳴器要正確選擇和正確設置


回復

使用道具 舉報

7#
ID:1151978 發表于 2025-5-29 10:12 | 只看該作者
沒配置好
回復

使用道具 舉報

8#
ID:1152013 發表于 2025-5-29 12:40 | 只看該作者
haiyang201 發表于 2025-5-29 08:29
繼電器用的是12V的  你的VCC應該是5v,電壓不夠,改用5V的繼電器

是的,跟同學弄了好久弄不明白
回復

使用道具 舉報

9#
ID:1152013 發表于 2025-5-29 12:40 | 只看該作者
WL0123 發表于 2025-5-29 09:39
蜂鳴器要正確選擇和正確設置

嗷嗷好的好的謝謝
回復

使用道具 舉報

10#
ID:1152013 發表于 2025-5-29 12:41 | 只看該作者
發表于 2025-5-29 08:57
還有這個數組是6位密碼,你用5位輸入進行比較,能開鎖嗎?

這個地方后面修改了
回復

使用道具 舉報

11#
ID:314651 發表于 2025-8-26 17:50 | 只看該作者
這個是仿真那里的繼電器,設置成4V就好了。三極管有導通壓降。里面設置成5V也可能無法導通。
回復

使用道具 舉報

12#
ID:287147 發表于 2025-8-27 22:01 | 只看該作者

電壓不夠,改用5V的繼電器
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
91免费观看在线| 热门国产精品亚洲第一区在线| 久久国产精品色| 久久精品国产亚洲blacked| 国产精品99999| 国产精品入口免费麻豆| 一二三区免费视频| 成人欧美精品一区二区| 性欧美18一19内谢| 亚洲一区二区三区视频| 日韩中文字幕网址| 欧美日韩大陆一区二区| 国产欧美日韩视频一区二区| 一本久道久久久| 国产精品超碰| 欧美成人精品一区二区男人小说| 男人的天堂在线视频| 狠狠色丁香婷婷| 美女把尿口扒开让男人桶在线观看| 免费一级a毛片夜夜看| 乱码一区二区三区| 亚洲成熟丰满熟妇高潮xxxxx| 久久综合一区二区三区| 国产精品丝袜久久久久久高清| 日韩中文字幕在线观看| 精品久久久久av影院| 一本久久精品一区二区| 国产精品mm| 亚洲精品tv| 欧美四级在线| 国产69久久| 最新亚洲伊人网| 麻豆自创视频在线观看| xxx国产hd| 激情综合丝袜美女一区二区| 一区二区三区黄| 亚洲黄色一区二区| 亚洲熟女少妇一区二区| 特级西西人体wwwww| 手机版av在线| 亚洲人辣妹窥探嘘嘘| 黄色国产一级视频| 亚洲欧美日韩不卡一区二区三区| 99久久综合狠狠综合久久止| 国产精品高精视频免费| 久久久久久久国产精品视频| 深夜福利一区二区| 三上亚洲一区二区| 国产精品男女| 亚洲国产精品免费视频| 久久人人视频| 三级成人在线| 亚洲成人不卡| 久久久人成影片一区二区三区在哪下载 | gogogo高清免费观看在线视频| 欧美高清中文字幕| 成人免费观看在线| 国产精品久久久久9999爆乳| 一道本在线观看视频| 国产又黄又爽免费视频| 超碰在线免费观看97| 手机福利在线视频| 在线观看日本一区| 国产av第一区| 日韩a级在线观看| 亚欧无线一线二线三线区别| 成年人视频网站免费观看| 国产成人无码精品久久久性色| 我的公把我弄高潮了视频| 国产乱子伦农村叉叉叉| 毛片毛片毛片毛片毛片毛片毛片毛片毛片| 精品中文字幕av| 自拍偷拍 国产| 91亚洲一区二区| 成人午夜精品无码区| 超碰97人人干| www.黄色com| 国产亚洲精品久久久久久无几年桃| 国产探花在线免费观看| 久久草视频在线| 一区二区三区黄色片| 亚洲高清在线观看视频| 亚洲男人的天堂成人| 少妇视频一区二区| 亚洲激情视频一区| 88av在线视频| 4hu四虎永久网址| 国产情侣高潮对白| h视频免费在线观看| 狠狠干五月天| 免费在线观看一级毛片| 超碰在线caoporn| 欧美aaa视频| 精品嫩草影院| 一区二区在线| 国产欧美日韩一级| 国产大陆a不卡| 欧美国产日本视频| 午夜影院久久久| 欧美裸体bbwbbwbbw| 日韩第一页在线| 欧美国产视频一区二区| 国产精品欧美日韩| 欧美精品九九99久久| 欧美日韩一区二区在线视频| 亚洲黄色有码视频| 久久国产天堂福利天堂| 国产精品专区h在线观看| 久久精品人人做人人爽电影| 青春草在线视频免费观看| 黄色成人免费看| 日韩人妻无码精品综合区| 日产精品久久久久| 亚洲国产一二三区| 91视频网址免费观看| 簧片在线观看| 污的网站在线观看| 一区二区三区高清在线观看| 久久人人88| 极品少妇xxxx精品少妇偷拍| 中文字幕一区二区三区精华液| 91国偷自产一区二区三区观看 | 涩涩视频免费网站| 香港伦理在线| 99国内精品久久久久| 日韩欧美午夜| 国产麻豆9l精品三级站| 亚洲已满18点击进入久久| 日韩一区二区精品葵司在线| 国模视频一区二区| 欧美区高清在线| 国产一伦一伦一伦| 精品午夜福利视频| 一本久道在线| 亚洲做受高潮| 香蕉久久久久久| 国产日韩1区| 国产女同性恋一区二区| 欧美一区二区美女| 欧美亚洲在线播放| 亚洲自拍偷拍二区| 人妻无码中文久久久久专区| 中文字幕人妻互换av久久| xxx性欧美在线| aaa在线观看| 国内自拍欧美| 最新国产一区二区| 久久www成人_看片免费不卡| 18成人在线观看| 国产视频综合在线| dy888夜精品国产专区| 亚欧在线免费观看| 欧美性猛交bbbbb精品| 国产精品免费91| 性欧美videos高清hd4k| 日韩精品91| 国产视频911| 亚洲精选中文字幕| 国产在线视频欧美一区二区三区| 久久九九国产视频| 黄色小视频在线免费看| xxxxbbbb欧美| 国产美女一区视频| 欧美aⅴ99久久黑人专区| 国产精品视频你懂的| 精品一区二区电影| 久久久久久久久久久一区 | 欧美一区二区福利在线| 午夜精品久久久久久久99热浪潮| 无遮挡亚洲一区| 日本高清www| 香蕉视频911| 成年人在线观看网站| 亚洲日产av中文字幕| 97久久精品人人爽人人爽蜜臀| 日韩欧美综合一区| 成人网中文字幕| 天天操精品视频| 精品人妻av一区二区三区| 作爱视频免费观看视频在线播放激情网| 久久综合偷偷噜噜噜色| 国产成人精品影视| 亚洲高清免费观看高清完整版| 国产精品区一区二区三在线播放| 国产在线不卡av| 先锋男人资源站| h视频在线免费观看| 狠狠综合久久av一区二区老牛| 亚洲午夜电影在线观看| 69av成年福利视频| 最近2019好看的中文字幕免费| 国产精品美女久久久久av福利| 色哟哟网站在线观看| 天天操天天干天天插| 麻豆传媒在线完整视频| 国产精品地址| 一本久道久久综合中文字幕| 国产精品丝袜高跟| 亚洲麻豆一区二区三区| 亚洲男人天堂2017| 成人影院入口| 国产91高潮流白浆在线麻豆| 亚洲午夜av电影| 成人在线视频一区二区三区| 综合网在线观看| 性视频一区二区三区| 91久久电影| 日韩人在线观看| 99久久国产免费免费| www.av天天| 美女做爰内谢全过程视频| 欧美另类中文字幕| 国产日韩精品视频一区| 2020国产精品视频| 少妇伦子伦精品无吗| 欧美日溪乱毛片| 视频欧美精品| 国产精品视频一区二区三区不卡| 韩国日本不卡在线| 亚洲AV无码久久精品国产一区| 亚洲国产成人影院播放| 日韩电影免费观看高清完整版在线观看| 成年人午夜久久久| 欧美www在线| 99sesese| 久久er这里只有精品| 国模大尺度视频一区二区| 欧美国产日韩精品免费观看| 国产91在线播放九色快色| 中文字幕在线国产| 美女大黄三级视频在线观看| 香蕉人人精品| 狠狠爱在线视频一区| 动漫3d精品一区二区三区| 国产稀缺精品盗摄盗拍| 天堂电影在线| 欧美一级视频| 这里只有精品久久| 国产原创精品在线| 日日摸夜夜夜夜夜添| 国产精品白丝一区二区三区| 午夜视频一区二区| 免费毛片一区二区三区久久久| 青青操免费在线视频| 欧美三级黄网| 风流少妇一区二区| 日本精品免费观看| 久久久精品少妇| 高清毛片在线看| 国产麻豆精品theporn| 国内免费久久久久久久久久久 | 成人精品国产免费网站| 97精品国产97久久久久久免费| 亚洲综合自拍网| 人人在线97| 久久久999| 欧美激情图片区| 女人黄色一级片| 九色网友自拍视频手机在线| 精品一区二区三区香蕉蜜桃 | 麻豆蜜桃在线观看| 国产精品久久久久久久岛一牛影视 | 91大神在线网站| www.日韩av| 国产专区精品视频| 7799精品视频天天看| 中文字幕成在线观看| 亚洲精品国产成人久久av盗摄 | 狠狠色狠狠色综合婷婷tag| 欧美久久久一区| 日韩中文字幕二区| 成年人免费影院| 亚洲综合国产| 久久久久久久国产精品视频| 黑人狂躁日本娇小| 亚洲精品天堂| 亚洲卡通动漫在线| 日本特级黄色大片| 桃花网日韩影视在线观看视频| 日韩大片在线播放| 国产一区二区三区精品久久久| 日本一级片在线播放| 四虎精品在永久在线观看 | 国产精品激情av电影在线观看 | chinese麻豆新拍video| 欧美成人明星100排名| 国产裸体歌舞团一区二区| 国产精品嫩草视频| 天天射天天干天天| 国产午夜久久av| 欧美一级二级三级乱码| 三级av免费观看| av超碰在线观看| 99久久久免费精品国产一区二区| 国产精品亚洲不卡a| 国模人体一区二区| 国产成人精品一区二区免费看京 | 女女色综合影院| 中文字幕一区二区三区在线不卡 | 黄色三级网站在线观看| 国内精品久久久久久久影视简单| 亚洲美女在线视频| 成人小视频免费看| 国产v日韩v欧美v| 欧洲一区在线观看| 污网站在线免费| 清纯唯美亚洲色图| 国产精品久久99| 国产精品无码免费专区午夜| 8mav模特福利视频在线观看| 国产真实精品久久二三区| 99在线视频首页| 中文乱码字幕av网站| 黄色成人在线网址| 国产成人精品av在线| 国产女人18毛片18精品| 成人在线免费小视频| 欧美第一淫aaasss性| 波多野结衣大片| 先锋影音国产精品| 欧美乱大交xxxxx| 国产美女www| 精品一区二区三区在线 | 182在线视频| 97在线超碰| 日韩一区二区视频| 少妇愉情理伦三级| 福利精品在线| 亚洲女人天堂色在线7777| 极品久久久久久| 日韩精品一区二区三区中文字幕| 亚洲欧美制服另类日韩| 久久免费精彩视频| 青草久久视频| 久久人人看视频| 99产精品成人啪免费网站| 91精品二区| 国产欧美日韩精品在线观看| 男女啪啪免费体验区| 日日夜夜精品视频免费| 久久精品第九区免费观看| 黄色免费大片| 久久蜜桃香蕉精品一区二区三区| av网站大全免费| 日韩私人影院| 一本一本大道香蕉久在线精品 | 97香蕉久久| 亚洲人成在线观看一区二区| 亚洲高清免费在线观看| 欧美人与性动交α欧美精品图片| 欧美一二三区在线| 五月天丁香激情| 国产欧美日韩精品高清二区综合区| 欧洲s码亚洲m码精品一区| 男人的天堂导航| 国产在线精品视频| 超碰超碰超碰超碰超碰| 男人天堂亚洲二区| 欧美专区日韩专区| 国产喷水在线观看| 欧美绝顶高潮抽搐喷水合集| 欧美一级成年大片在线观看| 影音先锋男人每日资源站| 国产乱国产乱300精品| 日本免费a视频| 精品黄色免费中文电影在线播放| 欧美一区三区二区| 在线观看免费国产视频| 国产精品草草| 日韩久久久久久久久久久久久| 天堂影视av| 色综合一个色综合| 任我爽在线视频| 成人羞羞网站入口| 国产精品日韩一区二区三区| ckplayer中文字幕| 欧美午夜精品久久久久久人妖| 91社区视频在线观看| 伊人成综合网yiren22| 成人国产精品一区二区| 88av看到爽| 日韩欧美国产一区二区| 侵犯稚嫩小箩莉h文系列小说| 精品一区二区三区在线| 国产一区二区三区高清| 日韩男人天堂| 欧美三级视频在线播放| 久久高清无码视频| 欧美日本中文| 亚洲一区二区三区乱码 | 尤物视频..com| 亚洲天堂a在线| 日本猛少妇色xxxxx免费网站| 国产中文字幕一区二区三区| 国产精品亚洲一区| 伊人网在线视频| 精品国产一区二区三区不卡| 91一区二区视频| 粉嫩蜜臀av国产精品网站| 亚洲va在线va天堂va偷拍|