找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10546|回复: 28
打印 上一主题 下一主题
收起左侧

基于RFID技术的RC522模拟门禁设计 单片机源码与PCB工程分享

  [复制链接]
跳转到指定楼层
楼主
      最近做了个基于51单片机的模拟门禁的DIY小作品。工作原理大致是:当IC卡放在读卡器可以识别的范围内时,读卡器读取信息传给单片机进行处理,如果识别为有效卡则继电器闭合(模拟门锁打开),开门指示灯亮,12864液晶上会进行简单的提示表示刷卡成功等。如果该卡为无效卡则报警指示灯亮,蜂鸣器报警,同时可以通过按键进行时间的设置以及对IC卡进行注册和注销。。。总之自己也是一个小菜鸡,这个小作品也是一个很简单的设计,也没有什么创新的地方,主要是自己独立的找资料,动手DIY的。板子上一个485模块电路,本来打算是想通过MODBUS协议和MCGS进行通信的,最后数据也没有传上去(可以在组态上发命令,但无法把下位机数据传上去),所以这一部分功能搁浅了,希望有大神可以试一下单片机与MCGS的通讯,比如把实时温度显示在MCGS组态界面上。附上完整的PCB和程序

制作出来的实物图如下:


Altium Designer画的单片机RFID模拟门禁系统电路原理图和PCB图如下:(51hei附件中可下载工程文件)


