找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于RC522制作的刷卡加密码门禁系统源码资料

[复制链接]
ID:145507 发表于 2017-7-27 13:39 | 显示全部楼层 |阅读模式
内含有源代码和12864的资料以及程序  
这也是朋友给我的资料 最近才看懂  
分享给大家
0.png

单片机源程序如下:
  1. #include "reg52.h"
  2. #include "main.h"
  3. #include "mfrc522.h"       
  4. #include <string.h>
  5. #define uchar unsigned char
  6. #define uint  unsigned int
  7. /*和刷卡模块之间通信的  i\o口    使用SPI通信*/
  8. sbit CS=P3^2;            //片选信号
  9. sbit SID=P3^5;                //数据信号
  10. sbit SCLK=P3^4;                //时钟信号
  11. sbit RST=P3^3;                //复位信号
  12.   
  13. /********************************************************************
  14. * 名称 : delay()
  15. * 功能 : 延时,延时时间为 100us * t。这是通过软件延时,有一定误差。
  16. * 输入 : t
  17. * 输出 : 无
  18. ***********************************************************************/
  19. void delay(unsigned int t)      //延时函数
  20. {
  21.         unsigned int i,j;
  22.         for(i=0; i<t;  i++)
  23.     for(j=0; j<10; j++);
  24. }

  25. /********************************************************************
  26. * 名称 : sendbyte()
  27. * 功能 : 按照液晶的串口通信协议,发送数据
  28. * 输入 : zdata
  29. * 输出 : 无
  30. ***********************************************************************/
  31. void sendbyte(unsigned char zdata)       //    向lcd写一个字节
  32. {
  33.         unsigned int i;
  34.         for(i=0; i<8; i++)
  35.         {
  36.                 if((zdata << i) & 0x80)   //一位一位的发送过去
  37.                 {
  38.                         SID = 1;
  39.                 }
  40.                 else
  41.                 {
  42.                         SID = 0;
  43.                 }
  44.                 SCLK = 0;
  45.                 SCLK = 1;
  46.         }
  47. }

  48. /********************************************************************
  49. * 名称 : write_com()
  50. * 功能 : 写串口指令
  51. * 输入 : cmdcode
  52. * 输出 : 无
  53. ***********************************************************************/
  54. void write_com(unsigned char cmdcode)     //给lcd写命令的
  55. {
  56.         CS = 1;
  57.         sendbyte(0xf8);
  58.         sendbyte(cmdcode & 0xf0);
  59.         sendbyte((cmdcode << 4) & 0xf0);
  60.         delay(2);
  61. }

  62. /********************************************************************
  63. * 名称 : write_data()
  64. * 功能 : 写串口指令
  65. * 输入 : cmdcode
  66. * 输出 : 无
  67. ***********************************************************************/
  68. void write_data(unsigned char Dispdata)   //   向lcd写数据的函数   其中调用了  写字节函数
  69. {
  70.         CS = 1;
  71.         sendbyte(0xfa);
  72.         sendbyte(Dispdata & 0xf0);
  73.         sendbyte((Dispdata << 4) & 0xf0);
  74.         delay(2);
  75. }

  76. /********************************************************************
  77. * 名称 : lcdinit()
  78. * 功能 : 初始化函数
  79. * 输入 : cmdcode
  80. * 输出 : 无
  81. ***********************************************************************/
  82. void lcdinit()    //lcd12864的初始化
  83. {  
  84.         RST = 0;
  85.         delay(100);
  86.         RST = 1;
  87.         delay(20000);
  88.         write_com(0x30);
  89.         delay(50);
  90.         write_com(0x0c);
  91.         delay(50);
  92. }

  93. /********************************************************************
  94. * 名称 : hzkdis()
  95. * 功能 : 显示字符串
  96. * 输入 : *s
  97. * 输出 : 无
  98. ***********************************************************************/
  99. void hzkdis(unsigned char code *s)        //向lcd写一个字符串   函数调用了 写数据函数
  100. {  
  101.         while(*s > 0)
  102.     {
  103.                 write_data(*s);
  104.                 s++;
  105.                 delay(50);
  106.     }
  107. }

  108. /********************************************************************
  109. * 名称 : Test()
  110. * 功能 : 显示子函数
  111. * 输入 : 无
  112. * 输出 : 无
  113. ***********************************************************************/
  114. void Test()     //   开机的一个显示函数   
  115. {  
  116.         write_com(0x03);
  117.         delay(50);   
  118.         write_com(0x81);
  119.         hzkdis("13级  杨向鹏");
  120.         write_com(0x92);
  121.         hzkdis("毕业设计");
  122.         write_com(0x89);
  123.         hzkdis("电子门禁系统");
  124.         write_com(0x9a);
  125.         hzkdis("请刷卡");
  126. }

  127. //M1卡的某一块写为如下格式,则该块为钱包,可接收扣款和充值命令
  128. //4字节金额(低字节在前)+4字节金额取反+4字节金额+1字节块地址+1字节块地址取反+1字节块地址+1字节块地址取反
  129. unsigned char code data2[4]  = {0x12,0,0,0};
  130. unsigned char code DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; //unsigned char g_ucTempbuf[20];   
  131. unsigned char idata MLastSelectedSnr[4];
  132. unsigned char idata RevBuffer[30];// = {02,02,26};  
  133. unsigned char data SerBuffer[20];
  134. unsigned char flag,statu;
  135. unsigned char cmd;
  136. unsigned char j;
  137. unsigned char table_shuju[10];
  138. unsigned char code mima[6] = {14,10,6,13,9,5};   // 对应的按键值    对应的密码为123456
  139. bit CmdValid;
  140. sbit PWM = P3^6;   //控制舵机的io口    使用pwm控制

  141. #define GPIO_KEY P2     //矩阵键盘的输入口
  142. unsigned char pwm,num;
  143. unsigned char KeyValue,z,x,y;

  144. //unsigned int code table[] = {0x00,0xfa,0x3a,0xb0,0xab};   // 这是我的一卡通的id   等你回来可以换成你的
  145.   unsigned int code table[] = {0x00,0xe4,0x8a,0x3a,0xdb};





  146. void Delay10ms(int c )     //延时函数
  147. {
  148.     unsigned char a,b;
  149.     for(;c>0;c--)
  150.         for(b=38;b>0;b--)
  151.             for(a=130;a>0;a--);
  152. }



  153. void iccardcode()    //这是ic卡的读取函数
  154. {             
  155.         unsigned char status;
  156.         cmd++;
  157.         switch(cmd)
  158.         {
  159.                
  160.                 case 1:     // Request,Anticoll,Select,return CardType(2 bytes)+CardSerialNo(4 bytes)
  161.                                 // 寻卡,防冲突,选择卡    返回卡类型(2 bytes)+ 卡系列号(4 bytes)
  162.                         status= PcdRequest(RevBuffer[1],&RevBuffer[2]);
  163.                         if(status!=0)
  164.                         {
  165.                                 status= PcdRequest(RevBuffer[1],&RevBuffer[2]);
  166.                                 if(status!=0)                               
  167.                                 {
  168.                                         RevBuffer[0]=1;       
  169.                                         RevBuffer[1]=status;
  170.                                         break;
  171.                                 }
  172.                         }  
  173.                         RevBuffer[0]=3;       
  174.                         RevBuffer[1]=status;
  175.                         break;
  176.                        
  177.                 case 2:                         // 防冲突 读卡的系列号 MLastSelectedSnr
  178.                         cmd = 0;
  179.                         status = PcdAnticoll(&RevBuffer[2]);
  180.                         if(status!=0)
  181.                         {
  182.                                 RevBuffer[0]=1;       
  183.                                 RevBuffer[1]=status;
  184.                                 break;
  185.                         }
  186.                         memcpy(MLastSelectedSnr,&RevBuffer[2],4);
  187.                         RevBuffer[0]=5;
  188.                         RevBuffer[1]=status;
  189.                         break;               
  190.         }






  191.         }
  192. /////////////////////////////////////////////////////////////////////
  193. //系统初始化
  194. /////////////////////////////////////////////////////////////////////
  195. void InitializeSystem()    //初始化 中断函数   包括串口中断和外部中断   串口是用来读取ic信息发送给上位机的
  196. {
  197.     P0 = 0xFF; P1 = 0xFF; P3 = 0xFF;



  198.         ET2 = 0;        
  199.         T2CON = 0x04;               
  200. //   PCON = 0x80;               
  201.     SCON = 0x70;                 
  202.     TMOD = 0x21;        //TMOD = 0x22;

  203.         TH1   = 0xfd;//BAUD_9600;
  204.         TL1   = TH1;
  205.         TR1   = 1;             // 波特率发生器

  206.         TH0 = (65536-458)/256;
  207.     TL0 = (65536-458)%256;

  208.    
  209.     ET0=1;
  210.         ET1=0;
  211.         EA=1;
  212.         EX0=1;
  213.         IT0 = 1;       
  214.         TR2=0;
  215.         ES = 1;







  216.         CmdValid=0;

  217.      LED_GREEN = 1;
  218.      PcdReset();
  219.      PcdAntennaOff();
  220.      PcdAntennaOn();  
  221.          M500PcdConfigISOType( 'A' );
  222.      LED_GREEN = 0;
  223.          delay_10ms(10);       
  224.      LED_GREEN = 1;
  225.          delay_10ms(10);
  226.      LED_GREEN = 0;
  227. }

  228. /////////////////////////////////////////////////////////////////////
  229. //用T2做延时子程序
  230. /////////////////////////////////////////////////////////////////////


  231. ///////////////////////////////////////////////////////////////////////
  232. // 接收和发送中断
  233. ///////////////////////////////////////////////////////////////////////
  234. void isr_UART(void) interrupt 4 using 1//  串口中断 上位机使用  实际中没有用处  读取ic卡信息时使用
  235. {
  236.     unsigned char len,i;
  237.           unsigned int j=0;

  238.         if(!RI && TI)
  239.         {
  240.                 TI=0;
  241.                 len=RevBuffer[0];
  242.                 for(i=0;i<len+1;i++)
  243.                 {
  244.                         SBUF=RevBuffer[i];
  245.                         while(!TI);
  246.                         TI=0;                       
  247.                 }
  248.                 REN=1;
  249.         }
  250. }



  251. void KeyDown(void)     //矩阵键盘的检测函数
  252. {
  253.         char a = 0;
  254.         GPIO_KEY=0x0f;
  255.         if(GPIO_KEY!=0x0f)//读取按键是否按下
  256.         {
  257.                 Delay10ms(1);//延时10ms进行消抖
  258.                 if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
  259.                 {
  260.                        
  261.                         //测试列
  262.                         GPIO_KEY=0X0F;
  263.                         switch(GPIO_KEY)
  264.                         {
  265.                                 case(0X07):        KeyValue=0;break;
  266.                                 case(0X0b):        KeyValue=4;break;
  267.                                 case(0X0d): KeyValue=8;break;
  268.                                 case(0X0e):        KeyValue=12;break;
  269.                         }
  270.                         //测试行
  271.                         GPIO_KEY=0XF0;
  272.                         switch(GPIO_KEY)
  273.                         {
  274.                                 case(0X70):        table_shuju[y]=KeyValue+3;y++;break;
  275.                                 case(0Xb0):        table_shuju[y]=KeyValue+2;;y++;break;
  276.                                 case(0Xd0): table_shuju[y]=KeyValue+1;y++;break;
  277.                                 case(0Xe0):        table_shuju[y]=KeyValue+16;y++;break;
  278.                         }
  279.                         while((a<50) && (GPIO_KEY!=0xf0))         //检测按键松手检测
  280.                         {
  281.                                 Delay10ms(1);
  282.                                 a++;
  283.                         }
  284.                 }
  285.         }
  286. }











  287.   void main( )
  288. {   

  289.         cmd = 0;

  290.         num = 0;
  291.         y = 0;
  292.         flag = 0;
  293.     InitializeSystem( );

  294.                         TR0 = 1;
  295.                         pwm = 5;
  296.                         Delay10ms(30);
  297.                         TR0 = 0;
  298.             delay(1);        //12864初始化
  299.             lcdinit();
  300.             delay(10);
  301.        
  302.        
  303.            Test();
  304.        

  305.     while (1)
  306.     {       
  307.     z = 1;
  308.                 y = 0;
  309.                 iccardcode();        //分析数据
  310.                 iccardcode();  

  311.                 TI = 1;//CALL_isr_UART();
  312. //读取ic卡信息后判断信息对不对  
  313.                 for(j = 0;j<5;j++)
  314.                 {
  315.                         if(RevBuffer[j+1] == table[j])
  316.                         {
  317.                                 flag++;
  318.                         }                               
  319.                 }
  320.                                
  321.                 if(flag ==5)    //ic信息正确
  322.                 {
  323.                             write_com(0x03);
  324.                                         delay(50);   
  325.                                         write_com(0x99);
  326.                                         hzkdis("请输入密码");       
  327.                             flag = 0;                          
  328.     while (z)   //ic卡信息正确后 开始让输入密码
  329.     {       

  330.                                   KeyDown();
  331.              switch(y)   //按下一个按键显示一个“*”
  332.                                                  {
  333.                                                          case 1:
  334.                                                                  write_com(0x03);
  335.                                                                 delay(50);   
  336.                                                                 write_com(0x99);
  337.                                                                 hzkdis("*           ");        break;
  338.                                                          case 2:
  339.                                                                  write_com(0x03);
  340.                                                                 delay(50);   
  341.                                                                 write_com(0x99);
  342.                                                                 hzkdis("**           ");        break;
  343.                                                          case 3:
  344.                                                                  write_com(0x03);
  345.                                                                 delay(50);   
  346.                                                                 write_com(0x99);
  347.                                                                 hzkdis("***         ");        break;
  348.                                                          case 4:
  349.                                                                  write_com(0x03);
  350.                                                                 delay(50);   
  351.                                                                 write_com(0x99);
  352.                                                                 hzkdis("****        ");        break;
  353.                                                          case 5:
  354.                                                                  write_com(0x03);
  355.                                                                 delay(50);   
  356.                                                                 write_com(0x99);
  357.                                                                 hzkdis("*****       ");        break;
  358.                                                          case 6:
  359.                                                                  write_com(0x03);
  360.                                                                 delay(50);   
  361.                                                                 write_com(0x99);
  362.                                                                 hzkdis("******      ");        break;
  363.                                                          default:break;                                                         
  364.                                                  }       


  365.                                                    if(table_shuju[y-1] == 16)     //密码不小心数错了  删除“*”  重新输入
  366.                                                          {
  367.                                                                  y = 0;
  368.                                                                  flag = 0;
  369.                                                                   write_com(0x03);
  370.                                                                 delay(50);   
  371.                                                                 write_com(0x99);
  372.                                                                 hzkdis("      ");
  373.                                                          }
  374.                                                          if(table_shuju[y-1] == 3)   //按下红色的的确定按键
  375.                                                         {       
  376.                                                                 for(x = 0;x<6;x++)   //判定密码对不对  如果对flag = 6  
  377.                                                                 {
  378.                                                                         if(table_shuju[x] == mima[x])
  379.                                                                                 flag++;
  380.                                                                 }               
  381.                                                        
  382.                                                                 if(flag == 6)  // 密码正确
  383.                                                                 {

  384.                                                                        
  385.                                                                         TR0 = 1;
  386.                                                                         pwm = 2;      //输出PWM控制舵机开门        当屏幕出现**********    然后依次减少     最后开门时间到舵机回位   门会再次上锁
  387.                                                                         write_com(0x03);
  388.                                                                         delay(50);   
  389.                                                                         write_com(0x99);                                                                       
  390.                   hzkdis("**********");     
  391.                                                                         Delay10ms(10);
  392.                                                                         write_com(0x03);
  393.                                                                         delay(50);   
  394.                                                                         write_com(0x99);
  395.                   hzkdis("********* ");
  396.                                                                         Delay10ms(10);
  397.                                                                         write_com(0x03);
  398.                                                                         delay(50);   
  399.                                                                         write_com(0x99);
  400.                                                                         hzkdis("********  ");
  401.                                                                         Delay10ms(10);
  402.                                                                         write_com(0x03);
  403.                                                                         delay(50);   
  404.                                                                         write_com(0x99);
  405.                                                                         hzkdis("*******   ");
  406.                                                                         Delay10ms(10);
  407.                                                                         write_com(0x03);
  408.                                                                         delay(50);   
  409.                                                                         write_com(0x99);
  410.                                                                         hzkdis("******    ");
  411.                                                                         Delay10ms(10);
  412.                                                                         write_com(0x03);
  413.                                                                         delay(50);   
  414.                                                                         write_com(0x99);
  415.                                                                         hzkdis("*****     ");
  416.                                                                         Delay10ms(10);
  417.                                                                         write_com(0x03);
  418.                                                                         delay(50);   
  419.                                                                         write_com(0x99);
  420.                                                                         hzkdis("****      ");
  421.                                                                         Delay10ms(10);
  422.                                                                         write_com(0x03);
  423.                                                                         delay(50);   
  424.                                                                         write_com(0x99);
  425.                                                                         hzkdis("***       ");
  426.                                                                         Delay10ms(10);
  427.                                                                         write_com(0x03);
  428.                                                                         delay(50);   
  429.                                                                         write_com(0x99);
  430.                                                                   hzkdis("**        ");
  431.                                                                         Delay10ms(10);
  432.                                                                         write_com(0x03);
  433.                                                                         delay(50);   
  434.                                                                         write_com(0x99);
  435.                                                                         hzkdis("*         ");
  436.                                                                         Delay10ms(10);
  437.                                                                         write_com(0x03);
  438.                                                                         delay(50);   
  439.                                                                         write_com(0x99);
  440.                                                                         hzkdis("          ");
  441.                                                                         pwm = 7;
  442.                                                                         Delay10ms(30);

  443.                                                                         TR0 = 0;         //关闭PWM中断  节约电量
  444.                                                                        
  445.                                                                         Test();
  446.                                                                         z = 0;
  447.                                                                        
  448.                                                                 }
  449.                                                                 else
  450.                                                                 {
  451.                                                                 write_com(0x03);
  452.                                                                 delay(50);   
  453.                                                                 write_com(0x99);
  454.                                                                 hzkdis("密码错误");
  455.                                                                
  456. ……………………

  457. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
RC522资料.7z (635.37 KB, 下载次数: 173)

评分

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

查看全部评分

回复

使用道具 举报

ID:105206 发表于 2017-7-31 12:40 | 显示全部楼层
谢谢分享,学习了
回复

使用道具 举报

ID:474464 发表于 2019-4-1 01:03 | 显示全部楼层
      感谢
回复

使用道具 举报

ID:308785 发表于 2019-5-12 10:58 | 显示全部楼层
正在需要此内容啊 ,感谢分享
回复

使用道具 举报

ID:308785 发表于 2019-5-12 10:59 | 显示全部楼层
感谢楼主分享使用
回复

使用道具 举报

ID:675564 发表于 2019-12-27 17:10 | 显示全部楼层
感谢楼主分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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