找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3085|回复: 13
收起左侧

单片机+rc522写卡问题求助

[复制链接]
ID:717676 发表于 2020-4-6 19:04 | 显示全部楼层 |阅读模式
/**********************RC522实验开发板例程************************
*  CPU:STC89C52RC
*  晶振:11.0592MHZ

******************************************************************/
//实验目的:
/*-----------------------------------------------
  名称:MF RC522
  内容:通过标准程序静态显示字符
  引脚定义如下:
sbit     MF522_NSS  = P1^7;                        //SDA
sbit     MF522_SCK  = P1^6;
sbit     MF522_SI   = P1^5;
sbit     MF522_SO   = P1^4;
sbit     MF522_RST  = P1^3;                  
//蜂鸣器OR指示灯
sbit     LED_GREEN  =    P2^3;
------------------------------------------------*/
#include "lpcreg.h"
#include "main.h"
#include "mfrc522.h"
#include   <STDIO.H>
#include <string.h>
unsigned char code data1[16] = {0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
unsigned char code data4[16] = {0x01,0x02,0x03,0x04,0x05,0x06,0xff,0x07,0x80,0x69,0xff,0xff,0xff,0xff,0xff,0xff};


unsigned char code data2[4]  = {0,0,0,0x01};
unsigned char code DefaultKey[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
unsigned char code DefaultKey2[6] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06};

unsigned char g_ucTempbuf[20];                        
void delay1(unsigned int z)
{
        unsigned int x,y;
        for(x=z;x>0;x--)
        for(y=110;y>0;y--);        
}  


void main( )
{   
     unsigned char status,i;
          unsigned int temp;
     InitializeSystem( );
     PcdReset();
     PcdAntennaOff();
     PcdAntennaOn();
     while ( 1 )
     {   


         status = PcdRequest(PICC_REQALL, g_ucTempbuf);//寻卡
         if (status != MI_OK)
         {   
              InitializeSystem( );
     PcdReset();
     PcdAntennaOff();
     PcdAntennaOn();
                          continue;
         }
                             
                //        printf("卡的类型:");
        //    for(i=0;i<2;i++)
                //                        {
                //                                temp=g_ucTempbuf[ i];
                //                                printf("%X",temp);
                                                
                //                        }
                        
         status = PcdAnticoll(g_ucTempbuf);//防冲撞
         if (status != MI_OK)
         {    continue;    }


                                        ////////以下为超级终端打印出的内容////////////////////////
                                
                        /*                printf("卡序列号:");        //超级终端显示,
                                        for(i=0;i<4;i++)
                                        {
                                                temp=g_ucTempbuf[ i];
                                                printf("%X",temp);
                                                
                                        }         */

                                        ///////////////////////////////////////////////////////////

         status = PcdSelect(g_ucTempbuf);//选定卡片
         if (status != MI_OK)
         {    continue;    }      
         status = PcdAuthState(PICC_AUTHENT1A, 04, DefaultKey, g_ucTempbuf);//验证卡片密码
         if (status != MI_OK)
         {    continue;    }

                 status = PcdWrite(04, data1);//写块
                 status = PcdWrite(07, data4);//写密码块

        
                 status = PcdAuthState(PICC_AUTHENT1A, 08, DefaultKey, g_ucTempbuf);//验证卡片密码

               
                 status = PcdWrite(10, data1);//写块
                 status = PcdWrite(11, data4);//写密码块
/////以上是写空白卡的操作,下面是改写卡的操作,空白卡扇区密码是DefaultKey为FFFFFFFFFFFF可以顺利写入 ,但已经更改密码的卡程序不往下运行了,请大神帮忙改一下.让它既可以写空白卡也可以对写过的卡进行写卡。///
                 status = PcdAuthState(PICC_AUTHENT1A, 04, DefaultKey2, g_ucTempbuf);//验证卡片密码
         if (status != MI_OK)
         {    continue;    }

                 status = PcdWrite(04, data1);//写块
               

        
                 status = PcdAuthState(PICC_AUTHENT1A, 10, DefaultKey2, g_ucTempbuf);//验证卡片密码

               
                 status = PcdWrite(10, data1);//写块
        

if (status != MI_OK)
         {   continue;    }
                  LED_GREEN = 0;
                delay1(1000);
                LED_GREEN = 1;
                delay1(1000);

                 
                 
        /*        // {}
while(1)
                {
         status = PcdRequest(PICC_REQALL, g_ucTempbuf);//寻卡
         if (status != MI_OK)
         {   
                  InitializeSystem( );
     PcdReset();
     PcdAntennaOff();
     PcdAntennaOn();
                          continue;
         }
                 status = PcdAnticoll(g_ucTempbuf);//防冲撞
         if (status != MI_OK)
         {    continue;    }
                status = PcdSelect(g_ucTempbuf);//选定卡片
         if (status != MI_OK)
         {    continue;    }

         status = PcdAuthState(PICC_AUTHENT1A, 1, DefaultKey, g_ucTempbuf);//验证卡片密码
         if (status != MI_OK)
         {    continue;    }


         status = PcdValue(PICC_DECREMENT,1,data2);//扣款
         if (status != MI_OK)
         {    continue;    }
                 
         status = PcdBakValue(1, 2);//块备份
         if (status != MI_OK)
         {    continue;    }

         status = PcdRead(2, g_ucTempbuf);//读块
         if (status != MI_OK)
         {    continue;    }
                printf("卡读块:");        //超级终端显示,
         for(i=0;i<16;i++)
                                        {
                                                temp=g_ucTempbuf[ i];
                                                printf("%X",temp);
                                                
                                        }

                 printf("\n");
                LED_GREEN = 0;
                delay1(100);
                LED_GREEN = 1;
                delay1(100);
                LED_GREEN = 0;
                delay1(200);
                LED_GREEN = 1;                                                         
                 PcdHalt();
                }          */
    }  
}


/////////////////////////////////////////////////////////////////////
//系统初始化
/////////////////////////////////////////////////////////////////////
void InitializeSystem()
{
        P0M1 = 0x0; P0M2 = 0x0;
        P1M1 = 0x0;        P1M2 = 0x0;                     
        P3M1 = 0x0; P3M2 = 0xFF;
        P0 = 0xFF; P1 = 0xFF; P3 = 0xFF;P2 = 0xFF;

         TMOD=0x21;                   //设T0为方式1,GATE=1;
        SCON=0x50;
        TH1=0xFa;          //波特率为4800bps
        TL1=0xFa;
        TH0=0;
        TL0=0;
        TR0=1;  
        ET0=1;             //允许T0中断
        TR1=1;                           //开启定时器
        TI=1;
        EA=1;                                   //开启总中断
        
        ES = 1;
        RI = 1;

}
回复

使用道具 举报

ID:487821 发表于 2020-4-6 23:59 | 显示全部楼层
刚完成一个IC项目,今天太晚了,喝酒没认真看你的原码,你也没具体问题,有啥具体问题可以私聊我,
回复

使用道具 举报

ID:174087 发表于 2020-4-7 09:52 | 显示全部楼层
更改密码的时候不要修改中间的控制码,控制码的作用是确定该扇区读写权限的,如果修改了控制码可能造成无法扇区读写的现象,建议检查密码A和密码B中间的控制码是否更改了
回复

使用道具 举报

ID:717676 发表于 2020-4-8 21:02 | 显示全部楼层
中间的扇区控制位没有被更改
回复

使用道具 举报

ID:742308 发表于 2020-5-3 17:01 | 显示全部楼层
你好请问怎么看控制码有没有被更改,我的写密码写不进去,PcdWrite返回错误码,不知道哪里的问题 研究了好久 请问有大神能指教我一下吗
回复

使用道具 举报

ID:742308 发表于 2020-5-3 17:02 | 显示全部楼层
faguiq 发表于 2020-4-6 23:59
刚完成一个IC项目,今天太晚了,喝酒没认真看你的原码,你也没具体问题,有啥具体问题可以私聊我,

你好 有联系方式吗 我在验证完密码后写密码 写不进去 返回错误码
回复

使用道具 举报

ID:487821 发表于 2020-6-6 09:26 | 显示全部楼层
莫小豪 发表于 2020-5-3 17:02
你好 有联系方式吗 我在验证完密码后写密码 写不进去 返回错误码

还没弄好吗
回复

使用道具 举报

ID:377247 发表于 2020-6-14 17:10 | 显示全部楼层
莫小豪 发表于 2020-5-3 17:02
你好 有联系方式吗 我在验证完密码后写密码 写不进去 返回错误码

验证完密码,把密码所在的16字节读出来,只修改密码A,再写密码能成功的,你试试。
回复

使用道具 举报

ID:782538 发表于 2020-6-18 09:21 | 显示全部楼层
你好,可以试试密码所在的16字节读出来,只修改密码A,再写密码看看能否成功,我以前也遇到这样的情况

回复

使用道具 举报

ID:611988 发表于 2020-8-5 22:18 | 显示全部楼层
感谢前辈们,上位机读卡程序软件有吗
回复

使用道具 举报

ID:611988 发表于 2020-8-5 22:19 | 显示全部楼层
下位机M1卡读完一次 就失效。咋弄 求思路 感谢
回复

使用道具 举报

ID:568565 发表于 2020-8-6 10:02 | 显示全部楼层
好技术致用 发表于 2020-8-5 22:18
感谢前辈们,上位机读卡程序软件有吗

这是我之前用的一个上位机,波特率9600 上位机应用程序.7z (8.54 MB, 下载次数: 31)
回复

使用道具 举报

ID:268191 发表于 2020-8-13 15:22 | 显示全部楼层
chenyinhu 发表于 2020-8-6 10:02
这是我之前用的一个上位机,波特率9600

感谢,我最近也在研究,我们单位酒店公寓的门禁卡系统
回复

使用道具 举报

ID:429003 发表于 2020-8-13 15:58 | 显示全部楼层
好技术致用 发表于 2020-8-5 22:19
下位机M1卡读完一次 就失效。咋弄 求思路 感谢

卡里面做个标记,或者计数! 读完就修改标记或者计数,下次读时检查标记或计数!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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