单片机源程序如下:
  1. #include "led.h"
  2. #include "beep.h"
  3. #include "12864.h"
  4. #include "rc522.h"
  5. #include "key.h"
  6. #include "STCEEPROM.h"
  7. #include "DS1302.h"
  8. unsigned char idata RevBuffer[30];
  9. unsigned char Card_Num;                  
  10. unsigned char idata UID[4],Temp[4];
  11. unsigned char Table[3];
  12. unsigned char Num;
  13. uchar DS1302_Table[7]={0};        //读取时间值
  14. unsigned char Count,Countf,Count1,Count2,Count3,Count4,Count5,C_flag;

  15. unsigned char T0RH = 0;  //T0重载值的高字节
  16. unsigned char T0RL = 0;  //T0重载值的低字节
  17. //unsigned char table1[20]= "刷卡成功!\r\n";
  18. void ConfigTimer0(unsigned int ms);

  19. extern void UartDriver();
  20. extern void ConfigUART(unsigned int baud);
  21. extern void UartRxMonitor(unsigned char ms);
  22. extern void UartWrite(unsigned char *buf, unsigned char len);

  23. //void delay_ms(unsigned int t)  
  24. //{  
  25. //    unsigned char a,b;  
  26. //    while(t--)  
  27. //    {  
  28. //      for(b=102;b>0;b--)  
  29. //      for(a=3;a>0;a--);  
  30. //    }  
  31. //}


  32. void iccardcode();
  33. void InitializeSystem();
  34. void Auto_Reader(void);
  35. void Display_LCD2(uchar Dis_Hour,uchar Dis_Min,uchar Dis_Sec);
  36. void Run_DS1302(void);
  37. void main()
  38. {
  39.         
  40.          EA = 1;            //开总中断
  41.    ConfigTimer0(1);   //配置T0定时1ms
  42.    ConfigUART(9600);  //配置波特率为9600

  43.         led_init();
  44.         beep_init();
  45.         InitializeSystem();
  46.         InitLcd12864();
  47.         LcdShowString(8,8,"智能门禁考勤系统");
  48.         
  49.     while(1)
  50. {  

  51.                 //UartDriver();
  52.     iccardcode();
  53.                 Auto_Reader();
  54.     Run_DS1302();
  55.                  if(!KEY1)
  56.                 {
  57.                         delay_10ms(50);
  58.                         if(!KEY1)
  59.                         {
  60.                         DS1302_Table[4]++;
  61.                         Write_DS1302Init(0,0,0,0,DS1302_Table[4],DS1302_Table[5],0);
  62.                         }        
  63.                
  64.                                 
  65.                         
  66.                 }        
  67.                
  68.                
  69.                 if(!KEY2)
  70.                 {
  71.                         delay_10ms(50);
  72.                         if(!KEY2)
  73.                         {
  74.                         DS1302_Table[4]--;
  75.                         Write_DS1302Init(0,0,0,0,DS1302_Table[4],DS1302_Table[5],0);
  76.                         }        
  77.                 }
  78.                
  79.                

  80.                 if(!KEY3)
  81.                 {
  82.                         delay_10ms(50);
  83.                         if(!KEY3)
  84.                         {
  85.                         DS1302_Table[5]++;
  86.                         Write_DS1302Init(0,0,0,0,DS1302_Table[4],DS1302_Table[5],0);
  87.                         }        
  88.                 }                        
  89.          if(!KEY5)
  90.                 {
  91.                         delay_10ms(50);
  92.                         
  93.                 if(!KEY5)
  94.                 {
  95.                         delay_10ms(50);
  96.                         if(!KEY5)
  97.                         {
  98.                                 if(C_flag==2)
  99.                                 {
  100.                                                                                          //0123456789abcdef
  101.                                         LcdShowString(8,32," Register Card! ");


  102.                                 }
  103.                                 if(C_flag==1)
  104.                                 {
  105.                                                                                          //0123456789abcdef
  106.                                         LcdShowString(8,32,"  Clean Card!   ");


  107.                                 }
  108.                                 BEEP=0;delay_10ms(200);BEEP=1;
  109.                                 LcdShowString(8,32,"Please Swipecard");
  110.                                 C_flag =0;
  111.                                 while(!KEY5);
  112.                          }        
  113.                         
  114.                         
  115.                  }
  116.      
  117.    }

  118.   }
  119.          
  120. }



  121. //系统初始化
  122. void InitializeSystem()
  123. {

  124.      PcdReset();
  125.      PcdAntennaOff();
  126.      PcdAntennaOn();  
  127.          M500PcdConfigISOType( 'A' );


  128. }

  129. void Auto_Reader(void)
  130. {
  131.     if(PcdRequest(0x52,Temp)==0)
  132.     {
  133.       if(PcdAnticoll(UID)==0)
  134.       {
  135.                     BEEP=0;delay_10ms(20);BEEP=1;

  136.                         Table[0]=UID[0]/100+0x30;
  137.                         Table[1]=UID[0]/10%10+0x30;
  138.                         Table[2]=UID[0]%10+0x30;
  139.                         //LcdShowString(8,32,"Num:            ");
  140.                         //LcdShowString(8,32,Table);
  141.                         Count =  UID[0];
  142.                         if((Count==Count1)||(Count==Count2)||(Count==Count3)||(Count==Count4)||(Count==Count5))
  143.                         {
  144.               
  145.                                 LcdShowString(8,48,"    刷卡成功!");
  146.                                 Green_LED = 0;
  147.                                 JQZ=0;
  148.                                 UartWrite("刷卡成功,请进入!\r\n\r\n\r\n",20);
  149.                                 delay_10ms(200);
  150.                                 JQZ=1;
  151.                                 Green_LED = 1;
  152.                                 LcdShowString(8,48,"                                                         ");
  153.                                 C_flag=1;
  154.                           
  155.                                 
  156.         
  157.                         }
  158.                         else
  159.                         {
  160.                                 LcdShowString(8,48,"    刷卡失败!");
  161.                                 UartWrite("刷卡失败,请重刷!\r\n\r\n\r\n",20);
  162.                                 RED_LED = 0;
  163.                                 delay_10ms(200);
  164.                                 RED_LED = 1;
  165.                                 LcdShowString(8,48,"                                                         ");
  166.                                 C_flag=2;
  167.                         }
  168.                         delay_10ms(200);
  169.                            LcdShowString(8,32,"Please Swipecard");

  170.                 }
  171.         }
  172. }

  173. void iccardcode()
  174. {            
  175.           unsigned char cmd;
  176.         unsigned char status;

  177.         
  178.         cmd = RevBuffer[0];
  179.         switch(cmd)
  180.          {
  181.                 case 1:     // Halt the card     //终止卡的操作
  182.                         status= PcdHalt();;                        
  183.                         RevBuffer[0]=1;
  184.                         RevBuffer[1]=status;
  185.                         break;                        
  186.                 case 2:     // Request,Anticoll,Select,return CardType(2 bytes)+CardSerialNo(4 bytes)
  187.                                 // 寻卡,防冲突,选择卡    返回卡类型(2 bytes)+ 卡系列号(4 bytes)
  188.                         status= PcdRequest(RevBuffer[1],&RevBuffer[2]);
  189.                         if(status!=0)
  190.                         {
  191.                                 status= PcdRequest(RevBuffer[1],&RevBuffer[2]);
  192.                                 if(status!=0)                                
  193.                                 {
  194.                                         RevBuffer[0]=1;        
  195.                                         RevBuffer[1]=status;
  196.                                         break;
  197.                                 }
  198.                         }  
  199.                         RevBuffer[0]=3;        
  200.                         RevBuffer[1]=status;
  201.                         break;
  202.                         
  203.                 case 3:                         // 防冲突 读卡的系列号 MLastSelectedSnr
  204.                         status = PcdAnticoll(&RevBuffer[2]);
  205.                         if(status!=0)
  206.                         {
  207.                                 RevBuffer[0]=1;        
  208.                                 RevBuffer[1]=status;
  209.                                 break;
  210.                         }
  211.                         //memcpy(MLastSelectedSnr,&RevBuffer[2],4);
  212.                         RevBuffer[0]=5;
  213.                         RevBuffer[1]=status;
  214.                         break;        
  215.                 case 4:                                    // 选择卡 Select Card
  216.                         //status=PcdSelect(MLastSelectedSnr);
  217.                         if(status!=MI_OK)
  218.                         {
  219.                                 RevBuffer[0]=1;        
  220.                                 RevBuffer[1]=status;
  221.                                 break;
  222.                         }
  223.                         RevBuffer[0]=3;
  224.                         RevBuffer[1]=status;                        
  225.                         break;
  226.                 case 5:            // Key loading into the MF RC500's EEPROM
  227.             //status = PcdAuthState(RevBuffer[1], RevBuffer[3], DefaultKey, MLastSelectedSnr);// 校验卡密码
  228.                         RevBuffer[0]=1;
  229.                         RevBuffer[1]=status;                        
  230.                         break;                                                        
  231.                 case 6:
  232.                         RevBuffer[0]=1;
  233.                         RevBuffer[1]=status;                        
  234.                         break;                                
  235.                 case 7:     
  236.                     RevBuffer[0]=1;
  237.                         RevBuffer[1]=status;                        
  238.                         break;
  239.                 case 8:     // Read the mifare card
  240.                             // 读卡
  241.                         status=PcdRead(RevBuffer[1],&RevBuffer[2]);
  242.                         if(status==0)
  243.                         {RevBuffer[0]=17;}
  244.                         else
  245.                         {RevBuffer[0]=1;}
  246.                         RevBuffer[1]=status;                        
  247.                         break;
  248.                 case 9:     // Write the mifare card
  249.                             // 写卡  下载密码
  250.                         status=PcdWrite(RevBuffer[1],&RevBuffer[2]);
  251.                         RevBuffer[0]=1;
  252.                         RevBuffer[1]=status;                        
  253.                         break;
  254.                 case 10:
  255.             PcdValue(RevBuffer[1],RevBuffer[2],&RevBuffer[3]);
  256.                         RevBuffer[0]=1;        
  257.                         RevBuffer[1]=status;
  258.                         break;
  259.                 case 12:    // 参数设置
  260.                     PcdBakValue(RevBuffer[1], RevBuffer[2]);
  261.                         RevBuffer[0]=1;        //contact
  262.                         RevBuffer[1]=0;
  263.                         break;               
  264.         }
  265. }


  266. void Display_LCD2(uchar Dis_Hour,uchar Dis_Min,uchar Dis_Sec)
  267. {
  268.         uchar Dis_Table[8]="18:40:33";
  269.         Dis_Table[0] =' ';
  270.         Dis_Table[1] =' ';
  271.         Dis_Table[2] =' ';
  272.         Dis_Table[3] =' ';
  273.         Dis_Table[4] = Dis_Hour/10+0x30;
  274.         Dis_Table[5] = Dis_Hour%10+0x30;
  275.   Dis_Table[6] =':';
  276.         Dis_Table[7] = Dis_Min/10+0x30;
  277.         Dis_Table[8] = Dis_Min%10+0x30;
  278.   Dis_Table[9]  =':';
  279.         Dis_Table[10] = Dis_Sec/10+0x30;
  280.         Dis_Table[11] = Dis_Sec%10+0x30;

  281.         LcdShowString(8,16,Dis_Table);               
  282. }
  283. /********************************************************************
  284. * 名称 : Run_DS1302(void)
  285. * 功能 : 读出DS1302中的数据,并进行显示
  286. * 输入 : 无
  287. * 输出 : 无
  288. ***********************************************************************/
  289. void Run_DS1302(void)
  290. {
  291.         uchar sec, min, hour, day, month, week, year;

  292.                 v_W1302(0x8f, 0);
  293.                 sec = bcdtodec(uc_R1302(0x81));           //读出DS1302中的秒
  294.                 v_W1302(0x8f, 0);
  295.                 min = bcdtodec(uc_R1302(0x83));           //读出DS1302中的分
  296.                 v_W1302(0x8f, 0);
  297.                 hour = bcdtodec(uc_R1302(0x85));   //读出DS1302中的小时
  298.                 v_W1302(0x8f, 0);
  299.                 day = bcdtodec(uc_R1302(0x87));           //读出DS1302中的日
  300.                 v_W1302(0x8f, 0);
  301.                 month = bcdtodec(uc_R1302(0x89));  //读出DS1302中的月
  302.                 v_W1302(0x8f, 0);
  303.                 week = bcdtodec(uc_R1302(0x8b));  //读出DS1302中的星期
  304.                 v_W1302(0x8f, 0);
  305.                 year = bcdtodec(uc_R1302(0x8d));   //读出DS1302中的年

  306.      DS1302_Table[0]=year;
  307.            DS1302_Table[1]=month;
  308.            DS1302_Table[2]=day;
  309.            DS1302_Table[3]=week;
  310.            DS1302_Table[4]=hour;
  311.            DS1302_Table[5]=min;
  312. ……………………

  313. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
程序V0.2.rar (203.75 KB, 下载次数: 385)
newPCBV0.1.rar (3.36 MB, 下载次数: 162)
MyDesigner.rar (38.17 KB, 下载次数: 196)


评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏15 分享淘帖 顶2 踩
回复

使用道具 举报

沙发
ID:240576 发表于 2018-6-6 16:05 | 只看该作者
可以再发一下程序吗?我这里下载不了,能发邮箱吗?
回复

使用道具 举报

板凳
ID:127220 发表于 2018-6-7 12:01 | 只看该作者
sadjvcsadklvhsd 发表于 2018-6-6 16:05
可以再发一下程序吗?我这里下载不了,能发邮箱吗?

邮箱留下,发给你。
回复

使用道具 举报

地板
ID:135832 发表于 2018-6-15 10:10 | 只看该作者
学习一下下。刚好有用
回复

使用道具 举报

5#
ID:354187 发表于 2018-6-19 11:57 | 只看该作者
979123013@qq.com
求楼主分享一下
回复

使用道具 举报

6#
ID:173447 发表于 2018-6-22 18:06 | 只看该作者
2435520844@qq.com  
跪求楼主分享
回复

使用道具 举报

7#
ID:358027 发表于 2018-6-24 21:37 | 只看该作者
502713768@qq.com
求楼主分享一下
回复

使用道具 举报

8#
ID:34298 发表于 2018-6-25 21:47 | 只看该作者
736085739@qq.com
求楼主分享一下
回复

使用道具 举报

9#
ID:90140 发表于 2018-6-27 09:01 | 只看该作者
谢谢楼主分享..
回复

使用道具 举报

10#
ID:364885 发表于 2018-7-4 15:51 | 只看该作者
楼主还在么,能分享一下程序么
回复

使用道具 举报

11#
ID:364885 发表于 2018-7-4 15:51 | 只看该作者
541436424@qq.com
谢谢楼主分享
回复

使用道具 举报

12#
ID:166645 发表于 2018-7-7 14:58 | 只看该作者
楼主可以加您的QQ请教您几个问题吗,,,我的qq2759147357
回复

使用道具 举报

13#
ID:315259 发表于 2018-12-18 19:43 | 只看该作者
谢谢楼主分享
回复

使用道具 举报

14#
ID:542293 发表于 2019-5-22 19:49 | 只看该作者
终止让我找到了
回复

使用道具 举报

15#
ID:524764 发表于 2019-5-23 11:45 | 只看该作者

1056950891@qq.com
求楼主分享一下
回复

使用道具 举报

16#
ID:555752 发表于 2019-6-5 16:47 | 只看该作者
胡仙森 发表于 2018-6-7 12:01
邮箱留下,发给你。

还在吗,麻烦您给我一下呗   571755661@qq.com
回复

使用道具 举报

17#
ID:588348 发表于 2019-7-24 11:40 | 只看该作者
2842868794@qq.com
跪求楼主分享
回复

使用道具 举报

18#
ID:594482 发表于 2019-8-9 09:56 来自手机 | 只看该作者
248562478@qq.com        求分享,谢谢
回复

使用道具 举报

19#
ID:106121 发表于 2019-9-4 16:55 | 只看该作者
学习一下 顶起来!
回复

使用道具 举报

20#
ID:101339 发表于 2019-9-5 12:49 | 只看该作者
学习一下下。刚好有用
回复

使用道具 举报

21#
ID:336378 发表于 2019-9-10 09:35 | 只看该作者

1178049536@qq.com
跪求楼主分享
回复

使用道具 举报

22#
ID:336378 发表于 2019-9-10 09:39 | 只看该作者
写的好,支持源码共享。资源共师兄习。
回复

使用道具 举报

23#
ID:202097 发表于 2019-10-19 18:51 来自手机 | 只看该作者
1476882017@qq.com      求分享,谢谢
回复

使用道具 举报

24#
ID:599674 发表于 2019-10-28 15:57 | 只看该作者
183295202@qq.com   感谢楼主
回复

使用道具 举报

25#
ID:648497 发表于 2019-11-24 17:18 | 只看该作者
1934447196@qq.com
楼楼分享一下,谢谢
回复

使用道具 举报

26#
ID:679122 发表于 2020-1-4 00:32 | 只看该作者
你好,可以给我发一下吗?
203385918@qq.com
回复

使用道具 举报

27#
ID:715507 发表于 2020-4-6 12:02 | 只看该作者
楼主,独立按键没反应呢,怎么回事呀?独立按键一定要加上拉电阻吗?
回复

使用道具 举报

28#
ID:723403 发表于 2020-4-6 14:52 | 只看该作者
好东西!!!!
回复

使用道具 举报

29#
ID:784145 发表于 2020-6-29 20:54 | 只看该作者
PCB图有好多不对。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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