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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5933|回復(fù): 5
收起左側(cè)

單片機(jī)RC522射頻密碼鎖設(shè)計(jì)源碼資料分享

[復(fù)制鏈接]
ID:198608 發(fā)表于 2018-10-9 18:41 | 顯示全部樓層 |閱讀模式
歡迎互相學(xué)習(xí)進(jìn)步
制作出來的實(shí)物圖如下:
20181009182422.png

電路原理圖如下:
20181009182613.png

20181009182639.png 20181009182527.png

元件清單:
4~13-密碼鎖元件清單

1)    9*15萬用板(J2601A)
2)    40腳座(H0202A)
3)    stc89c52單片機(jī)
4)    1602液晶(J0802A)
5)    16p插針(H0204E)
6)    16p單排母座(H0204F)
7)    2.2k電阻*2(H0201D)
8)    1k電阻*2(H0201E)
9)    10k電阻*2(H0201C)
10)    103排阻(H0202I)
11)    9012*2三極管(H0203B)
12)    按鍵*17(H0203G)
13)    3p接線端子(H0205M)
14)    5v有源蜂鳴器(H0203I)
15)    10uf電容*2(H0203H)
16)    30pf瓷片電容*2(H0203C)
17)    12m晶振(H0203D)
18)    Led(5MM紅色)(H0202L)
19)    5v松樂繼電器(H0205K)
20)    DC電源插口(H0211D)
21)    自鎖開關(guān)(H0203F)
22)    8p單排母座(H0204D)
23)    8p排針(H0204C)
24)    RC522射頻模塊(J1105A)
25)    LM1117-3.3v(H0204Q)
26)    22uf電容(焊接桌上)
27)    104獨(dú)石電容(H0206C)
28)    導(dǎo)線若干(桌下)
29)    焊錫若干(桌下)
30)    usb電源線(電池盒+DC插頭)(桌下)


