找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4951|回复: 5
收起左侧

单片机RC522射频密码锁设计源码资料分享

[复制链接]
ID:198608 发表于 2018-10-9 18:41 | 显示全部楼层 |阅读模式
欢迎互相学习进步
制作出来的实物图如下:
20181009182422.png

电路原理图如下:
20181009182613.png

20181009182639.png 20181009182527.png

元件清单:
4~13-密码锁元件清单

1)    9*15万用板(J2601A)
2)    40脚座(H0202A)
3)    stc89c52单片机
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)    自锁开关(H0203F)
22)    8p单排母座(H0204D)
23)    8p排针(H0204C)
24)    RC522射频模块(J1105A)
25)    LM1117-3.3v(H0204Q)
26)    22uf电容(焊接桌上)
27)    104独石电容(H0206C)
28)    导线若干(桌下)
29)    焊锡若干(桌下)
30)    usb电源线(电池盒+DC插头)(桌下)


单片机源程序如下:
  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;                //报警        
  13. sbit KEY = P3^6;                //开锁

  14. bit  operation=0;                //操作标志位
  15. bit  pass=0;                        //密码正确标志
  16. bit  ReInputEn=0;                //重置输入充许标志        
  17. bit  s3_keydown=0;                //3秒按键标志位
  18. bit  key_disable=0;                //锁定键盘标志
  19. bit  chushihua=0;       //可以注册卡标志位
  20. unsigned char countt0,second;        //t0中断计数器,秒计数器

  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     "};                                                                                          //输入错误
  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];                                                                                                                                //输入密码暂存区
  43. unsigned char CurrentPassword[6]={1,3,1,4,2,0};                                                                                                                 //当前密码值
  44. unsigned char TempPassword[6];
  45. unsigned char N=0;                                //密码输入位数记数
  46. unsigned char ErrorCont;                        //错误次数计数
  47. unsigned char CorrectCont;                        //正确输入计数
  48. unsigned char ReInputCont;                         //重新输入计数
  49. unsigned char code initpassword[6]={0,0,0,0,0,0};
  50. unsigned char current_id;
  51. char xdata DisplayBuf[10];  //当前读出卡的ID
  52. char xdata DisplayBuf_c[10];  //当前单片机里存的卡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)                  //将对应的ID写入到单片机
  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)         //将对应的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. /******************把数据从单片机内部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. /**************开机自检eeprom初始化*****************/
  115. void init_eeprom()
  116. {
  117.     uchar i,j;
  118.         a_a = byte_read(0x2060);
  119.         if(a_a != 1)                //新的单片机初始单片机内问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();           //保存数据
  130.         }        
  131. }


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

  138. //===================400ms延时==============================
  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第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=80)
  153. #define er 0x80+40 //LCD第二行初始位置(因为第二行第一个字符位置地址是0x40)


  154. //----------------延时函数,后面经常调用----------------------
  155. void delay(uint xms)//延时函数,有参函数
  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)//****液晶写入指令函数****
  163. {
  164.         lcd1602_rs=0;//数据/指令选择置为指令
  165.         lcd1602_rw=0; //读写选择置为写
  166.         P0=com;//送入数据
  167.         delay(1);
  168.         lcd1602_en=0;//拉高使能端,为制造有效的下降沿做准备
  169.         delay(1);
  170.         lcd1602_en=1;//en由高变低,产生下降沿,液晶执行命令
  171. }

  172. //-------------------------写数据-----------------------------
  173. void write_1602dat(uchar dat)//***液晶写入数据函数****
  174. {
  175.         lcd1602_rs=1;//数据/指令选择置为数据
  176.         lcd1602_rw=1; //读写选择置为写
  177.         P0=dat;//送入数据
  178.         delay(1);
  179.         lcd1602_en=0; //en置高电平,为制造下降沿做准备
  180.         delay(1);
  181.         lcd1602_en=1; //en由高变低,产生下降沿,液晶执行命令
  182. }

  183. //-------------------------初始化-------------------------
  184. void lcd_init()
  185. {
  186.         write_1602com(0x01);//清显示
  187.         write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据
  188.         write_1602com(0x0c);//开显示不显示光标
  189.         write_1602com(0x06);//整屏不移动,光标自动右移
  190. }
  191. //========================================================================================
  192. //=========================================================================================

  193. //==============将按键值编码为数值=========================
  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;           //确认键
  217.                         case (0x0d): k='D';break;           //重设密码        
  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;                                 //无键按下时返回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. //========================三声提示音,表示错误========================
  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个数字,用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();                        //错误提示        
  413.                                                         pass=0;
  414.                                                         ReInputEn=0;                        //关闭重置功能,
  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];                //将第一次输入的数据暂存起来                                                
  447.                                         }
  448.                                 }

  449.                         N=0;                                                //输入数据位数计数器清零
  450.                    }
  451.             }
  452.         }

  453. }



  454. //=======================输入密码错误超过三过,报警并锁死键盘======================
  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;                                        //关闭锁
  480.         ALAM=1;                                        //报警关
  481.         operation=0;                        //操作标志位清零
  482.         pass=0;                                        //密码正确标志清零
  483.         ReInputEn=0;                        //重置输入充许标志清零
  484. //        ErrorCont=0;                        //密码错误输入次数清零
  485.         CorrectCont=0;                        //密码正确输入次数清零
  486.         ReInputCont=0;                        //重置密码输入次数清零
  487.         s3_keydown=0;
  488.         key_disable=0;
  489.         N=0;                                        //输入位数计数器清零
  490. }

  491. //==========================确认键,并通过相应标志位执行相应功能===============================
  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)                        //错误输入计数达三次时,报警并锁定键盘
  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;                                //开启定时
  520.                                                 key_disable=1;                        //锁定键盘
  521.                                                 pass=0;
  522.                                                 break;        
  523.                                         }
  524.                                 }  
  525.                         }

  526.                         if(i==6)
  527.                         {
  528.                                 CorrectCont++;
  529.                                 if(CorrectCont==1)                                //正确输入计数,当只有一次正确输入时,开锁,
  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;                                                                                        //置正确标志位
  541.                                         TR1=1;                                                                                        //开启定时
  542.                                         for(j=0;j<6;j++)                                                                //将输入清除
  543.                                         {
  544.                                                 InputData[i]=0;
  545.                                         }
  546.                                 }        
  547.                                 else                                                                                                //当两次正确输入时,开启重置密码功能
  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;                                                                        //正确计数器清零
  558.                                 }
  559.                           }
  560.         
  561.                         else                        //=========================当第一次使用或忘记密码时可以用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);                                 //强制将初始密码写入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);                                 //强制将初始密码写入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();                                                                                //错误提示音
  606.                                         pass=0;        
  607.                                 }
  608.                         }
  609.                 }

  610.                 else                                                                                        //当已经开启重置密码功能时,而按下开锁键,
  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();                                                                                //错误提示音
  630.                 pass=0;        
  631.         }
  632.         
  633.         N=0;                                                                                                        //将输入数据计数器清零,为下一次输入作准备

  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 )//寻天线区内未进入休眠状态的卡,返回卡片类型 2字节        
  706.         {
  707.                 if( PcdRequest( PICC_REQIDL, &CardRevBuf[0] ) != MI_OK )//寻天线区内未进入休眠状态的卡,返回卡片类型 2字节        
  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字节
  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;                                                                                        //置正确标志位
  754.                         TR0=1;                                                                                        //开启定时
  755.                         for(j=0;j<6;j++)                                                                //将输入清除
  756.                         {
  757.                                 InputData[i]=0;
  758.                         }
  759.                 return;
  760.            }
  761.           }
  762.         }
  763. }


  764. //==============================主函数===============================
  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开始计时
  778.          TL1=0x3c;
  779.          TH1=0xb0;
  780.          ET1=1;        
  781.          TR1=0;
  782.          Delay400Ms();         //启动等待,等LCM讲入工作状态
  783.          lcd_init();         //LCD初始化
  784.         write_1602com(yi);//日历显示固定符号从第一行第0个位置之后开始显示
  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);//时间显示固定符号写入位置,从第2个位置后开始显示
  793.         for(i=0;i<16;i++)
  794.         {
  795.                 write_1602dat(start_line[i]);//写显示时间固定符号,两个冒号
  796.         }
  797.         write_1602com(er+9);        //设置光标位置
  798.         write_1602com(0x0f);        //设置光标为闪烁
  799.          Delay5Ms(); //延时片刻(可不要)

  800.          N=0;                                                                                                                //初始化数据输入位数
  801.          while(1)
  802.          {
  803.            
  804.                 ctrl();
  805.                 if(key_disable==1)
  806.                         Alam_KeyUnable();
  807.                 else
  808.                         ALAM=1;                                                                //关报警

  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;      //重新设置密码
  833.                                                 case ('*'): chushihua=0;Cancel();                                break;      //取消当前输入
  834.                                                 case ('#'): chushihua=0; Ensure();                                 break;           //确认键,
  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)                                                           //当输入的密码少于6位时,接受输入并保存,大于6位时则无效。
  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                                                                                //输入数据位数大于6后,忽略输入
  858.                                                         {
  859.                                                                 N=6;
  860.                                                                  break;
  861.                                                         }
  862.                                                 }
  863.                                         }
  864.                                 }
  865.                         }
  866.                  }
  867.         }
  868. }

  869. //*********************************中断服务函数**************************************
  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;                                //关定时器
  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. }
复制代码
0.png

所有资料51hei提供下载:
求帮助.7z (11.06 KB, 下载次数: 121)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:493109 发表于 2019-3-22 13:46 | 显示全部楼层
压缩包里没有原理图?传的图有点模糊
回复

使用道具 举报

ID:496919 发表于 2019-4-14 13:19 | 显示全部楼层
你好,我想问下你这个的程序是如何烧录进去的
回复

使用道具 举报

ID:470242 发表于 2020-4-16 23:07 | 显示全部楼层
程序里面包括RC522射频模块吗
回复

使用道具 举报

ID:730070 发表于 2020-6-11 09:02 | 显示全部楼层
不错的资料,正需要呢                    
回复

使用道具 举报

ID:1047194 发表于 2022-10-11 13:59 | 显示全部楼层
你好,这电路图只是一部分吧,我好像没看到RC522
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表