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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

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空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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位輸入進行比較,能開鎖嗎?

這個地方后面修改了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜不卡福利视频 | 狠狠干天天干 | 日韩精品一区二区三区四区视频 | 91亚洲国产 | 久久久妇女国产精品影视 | 国产丝袜av | 欧美黑人狂野猛交老妇 | 日本视频一区二区 | 精品久久久久香蕉网 | 黑人性hd| a黄毛片| 日韩中文一区二区三区 | 日本三级做a全过程在线观看 | 黄色大全免费看 | 色橹橹欧美在线观看视频高清 | 亚洲黄色视屏 | 婷婷久久综合 | 福利一区二区 | 视频一区在线 | 日韩精品二区 | 欧美激情在线播放 | 欧美另类视频在线 | 亚洲精品久久久久avwww潮水 | 在线免费激情视频 | 日本久久久久久 | 国产一区二区三区在线 | 久久综合欧美 | 精品亚洲一区二区三区四区五区 | 久草在线视频中文 | 久久久久久久久久久一区二区 | 国产欧美日韩在线观看 | 成人在线播放网站 | 久久久久久久久毛片 | 欧美精品中文字幕久久二区 | 欧美黑人国产人伦爽爽爽 | 毛片软件 | 97视频在线观看网站 | 三级成人在线观看 | 特黄毛片| 亚洲福利视频网 | 国产精品www |