單片機(jī)源程序如下:
  1. #include <REG52.h>
  2. #include<intrins.h>        
  3. #include "main.h"
  4. #include<rc522.c>
  5. #include<eeprom52.h>  
  6. #define LCM_Data  P0
  7. #define uchar unsigned char
  8. #define uint  unsigned int

  9. sbit lcd1602_rs=P2^5;
  10. sbit lcd1602_rw=P2^6;
  11. sbit lcd1602_en=P2^7;


  12. sbit ALAM = P2^1;                //報(bào)警        
  13. sbit KEY = P3^6;                //開鎖

  14. bit  operation=0;                //操作標(biāo)志位
  15. bit  pass=0;                        //密碼正確標(biāo)志
  16. bit  ReInputEn=0;                //重置輸入充許標(biāo)志        
  17. bit  s3_keydown=0;                //3秒按鍵標(biāo)志位
  18. bit  key_disable=0;                //鎖定鍵盤標(biāo)志
  19. bit  chushihua=0;       //可以注冊卡標(biāo)志位
  20. unsigned char countt0,second;        //t0中斷計(jì)數(shù)器,秒計(jì)數(shù)器

  21. //解碼變量
  22. unsigned char Im[4]={0x00,0x00,0x00,0x00};

  23. //全局變量
  24. uchar f,a_a;
  25. unsigned long m,Tc;
  26. unsigned char   IrOK;
  27. unsigned char xdata CardRevBuf[16] = { 0 };
  28. //void Delay5Ms(void);

  29. unsigned char code a[]={0xFE,0xFD,0xFB,0xF7};                                                                                         //控盤掃描控制表

  30. unsigned char code start_line[]        = {"password:       "};
  31. unsigned char code name[]                  = {"===Coded Lock==="};                                                                                                //顯示名稱
  32. unsigned char code Correct[]         = {"     correct    "};                                                                                         //輸入正確
  33. unsigned char code Error1[]           = {"      error     "};                                                                                          //輸入錯(cuò)誤
  34. unsigned char code codepass[]        = {"      pass      "};
  35. unsigned char code LockOpen[]        = {"      open      "};                                                                                                //OPEN
  36. unsigned char code SetNew[]         = {"SetNewWordEnable"};
  37. unsigned char code Input[]           = {"input:          "};                                                                                                //INPUT
  38. unsigned char code ResetOK[]         = {"ResetPasswordOK "};
  39. unsigned char code initword[]        = {"Init password..."};
  40. unsigned char code Er_try[]                = {"error,try again!"};
  41. unsigned char code again[]                = {"input again     "};

  42. unsigned char InputData[6];                                                                                                                                //輸入密碼暫存區(qū)
  43. unsigned char CurrentPassword[6]={1,3,1,4,2,0};                                                                                                                 //當(dāng)前密碼值
  44. unsigned char TempPassword[6];
  45. unsigned char N=0;                                //密碼輸入位數(shù)記數(shù)
  46. unsigned char ErrorCont;                        //錯(cuò)誤次數(shù)計(jì)數(shù)
  47. unsigned char CorrectCont;                        //正確輸入計(jì)數(shù)
  48. unsigned char ReInputCont;                         //重新輸入計(jì)數(shù)
  49. unsigned char code initpassword[6]={0,0,0,0,0,0};
  50. unsigned char current_id;
  51. char xdata DisplayBuf[10];  //當(dāng)前讀出卡的ID
  52. char xdata DisplayBuf_c[10];  //當(dāng)前單片機(jī)里存的卡ID
  53. void write_eeprom()
  54. {
  55.    
  56.         SectorErase(0x200a);                   //清空
  57.     byte_write(0x2000,TempPassword[0]);
  58.           byte_write(0x2001,TempPassword[1]);
  59.          byte_write(0x2002,TempPassword[2]);
  60.          byte_write(0x2003,TempPassword[3]);
  61.          byte_write(0x2004,TempPassword[4]);
  62.          byte_write(0x2005,TempPassword[5]);                        
  63.         byte_write(0x2060,0x02);

  64. }
  65. void write_eeprom_j(unsigned char j)                  //將對應(yīng)的ID寫入到單片機(jī)
  66. {
  67.    
  68.         SectorErase(0x2200+j*0x0200);                   //清空
  69.          byte_write(0x2200+j*0x0200,DisplayBuf[0]);               
  70.          byte_write(0x2201+j*0x0200,DisplayBuf[1]);
  71.         byte_write(0x2202+j*0x0200,DisplayBuf[2]);
  72.         byte_write(0x2203+j*0x0200,DisplayBuf[3]);
  73.         byte_write(0x2204+j*0x0200,DisplayBuf[4]);
  74.         byte_write(0x2205+j*0x0200,DisplayBuf[5]);
  75.         byte_write(0x2206+j*0x0200,DisplayBuf[6]);
  76.         byte_write(0x2207+j*0x0200,DisplayBuf[7]);
  77. }
  78. void write_eeprom_jj(unsigned char j)         //將對應(yīng)的ID清空
  79. {
  80.    
  81.         SectorErase(0x2200+j*0x0200);                   //清空
  82.          byte_write(0x2200+j*0x0200,' ');               
  83.          byte_write(0x2201+j*0x0200,' ');
  84.         byte_write(0x2202+j*0x0200,' ');
  85.         byte_write(0x2203+j*0x0200,' ');
  86.         byte_write(0x2204+j*0x0210,' ');
  87.         byte_write(0x2205+j*0x0200,' ');
  88.         byte_write(0x2206+j*0x0200,' ');
  89.         byte_write(0x2207+j*0x0200,' ');
  90. }
  91. void read_eeprom_j(uchar j)
  92. {
  93.   DisplayBuf_c[0]= byte_read(0x2200+j*0x0200);
  94.   DisplayBuf_c[1]= byte_read(0x2201+j*0x0200);
  95.   DisplayBuf_c[2]= byte_read(0x2202+j*0x0210);
  96.   DisplayBuf_c[3]= byte_read(0x2203+j*0x0200);
  97.   DisplayBuf_c[4]= byte_read(0x2204+j*0x0200);
  98.   DisplayBuf_c[5]= byte_read(0x2205+j*0x0200);
  99.   DisplayBuf_c[6]= byte_read(0x2206+j*0x0200);
  100.   DisplayBuf_c[7]= byte_read(0x2207+j*0x0200);   

  101. }
  102. /******************把數(shù)據(jù)從單片機(jī)內(nèi)部eeprom中讀出來*****************/
  103. void read_eeprom()                                                                                                                                 
  104. {

  105.     CurrentPassword[0]= byte_read(0x2000);
  106.         CurrentPassword[1]= byte_read(0x2011);
  107.         CurrentPassword[2]= byte_read(0x2002);
  108.         CurrentPassword[3]= byte_read(0x2003);
  109.         CurrentPassword[4]= byte_read(0x2004);
  110.     CurrentPassword[5]= byte_read(0x2005);
  111.         a_a = byte_read(0x2060);
  112.          
  113. }

  114. /**************開機(jī)自檢eeprom初始化*****************/
  115. void init_eeprom()
  116. {
  117.     uchar i,j;
  118.         a_a = byte_read(0x2060);
  119.         if(a_a != 1)                //新的單片機(jī)初始單片機(jī)內(nèi)問eeprom
  120.         {
  121.         
  122.                 a_a = 1;

  123.                 for(i=0;i<6;i++)
  124.                 {
  125.                   SectorErase(0x2200+i*0x0200);
  126.                   for(j=0;j<8;j++)
  127.                   byte_write(0x2200+i*0x0200+j,'0');         
  128.                 }
  129.             write_eeprom();           //保存數(shù)據(jù)
  130.         }        
  131. }


  132. //=====================5ms延時(shí)==============================
  133. void Delay5Ms()
  134. {
  135.         unsigned int TempCyc = 5552;
  136.         while(TempCyc--);
  137. }        

  138. //===================400ms延時(shí)==============================
  139. void Delay400Ms()
  140. {
  141. unsigned char TempCycA = 5;
  142. unsigned int TempCycB;
  143. while(TempCycA--)
  144. {
  145.   TempCycB=7269;
  146.   while(TempCycB--);
  147. }
  148. }


  149. //==================================================================================================
  150. //=======================================LCD1602====================================================
  151. //==================================================================================================

  152. #define yi 0x80 //LCD第一行的初始位置,因?yàn)長CD1602字符地址首位D7恒定為1(100000000=80)
  153. #define er 0x80+40 //LCD第二行初始位置(因?yàn)榈诙械谝粋(gè)字符位置地址是0x40)


  154. //----------------延時(shí)函數(shù),后面經(jīng)常調(diào)用----------------------
  155. void delay(uint xms)//延時(shí)函數(shù),有參函數(shù)
  156. {
  157.         uint x,y;
  158.         for(x=xms;x>0;x--)
  159.          for(y=110;y>0;y--);
  160. }

  161. //--------------------------寫指令---------------------------
  162. void write_1602com(uchar com)//****液晶寫入指令函數(shù)****
  163. {
  164.         lcd1602_rs=0;//數(shù)據(jù)/指令選擇置為指令
  165.         lcd1602_rw=0; //讀寫選擇置為寫
  166.         P0=com;//送入數(shù)據(jù)
  167.         delay(1);
  168.         lcd1602_en=0;//拉高使能端,為制造有效的下降沿做準(zhǔn)備
  169.         delay(1);
  170.         lcd1602_en=1;//en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令
  171. }

  172. //-------------------------寫數(shù)據(jù)-----------------------------
  173. void write_1602dat(uchar dat)//***液晶寫入數(shù)據(jù)函數(shù)****
  174. {
  175.         lcd1602_rs=1;//數(shù)據(jù)/指令選擇置為數(shù)據(jù)
  176.         lcd1602_rw=1; //讀寫選擇置為寫
  177.         P0=dat;//送入數(shù)據(jù)
  178.         delay(1);
  179.         lcd1602_en=0; //en置高電平,為制造下降沿做準(zhǔn)備
  180.         delay(1);
  181.         lcd1602_en=1; //en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令
  182. }

  183. //-------------------------初始化-------------------------
  184. void lcd_init()
  185. {
  186.         write_1602com(0x01);//清顯示
  187.         write_1602com(0x38);//設(shè)置液晶工作模式,意思:16*2行顯示,5*7點(diǎn)陣,8位數(shù)據(jù)
  188.         write_1602com(0x0c);//開顯示不顯示光標(biāo)
  189.         write_1602com(0x06);//整屏不移動,光標(biāo)自動右移
  190. }
  191. //========================================================================================
  192. //=========================================================================================

  193. //==============將按鍵值編碼為數(shù)值=========================
  194. unsigned char coding(unsigned char m1,unsigned char hh)         
  195. {
  196.         unsigned char k;
  197.         if(IrOK==1)
  198.         {
  199.                 IrOK=0;
  200.                 switch(m1)
  201.                 {
  202.                         case (0x0c): k=1;break;
  203.                         case (0x18): k=2;break;
  204.                         case (0x5e): k=3;break;
  205. //                        case (0xff): k='A';break;         //
  206.                         case (0x08): k=4;break;               
  207.                         case (0x1c): k=5;break;
  208.                         case (0x50): k=6;break;
  209. //                        case (0x82): k='B';break;           //
  210.                         case (0x42): k=7;break;
  211.                         case (0x52): k=8;break;
  212.                         case (0x4a): k=9;break;
  213. //                        case (0x84): k='C';break;        //
  214.                         case (0x43): k='*';break;          //撤銷
  215.                         case (0x16): k=0;break;
  216.                         case (0x15): k='#';break;           //確認(rèn)鍵
  217.                         case (0x0d): k='D';break;           //重設(shè)密碼        
  218.                         case (0x4e): k='B';break;         //
  219.                         case (0x47): k='C';break;         //
  220.                         case (0x44): k='A';break;         //
  221.                         case (0x40): k='A';break;         //
  222.                         case (0x07): k='A';break;         //        
  223.                         case (0x09): k='A';break;         //        
  224.                         case (0x19): k='A';break;         //        
  225. //                        default:;
  226.                 }
  227.         }
  228.         else
  229.         {
  230.                 switch(hh)
  231.                 {
  232.                         case (0x11): k=1;break;
  233.                         case (0x21): k=2;break;
  234.                         case (0x41): k=3;break;
  235.                         case (0x81): k='A';break;
  236.                         case (0x12): k=4;break;
  237.                         case (0x2a): k=5;break;
  238.                         case (0x42): k=6;break;
  239.                         case (0x82): k='B';break;
  240.                         case (0x14): k=7;break;
  241.                         case (0x24): k=8;break;
  242.                         case (0x4b): k=9;break;
  243.                         case (0x84): k='C';break;
  244.                         case (0x18): k='*';break;
  245.                         case (0x28): k=0;break;
  246.                         case (0x48): k='#';break;
  247.                         case (0x88): k='D';break;
  248. //                        default:;
  249.                 }
  250.         }
  251.         return(k);
  252. }


  253. //=====================按鍵檢測并返回按鍵值===============================
  254. unsigned char keynum()
  255. {
  256.          unsigned char row,col,i;
  257.          P1=0xf0;
  258.          if((P1&0xf0)!=0xf0)
  259.          {
  260.                    Delay5Ms();
  261.         Delay5Ms();
  262.                    if((P1&0xf0)!=0xf0)
  263.                 {
  264.                     row=P1^0xf0;          //確定行線
  265.                         i=0;
  266.                         P1=a[i];                  //精確定位
  267.                         while(i<4)
  268.                         {
  269.                                  if((P1&0xf0)!=0xf0)
  270.                                   {
  271.                                            col=~(P1&0xff);          //確定列線
  272.                                            break;            //已定位后提前退出   
  273.                                   }
  274.                                 else
  275.                                   {
  276.                                            i++;
  277.                                            P1=a[i];
  278.                                   }
  279.                         }
  280.                 }
  281.                 else
  282.                 {
  283.                         return 0;
  284.                 }
  285.         
  286.                 while((P1&0xf0)!=0xf0);

  287.                 return (row|col);                         //行線與列線組合后返回
  288.          }
  289.          else return 0;                                 //無鍵按下時(shí)返回0
  290. }




  291. //=======================一聲提示音,表示有效輸入========================
  292. void OneAlam()
  293. {
  294.         ALAM=0;
  295.         Delay5Ms();
  296.     ALAM=1;
  297. }

  298. //========================二聲提示音,表示操作成功========================
  299. void TwoAlam()
  300. {
  301.         ALAM=0;
  302.         Delay5Ms();
  303.     ALAM=1;
  304.     Delay5Ms();
  305.         ALAM=0;
  306.         Delay5Ms();
  307.     ALAM=1;
  308. }

  309. //========================三聲提示音,表示錯(cuò)誤========================
  310. void ThreeAlam()
  311. {
  312.         ALAM=0;
  313.         Delay5Ms();
  314.     ALAM=1;
  315.     Delay5Ms();
  316.         ALAM=0;
  317.         Delay5Ms();
  318.     ALAM=1;
  319.     Delay5Ms();
  320.         ALAM=0;
  321.         Delay5Ms();
  322.     ALAM=1;

  323. }

  324. //=====================顯示輸入的N個(gè)數(shù)字,用H代替以便隱藏============================
  325. void DisplayOne()
  326. {
  327. //        DisplayOneChar(9+N,1,'*');
  328.         write_1602com(yi+5+N);
  329.         write_1602dat('*');
  330. }

  331. //=======================顯示提示輸入=========================
  332. void DisplayChar()
  333. {
  334.         unsigned char i;
  335.         if(pass==1)
  336.         {
  337.                 //DisplayListChar(0,1,LockOpen);
  338.                 write_1602com(er);
  339.                 for(i=0;i<16;i++)
  340.                 {
  341.                         write_1602dat(LockOpen[i]);        
  342.                 }
  343.         }
  344.         else
  345.         {
  346.                 if(N==0)
  347.                 {
  348.                         //DisplayListChar(0,1,Error);
  349.                         write_1602com(er);
  350.                         for(i=0;i<16;i++)
  351.                         {
  352.                                 write_1602dat(Error1[i]);        
  353.                         }
  354.                 }
  355.                 else
  356.                 {
  357.                         //DisplayListChar(0,1,start_line);        
  358.                         write_1602com(er);
  359.                         for(i=0;i<16;i++)
  360.                         {
  361.                                 write_1602dat(start_line[i]);        
  362.                         }
  363.                 }
  364.         }
  365. }

  366. void DisplayInput()
  367. {
  368.         unsigned char i;
  369.         if(CorrectCont==1)
  370.         {
  371.                 //DisplayListChar(0,0,Input);
  372.                 write_1602com(er);
  373.                 for(i=0;i<16;i++)
  374.                 {
  375.                         write_1602dat(Input[i]);        
  376.                 }
  377.         }
  378. }


  379. //========================重置密碼==================================================
  380. //==================================================================================
  381. void ResetPassword()
  382. {
  383.         unsigned char i;        
  384.         unsigned char j;
  385.         if(pass==0)
  386.         {
  387.                 pass=0;
  388.                 DisplayChar();
  389.                 ThreeAlam();
  390.         }
  391.         else
  392.         {
  393.             if(ReInputEn==1)
  394.                 {
  395.                         if(N==6)
  396.                         {
  397.                                 ReInputCont++;                                
  398.                                 if(ReInputCont==2)
  399.                                 {
  400.                                         for(i=0;i<6;)
  401.                                         {
  402.                                                 if(TempPassword[i]==InputData[i])        //將兩次輸入的新密碼作對比
  403.                                                         i++;
  404.                                                 else
  405.                                                 {
  406.                                                         //DisplayListChar(0,1,Error);
  407.                                                         write_1602com(er);
  408.                                                         for(j=0;j<16;j++)
  409.                                                         {
  410.                                                                 write_1602dat(Error1[j]);        
  411.                                                         }
  412.                                                         ThreeAlam();                        //錯(cuò)誤提示        
  413.                                                         pass=0;
  414.                                                         ReInputEn=0;                        //關(guān)閉重置功能,
  415.                                                         ReInputCont=0;
  416.                                                         DisplayChar();
  417.                                                         break;
  418.                                                 }
  419.                                         }
  420.                                         if(i==6)
  421.                                         {
  422.                                                 //DisplayListChar(0,1,ResetOK);
  423.                                                 write_1602com(er);
  424.                                                 for(j=0;j<16;j++)
  425.                                                 {
  426.                                                         write_1602dat(ResetOK[j]);        
  427.                                                 }

  428.                                                 TwoAlam();                                //操作成功提示
  429.                         write_eeprom();
  430.                                                 ReInputEn=0;
  431.                                         }
  432.                                         ReInputCont=0;
  433.                                         CorrectCont=0;
  434.                                 }
  435.                                 else
  436.                                 {
  437.                                         OneAlam();
  438.                                         //DisplayListChar(0, 1, again);                 //顯示再次輸入一次
  439.                                         write_1602com(er);
  440.                                         for(j=0;j<16;j++)
  441.                                         {
  442.                                                 write_1602dat(again[j]);        
  443.                                         }                                       
  444.                                         for(i=0;i<6;i++)
  445.                                         {
  446.                                                 TempPassword[i]=InputData[i];                //將第一次輸入的數(shù)據(jù)暫存起來                                                
  447.                                         }
  448.                                 }

  449.                         N=0;                                                //輸入數(shù)據(jù)位數(shù)計(jì)數(shù)器清零
  450.                    }
  451.             }
  452.         }

  453. }



  454. //=======================輸入密碼錯(cuò)誤超過三過,報(bào)警并鎖死鍵盤======================
  455. void Alam_KeyUnable()
  456. {
  457.         P1=0x00;
  458.         {
  459.                 ALAM=~ALAM;
  460.                 Delay5Ms();
  461.         }
  462. }


  463. //=======================取消所有操作============================================
  464. void Cancel()
  465. {        
  466.         unsigned char i;
  467.         unsigned char j;
  468.         //DisplayListChar(0, 1, start_line);
  469.         write_1602com(er);
  470.         for(j=0;j<16;j++)
  471.         {
  472.                 write_1602dat(start_line[j]);        
  473.         }
  474.         TwoAlam();                                //提示音
  475.         for(i=0;i<6;i++)
  476.         {
  477.                 InputData[i]=0;
  478.         }
  479.         KEY=1;                                        //關(guān)閉鎖
  480.         ALAM=1;                                        //報(bào)警關(guān)
  481.         operation=0;                        //操作標(biāo)志位清零
  482.         pass=0;                                        //密碼正確標(biāo)志清零
  483.         ReInputEn=0;                        //重置輸入充許標(biāo)志清零
  484. //        ErrorCont=0;                        //密碼錯(cuò)誤輸入次數(shù)清零
  485.         CorrectCont=0;                        //密碼正確輸入次數(shù)清零
  486.         ReInputCont=0;                        //重置密碼輸入次數(shù)清零
  487.         s3_keydown=0;
  488.         key_disable=0;
  489.         N=0;                                        //輸入位數(shù)計(jì)數(shù)器清零
  490. }

  491. //==========================確認(rèn)鍵,并通過相應(yīng)標(biāo)志位執(zhí)行相應(yīng)功能===============================
  492. void Ensure()
  493. {        
  494.         unsigned char i,j;
  495. //        RdFromROM(CurrentPassword,0,6);                                         //從24C02里讀出存儲密碼
  496.     read_eeprom();
  497.     if(N==6)
  498.         {
  499.             if(ReInputEn==0)                                                        //重置密碼功能未開啟
  500.                 {
  501.                         for(i=0;i<6;)
  502.                            {                                       
  503.                                 if(CurrentPassword[i]==InputData[i])
  504.                                 {
  505.                                         i++;
  506.                                 }
  507.                                 else
  508.                                 {
  509.                                         i=7;                        
  510.                                         ErrorCont++;
  511.                                         if(ErrorCont>=3&&KEY==1)                        //錯(cuò)誤輸入計(jì)數(shù)達(dá)三次時(shí),報(bào)警并鎖定鍵盤
  512.                                         {
  513.                                                 write_1602com(er);
  514.                                                 for(i=0;i<16;i++)
  515.                                                 {
  516.                                                         write_1602dat(Error1[i]);        
  517.                                                 }
  518.                                                 Alam_KeyUnable();
  519.                                                 TR0=0;                                //開啟定時(shí)
  520.                                                 key_disable=1;                        //鎖定鍵盤
  521.                                                 pass=0;
  522.                                                 break;        
  523.                                         }
  524.                                 }  
  525.                         }

  526.                         if(i==6)
  527.                         {
  528.                                 CorrectCont++;
  529.                                 if(CorrectCont==1)                                //正確輸入計(jì)數(shù),當(dāng)只有一次正確輸入時(shí),開鎖,
  530.                                 {
  531.                                         //DisplayListChar(0,1,LockOpen);
  532.                                         write_1602com(er);
  533.                                         for(j=0;j<16;j++)
  534.                                         {
  535.                                                 write_1602dat(LockOpen[j]);        
  536.                                         }
  537.                                         TwoAlam();                        //操作成功提示音
  538.                                         ErrorCont=0;
  539.                                         KEY=0;                                                                                        //開鎖
  540.                                         pass=1;                                                                                        //置正確標(biāo)志位
  541.                                         TR1=1;                                                                                        //開啟定時(shí)
  542.                                         for(j=0;j<6;j++)                                                                //將輸入清除
  543.                                         {
  544.                                                 InputData[i]=0;
  545.                                         }
  546.                                 }        
  547.                                 else                                                                                                //當(dāng)兩次正確輸入時(shí),開啟重置密碼功能
  548.                                 {
  549.                                         //DisplayListChar(0,1,SetNew);
  550.                                         write_1602com(er);
  551.                                         for(j=0;j<16;j++)
  552.                                         {
  553.                                                 write_1602dat(SetNew[j]);        
  554.                                         }
  555.                                         TwoAlam();                                                                            //操作成功提示
  556.                                         ReInputEn=1;                                                                        //允許重置密碼輸入
  557.                                         CorrectCont=0;                                                                        //正確計(jì)數(shù)器清零
  558.                                 }
  559.                           }
  560.         
  561.                         else                        //=========================當(dāng)?shù)谝淮问褂没蛲浢艽a時(shí)可以用131420對其密碼初始化============
  562.                         {
  563.                                 if((InputData[0]==1)&&(InputData[1]==3)&&(InputData[2]==1)&&(InputData[3]==4)&&(InputData[4]==2)&&(InputData[5]==0))
  564.                                    {
  565. //                                        WrToROM(initpassword,0,6);                                 //強(qiáng)制將初始密碼寫入24C02存儲
  566.                
  567.                                         //DisplayListChar(0,1,initword);                        //顯示初始化密碼
  568.                                  
  569.                                         TwoAlam();
  570.                                         Delay400Ms();
  571.                                         TwoAlam();
  572.                                         N=0;
  573.                                         chushihua=1;
  574.                                 }

  575.                                 else if((InputData[0]==1)&&(InputData[1]==3)&&(InputData[2]==1)&&(InputData[3]==4)&&(InputData[4]==2)&&(InputData[5]==1))
  576.                                    {
  577. //                                        WrToROM(initpassword,0,6);                                 //強(qiáng)制將初始密碼寫入24C02存儲
  578.                      TempPassword[0]=0;
  579.                                          TempPassword[1]=0;
  580.                                          TempPassword[2]=0;
  581.                                          TempPassword[3]=0;
  582.                                          TempPassword[4]=0;
  583.                                          TempPassword[5]=0;
  584.                      write_eeprom();
  585.                                         //DisplayListChar(0,1,initword);                        //顯示初始化密碼
  586.                                         write_1602com(er);
  587.                                         for(j=0;j<16;j++)
  588.                                         {
  589.                                                 write_1602dat(initword[j]);        
  590.                                         }
  591.                                         TwoAlam();
  592.                                         Delay400Ms();
  593.                                         TwoAlam();
  594.                                         N=0;
  595.                         
  596.                                 }
  597.                                 else
  598.                                 {
  599.                                         //DisplayListChar(0,1,Error);
  600.                                         write_1602com(er);
  601.                                         for(j=0;j<16;j++)
  602.                                         {
  603.                                                 write_1602dat(Error1[j]);        
  604.                                         }
  605.                                          ThreeAlam();                                                                                //錯(cuò)誤提示音
  606.                                         pass=0;        
  607.                                 }
  608.                         }
  609.                 }

  610.                 else                                                                                        //當(dāng)已經(jīng)開啟重置密碼功能時(shí),而按下開鎖鍵,
  611.                 {
  612.                         //DisplayListChar(0,1,Er_try);
  613.                         write_1602com(er);
  614.                         for(j=0;j<16;j++)
  615.                         {
  616.                                 write_1602dat(Er_try[j]);        
  617.                         }
  618.                         ThreeAlam();
  619.                 }
  620.         }

  621.         else
  622.         {
  623.                 //DisplayListChar(0,1,Error);
  624.                 write_1602com(er);
  625.                 for(j=0;j<16;j++)
  626.                 {
  627.                         write_1602dat(Error1[j]);        
  628.                 }

  629.                  ThreeAlam();                                                                                //錯(cuò)誤提示音
  630.                 pass=0;        
  631.         }
  632.         
  633.         N=0;                                                                                                        //將輸入數(shù)據(jù)計(jì)數(shù)器清零,為下一次輸入作準(zhǔn)備

  634.         operation=1;
  635. }



  636. void display_id( unsigned char xdata * SrcBuf )
  637. {

  638.         char xdata *pDisplayChar;
  639.         unsigned char xdata Tmp, i;

  640.         pDisplayChar = DisplayBuf;

  641.         for( i = 0; i < 4; i++ )
  642.         {
  643.                 Tmp = ( ( *SrcBuf ) << 4 ) & 0x0F;        
  644.                 if( ( Tmp >=0 ) && ( Tmp <= 9 )        )
  645.                 {
  646.                         *pDisplayChar ++ = '0' + Tmp;        
  647.                 }
  648.                 else
  649.                 {
  650.                         *pDisplayChar ++ = 'A' + Tmp - 10;
  651.                 }

  652.                 Tmp = ( *SrcBuf ) & 0x0F;        
  653.                 if( ( Tmp >=0 ) && ( Tmp <= 9 )        )
  654.                 {
  655.                         *pDisplayChar ++ = '0' + Tmp;        
  656.                 }
  657.                 else
  658.                 {
  659.                         *pDisplayChar ++ = 'A' + Tmp - 10;
  660.                 }

  661.                 SrcBuf ++;
  662.         }
  663.         *pDisplayChar ++ = '\0';

  664. //        DisplayListChar( 0, 4, DisplayBuf );   
  665.         if(chushihua==1)
  666.         {
  667.     write_1602com(0xc0);
  668.         write_1602dat('I');
  669.         write_1602dat('D');
  670.         write_1602dat(current_id+0x30);
  671.         write_1602dat(':');
  672.         write_1602dat(DisplayBuf[0]);
  673.         write_1602dat(DisplayBuf[1]);
  674.         write_1602dat(DisplayBuf[2]);
  675.         write_1602dat(DisplayBuf[3]);
  676.         write_1602dat(DisplayBuf[4]);
  677.         write_1602dat(DisplayBuf[5]);
  678.         write_1602dat(DisplayBuf[6]);
  679.         write_1602dat(DisplayBuf[7]);
  680.         write_1602dat(' ');
  681.         write_1602dat(' ');write_1602dat(' ');write_1602dat(' ');write_1602dat(' ');
  682.         }
  683. }
  684. void display_no_id()
  685. {

  686.   write_1602com(0xc0);
  687.           write_1602dat('I');
  688.         write_1602dat('D');
  689.         write_1602dat(current_id+0x30);
  690.         write_1602dat(':');
  691.          write_1602dat(DisplayBuf_c[0]);
  692.         write_1602dat(DisplayBuf_c[1]);
  693.         write_1602dat(DisplayBuf_c[2]);
  694.         write_1602dat(DisplayBuf_c[3]);
  695.         write_1602dat(DisplayBuf_c[4]);
  696.         write_1602dat(DisplayBuf_c[5]);
  697.         write_1602dat(DisplayBuf_c[6]);
  698.         write_1602dat(DisplayBuf_c[7]);
  699.                 write_1602dat(' ');
  700.         write_1602dat(' ');write_1602dat(' ');write_1602dat(' ');write_1602dat(' ');
  701. }
  702. void ctrl( void )
  703. {
  704.     uchar j,i;
  705.         if( PcdRequest( PICC_REQIDL, &CardRevBuf[0] ) != MI_OK )//尋天線區(qū)內(nèi)未進(jìn)入休眠狀態(tài)的卡,返回卡片類型 2字節(jié)        
  706.         {
  707.                 if( PcdRequest( PICC_REQIDL, &CardRevBuf[0] ) != MI_OK )//尋天線區(qū)內(nèi)未進(jìn)入休眠狀態(tài)的卡,返回卡片類型 2字節(jié)        
  708.                 {
  709.                  if(chushihua==1)
  710.                  {
  711.                  read_eeprom_j(current_id);
  712.                   display_no_id();
  713.                  }
  714.                         return;
  715.                 }        
  716.         }

  717.         if( PcdAnticoll( &CardRevBuf[2] ) != MI_OK ) //防沖撞,返回卡的序列號 4字節(jié)
  718.         {
  719.         if(chushihua==1)
  720.         {
  721.         read_eeprom_j(current_id);
  722.          display_no_id();
  723.         }
  724.                 return;        
  725.         }

  726.         if( PcdSelect( &CardRevBuf[2] ) != MI_OK )//選卡
  727.         {
  728.         if(chushihua==1)
  729.         {
  730.          read_eeprom_j(current_id);
  731.            display_no_id();
  732.          }
  733.                 return;
  734.         }

  735.         display_id( &CardRevBuf[2] );
  736.         if(CorrectCont==0&&pass==0)
  737.         {
  738.           for(j=0;j<6;j++)
  739.           {
  740.           read_eeprom_j(j);
  741.            if(DisplayBuf[0]==DisplayBuf_c[0]&&DisplayBuf[1]==DisplayBuf_c[1]&&DisplayBuf[2]==DisplayBuf_c[2]&&DisplayBuf[3]==DisplayBuf_c[3]&&DisplayBuf[4]==DisplayBuf_c[4]&&DisplayBuf[5]==DisplayBuf_c[5])
  742.            {
  743.          
  744.                   CorrectCont=1;
  745.                   write_1602com(er);
  746.                         for(j=0;j<16;j++)
  747.                         {
  748.                                 write_1602dat(LockOpen[j]);        
  749.                         }
  750.                         TwoAlam();                        //操作成功提示音
  751.                         ErrorCont=0;
  752.                         KEY=0;                                                                                        //開鎖
  753.                         pass=1;                                                                                        //置正確標(biāo)志位
  754.                         TR0=1;                                                                                        //開啟定時(shí)
  755.                         for(j=0;j<6;j++)                                                                //將輸入清除
  756.                         {
  757.                                 InputData[i]=0;
  758.                         }
  759.                 return;
  760.            }
  761.           }
  762.         }
  763. }


  764. //==============================主函數(shù)===============================
  765. void main()
  766. {
  767.          unsigned char KEY,NUM;
  768.         unsigned char i,j;
  769.          P1=0xFF;
  770.         EA=1;
  771.         TMOD=0x01;
  772.         IT1=1;//下降沿有效
  773.         EX1=1;//外部中斷1開
  774.            
  775.         TH0=0;//T0賦初值
  776.         TL0=0;
  777.         TR0=1;//t0開始計(jì)時(shí)
  778.          TL1=0x3c;
  779.          TH1=0xb0;
  780.          ET1=1;        
  781.          TR1=0;
  782.          Delay400Ms();         //啟動等待,等LCM講入工作狀態(tài)
  783.          lcd_init();         //LCD初始化
  784.         write_1602com(yi);//日歷顯示固定符號從第一行第0個(gè)位置之后開始顯示
  785.         init_rc522();
  786.         init_eeprom();
  787.         read_eeprom();
  788.         for(i=0;i<16;i++)
  789.         {
  790.                 write_1602dat(name[i]);//向液晶屏寫日歷顯示的固定符號部分
  791.         }
  792.         write_1602com(er);//時(shí)間顯示固定符號寫入位置,從第2個(gè)位置后開始顯示
  793.         for(i=0;i<16;i++)
  794.         {
  795.                 write_1602dat(start_line[i]);//寫顯示時(shí)間固定符號,兩個(gè)冒號
  796.         }
  797.         write_1602com(er+9);        //設(shè)置光標(biāo)位置
  798.         write_1602com(0x0f);        //設(shè)置光標(biāo)為閃爍
  799.          Delay5Ms(); //延時(shí)片刻(可不要)

  800.          N=0;                                                                                                                //初始化數(shù)據(jù)輸入位數(shù)
  801.          while(1)
  802.          {
  803.            
  804.                 ctrl();
  805.                 if(key_disable==1)
  806.                         Alam_KeyUnable();
  807.                 else
  808.                         ALAM=1;                                                                //關(guān)報(bào)警

  809.                 KEY=keynum();
  810.                 if(KEY!=0||IrOK==1)
  811.                 {        
  812.                         if(key_disable==1)
  813.                         {
  814.                                 second=0;
  815.                         }
  816.                         else
  817.                         {
  818.                                 NUM=coding(Im[2],KEY);
  819.                                 {
  820.                                         switch(NUM)
  821.                                         {
  822.                                                 case ('A'): if(chushihua==1)
  823.                                                             {
  824.                                                              current_id++;
  825.                                                             if(current_id>5)
  826.                                                                          current_id=0;
  827.                                                                          }                                        break;
  828.                                                 case ('B'):        if(chushihua==1)
  829.                                                              write_eeprom_jj(current_id)        ;                                             break;
  830.                                                 case ('C'): if(chushihua==1)
  831.                                                              write_eeprom_j(current_id)        ;                                         break;
  832.                                                 case ('D'): chushihua=0;ResetPassword();                break;      //重新設(shè)置密碼
  833.                                                 case ('*'): chushihua=0;Cancel();                                break;      //取消當(dāng)前輸入
  834.                                                 case ('#'): chushihua=0; Ensure();                                 break;           //確認(rèn)鍵,
  835.                                                 default:
  836.                                                 {        
  837.                                                     chushihua=0;
  838.                                                         //DisplayListChar(0,1,Input);
  839.                                                         write_1602com(er);
  840.                                                         for(i=0;i<16;i++)
  841.                                                         {
  842.                                                                 write_1602dat(Input[i]);
  843.                                                         }
  844.                                                     operation=0;
  845.                                                         if(N<6)                                                           //當(dāng)輸入的密碼少于6位時(shí),接受輸入并保存,大于6位時(shí)則無效。
  846.                                                         {  
  847.                                                                 OneAlam();                                                                //按鍵提示音                                                
  848.                                                                 //DisplayOneChar(6+N,1,'*');
  849.                                                                  for(j=0;j<=N;j++)
  850.                                                                 {
  851.                                                                         write_1602com(er+6+j);
  852.                                                                         write_1602dat('*');
  853.                                                                 }
  854.                                                                 InputData[N]=NUM;
  855.                                                                 N++;
  856.                                                         }
  857.                                                         else                                                                                //輸入數(shù)據(jù)位數(shù)大于6后,忽略輸入
  858.                                                         {
  859.                                                                 N=6;
  860.                                                                  break;
  861.                                                         }
  862.                                                 }
  863.                                         }
  864.                                 }
  865.                         }
  866.                  }
  867.         }
  868. }

  869. //*********************************中斷服務(wù)函數(shù)**************************************
  870. void  time1_int() interrupt 3
  871. {
  872.          TL1=0x3c;
  873.          TH1=0xb0;
  874.          countt0++;
  875.           if(countt0==20)
  876.            {
  877.                 countt0=0;
  878.                 second++;
  879.                 if(pass==1)
  880.                 {
  881.                         if(second==1)
  882.                         {
  883.                                 TR1=0;                                //關(guān)定時(shí)器
  884.                                 TL1=0xB0;
  885.                                  TH1=0x3C;
  886.                                 second=0;
  887.                         }
  888.                 }
  889.                 else
  890.                 {
  891.                         if(second==3)
  892.                         {
  893.                                 TR1=0;
  894.                                 second=0;
  895.                                 key_disable=0;        
  896.                                 s3_keydown=0;        
  897.                                 TL1=0xB0;
  898.                                 TH1=0x3C;
  899.                         }
  900.                         else
  901.                             TR1=1;
  902.                 }
  903.                         
  904.            }
  905. }
復(fù)制代碼
0.png

所有資料51hei提供下載:
求幫助.7z (11.06 KB, 下載次數(shù): 123)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評分

回復(fù)

使用道具 舉報(bào)

ID:493109 發(fā)表于 2019-3-22 13:46 | 顯示全部樓層
壓縮包里沒有原理圖?傳的圖有點(diǎn)模糊
回復(fù)

使用道具 舉報(bào)

ID:496919 發(fā)表于 2019-4-14 13:19 | 顯示全部樓層
你好,我想問下你這個(gè)的程序是如何燒錄進(jìn)去的
回復(fù)

使用道具 舉報(bào)

ID:470242 發(fā)表于 2020-4-16 23:07 | 顯示全部樓層
程序里面包括RC522射頻模塊嗎
回復(fù)

使用道具 舉報(bào)

ID:730070 發(fā)表于 2020-6-11 09:02 | 顯示全部樓層
不錯(cuò)的資料,正需要呢                    
回復(fù)

使用道具 舉報(bào)

ID:1047194 發(fā)表于 2022-10-11 13:59 | 顯示全部樓層
你好,這電路圖只是一部分吧,我好像沒看到RC522
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 91精品国产91久久久久久密臀 | 欧美日韩亚洲系列 | 欧美精品 在线观看 | 欧美一区免费 | 久久99网| 午夜欧美日韩 | 国产三区精品 | 日韩av一区二区在线观看 | 天天爽一爽| 成人午夜网 | 能看的av| 欧美成年人网站 | 亚洲区中文字幕 | 91精品国产91 | 天天天操 | 日韩在线免费视频 | 在线观看国产视频 | 日韩欧美国产精品 | 欧美亚洲日本 | 午夜午夜精品一区二区三区文 | 国产精品美女 | 波多野结衣av中文字幕 | 欧美成年黄网站色视频 | 亚洲视频www| 国产婷婷精品av在线 | 国产乱码精品一区二区三区五月婷 | 久久久不卡网国产精品一区 | 欧美一区二区三区,视频 | 91麻豆精品国产91久久久更新资源速度超快 | 成年人在线观看 | 97人人干 | 国产成人免费一区二区60岁 | 一区二区三区国产在线观看 | 黄色毛片在线观看 | 久久久久91 | 欧美精品久久久久 | 最新av在线网址 | 日韩成人在线观看 | 欧美日韩一区不卡 | 日韩人体视频 | 久久精品一区二 |