找回密码
 立即注册

QQ登录

只需一步,快速开始

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

stc15w408as和rfid-rc522如何进行刷卡 求思路

[复制链接]
跳转到指定楼层
楼主
ID:708209 发表于 2020-4-5 17:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
80黑币
各位大佬 最近在做个刷卡功能的单片机,用的时stc15w408as,然后根据rc-522给的51单片机代码,改了下管脚定义,但是在上位机上却寻不到卡,有没有大佬能帮我看下怎么改才能正常工作

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

使用道具 举报

沙发
ID:708209 发表于 2020-4-5 17:38 | 只看该作者
这是我的代码
#include "reg52.h"
#include "main.h"
#include "mfrc522.h"       
#include <string.h>
//M1卡的某一块写为如下格式,则该块为钱包,可接收扣款和充值命令
//4字节金额(低字节在前)+4字节金额取反+4字节金额+1字节块地址+1字节块地址取反+1字节块地址+1字节块地址取反
unsigned char code data2[4]  = {0x12,0,0,0};
unsigned char code DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
unsigned char g_ucTempbuf[20];   
unsigned char idata MLastSelectedSnr[4];
unsigned char idata RevBuffer[30];  
unsigned char data SerBuffer[20];
bit CmdValid;                           

void iccardcode()
{             
          unsigned char cmd;
        unsigned char status;
       
        cmd = RevBuffer[0];
        switch(cmd)
        {
                case 1:     // Halt the card     //终止卡的操作
                        status= PcdHalt();;                       
                        RevBuffer[0]=1;
                        RevBuffer[1]=status;
                        break;                       
                case 2:     // Request,Anticoll,Select,return CardType(2 bytes)+CardSerialNo(4 bytes)
                                // 寻卡,防冲突,选择卡    返回卡类型(2 bytes)+ 卡系列号(4 bytes)
                        status= PcdRequest(RevBuffer[1],&RevBuffer[2]);
                        if(status!=0)
                        {
                                status= PcdRequest(RevBuffer[1],&RevBuffer[2]);
                                if(status!=0)                               
                                {
                                        RevBuffer[0]=1;       
                                        RevBuffer[1]=status;
                                        break;
                                }
                        }  
                        RevBuffer[0]=3;       
                        RevBuffer[1]=status;
                        break;
                       
                case 3:                         // 防冲突 读卡的系列号 MLastSelectedSnr
                        status = PcdAnticoll(&RevBuffer[2]);
                        if(status!=0)
                        {
                                RevBuffer[0]=1;       
                                RevBuffer[1]=status;
                                break;
                        }
                        memcpy(MLastSelectedSnr,&RevBuffer[2],4);
                        RevBuffer[0]=5;
                        RevBuffer[1]=status;
                        break;       
                case 4:                                    // 选择卡 Select Card
                        status=PcdSelect(MLastSelectedSnr);
                        if(status!=MI_OK)
                        {
                                RevBuffer[0]=1;       
                                RevBuffer[1]=status;
                                break;
                        }
                        RevBuffer[0]=3;
                        RevBuffer[1]=status;                       
                        break;
                case 5:            // Key loading into the MF RC500's EEPROM
            status = PcdAuthState(RevBuffer[1], RevBuffer[3], DefaultKey, MLastSelectedSnr);// 校验卡密码
                        RevBuffer[0]=1;
                        RevBuffer[1]=status;                       
                        break;                                                       
                case 6:
                        RevBuffer[0]=1;
                        RevBuffer[1]=status;                       
                        break;                               
                case 7:     
                    RevBuffer[0]=1;
                        RevBuffer[1]=status;                       
                        break;
                case 8:     // Read the mifare card
                            // 读卡
                        status=PcdRead(RevBuffer[1],&RevBuffer[2]);
                        if(status==0)
                        {RevBuffer[0]=17;}
                        else
                        {RevBuffer[0]=1;}
                        RevBuffer[1]=status;                       
                        break;
                case 9:     // Write the mifare card
                            // 写卡  下载密码
                        status=PcdWrite(RevBuffer[1],&RevBuffer[2]);
                        RevBuffer[0]=1;
                        RevBuffer[1]=status;                       
                        break;
                case 10:
            PcdValue(RevBuffer[1],RevBuffer[2],&RevBuffer[3]);
                        RevBuffer[0]=1;       
                        RevBuffer[1]=status;
                        break;
                case 12:    // 参数设置
                    PcdBakValue(RevBuffer[1], RevBuffer[2]);
                        RevBuffer[0]=1;        //contact
                        RevBuffer[1]=0;
                        break;               
        }






        }
/////////////////////////////////////////////////////////////////////
//系统初始化
/////////////////////////////////////////////////////////////////////
void InitializeSystem()
{
    P0 = 0xFF; P1 = 0xFF; P3 = 0xFF;



        ET2 = 0;        
        T2CON = 0x04;               
    PCON = 0x80;               
    SCON = 0x70;                 
    TMOD = 0x21;        //TMOD = 0x22;

        TH1   = BAUD_9600;
        TL1   = TH1;
        TR1   = 1;             // 波特率发生器

        TH0 = 0x60;
    TL0 = 0x60;
    TR0 = 0;
   
    ET0=0;
        ET1=0;
        EA=1;
        EX0=1;
        IT0 = 1;       
        TR2=0;
        ES = 1;   
        CmdValid=0;

     LED_GREEN = 1;
     PcdReset();
     PcdAntennaOff();
     PcdAntennaOn();  
         M500PcdConfigISOType( 'A' );
     LED_GREEN = 0;
         delay_10ms(10);       
     LED_GREEN = 1;
         delay_10ms(10);
     LED_GREEN = 0;
}

/////////////////////////////////////////////////////////////////////
//用T2做延时子程序
/////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////////
// 接收和发送中断
///////////////////////////////////////////////////////////////////////
void isr_UART(void) interrupt 4 using 1
{
    unsigned char len, i;
          unsigned int j=0;
         
          if(RI)
        {               
                len=SBUF;
                RI=0;       
                for(i=0;i<len;i++)
                {
                        while(!RI)
                        {
                                j++;
                                if(j>1000)
                                {
                                    break;
                                }
                        }
                        if(j<1000)
                        {
                                RevBuffer[i]=SBUF;
                                RI=0;
                                j=0;
                        }
                        else
                        {
                            break;
                        }
                }
                if(i==len)
                {
                        REN=0;
                        CmdValid=1;
                }
        }
        else if(!RI && TI)
        {
                TI=0;
                len=RevBuffer[0];
                for(i=0;i<len+1;i++)
                {
                        SBUF=RevBuffer[i];
                        while(!TI);
                        TI=0;                       
                }
                REN=1;
        }
}



  void main( )
{   
    unsigned char baud;
     InitializeSystem( );
    while (1)
    {       
            if (CmdValid)
            {
                    CmdValid = FALSE;
                    if(RevBuffer[0]==11)            //为了加快相应速度 测试风鸣器
                    {
                            RevBuffer[2]=RevBuffer[1];
                              RevBuffer[0]=1;         //contact
                            RevBuffer[1]=0;
                            CALL_isr_UART();               
                LED_GREEN = 1;
                            delay_10ms(RevBuffer[2]);
                LED_GREEN = 0;
                    }
                    else if(RevBuffer[0]==13)   //设置通讯波特率
                    {
                            switch(RevBuffer[1])
                            {
                                    case 0:
                                            baud=BAUD_9600;
                                            break;
                                    case 1:
                                            baud=BAUD_14400;
                                            break;
                                    case 2:
                                            baud=BAUD_19200;
                                            break;
                                    case 3:
                                            baud=BAUD_28800;
                                            break;
                                    case 4:
                                            baud=BAUD_38400;
                                            break;
                                    case 5:
                                            baud=BAUD_57600;
                                            break;
                                    case 6:
                                            baud=BAUD_115200;
                                            break;
                                    default:
                                            baud=BAUD_9600;
                                            break;
                            }                               
                            RevBuffer[0]=1;                //contact
                            RevBuffer[1]=0;
                            CALL_isr_UART();
                            delay_10ms(5);                       
                            TR1   = 0;
                            TH1   = baud;
                            TL1   = TH1;
                            delay_10ms(2);
                            TR1   = TRUE;
                    }

                       else
                    {
                    iccardcode();
                            CALL_isr_UART();
                    }



         }
         }
}

回复

使用道具 举报

板凳
ID:708209 发表于 2020-4-5 17:38 | 只看该作者
本帖最后由 陈慢慢 于 2020-4-5 17:49 编辑

/*  BYTE Registers  */
sfr P0    = 0x80;
sfr P1    = 0x90;
sfr P2    = 0xA0;
sfr P3    = 0xB0;
sfr PSW   = 0xD0;
sfr ACC   = 0xE0;
sfr B     = 0xF0;
sfr SP    = 0x81;
sfr DPL   = 0x82;
sfr DPH   = 0x83;
sfr PCON  = 0x87;
sfr TCON  = 0x88;
sfr TMOD  = 0x89;
sfr TL0   = 0x8A;
sfr TL1   = 0x8B;
sfr TH0   = 0x8C;
sfr TH1   = 0x8D;
sfr IE    = 0xA8;
sfr IP    = 0xB8;
sfr SCON  = 0x98;
sfr SBUF  = 0x99;

/*  8052 Extensions  */
sfr T2CON  = 0xC8;
sfr RCAP2L = 0xCA;
sfr RCAP2H = 0xCB;
sfr TL2    = 0xCC;
sfr TH2    = 0xCD;


/*  BIT Registers  */
/*  PSW  */
sbit CY    = PSW^7;
sbit AC    = PSW^6;
sbit F0    = PSW^5;
sbit RS1   = PSW^4;
sbit RS0   = PSW^3;
sbit OV    = PSW^2;
sbit P     = PSW^0; //8052 only

/*  TCON  */
sbit TF1   = TCON^7;
sbit TR1   = TCON^6;
sbit TF0   = TCON^5;
sbit TR0   = TCON^4;
sbit IE1   = TCON^3;
sbit IT1   = TCON^2;
sbit IE0   = TCON^1;
sbit IT0   = TCON^0;

/*  IE  */
sbit EA    = IE^7;
sbit ET2   = IE^5; //8052 only
sbit ES    = IE^4;
sbit ET1   = IE^3;
sbit EX1   = IE^2;
sbit ET0   = IE^1;
sbit EX0   = IE^0;

/*  IP  */
sbit PT2   = IP^5;
sbit PS    = IP^4;
sbit PT1   = IP^3;
sbit PX1   = IP^2;
sbit PT0   = IP^1;
sbit PX0   = IP^0;

/*  P3  */
sbit RD    = P3^7;
sbit WR    = P3^6;
sbit T1    = P3^5;
sbit T0    = P3^4;
sbit INT1  = P3^3;
sbit INT0  = P3^2;
sbit TXD   = P3^1;
sbit RXD   = P3^0;


sfr P5    =   0xC8;   
sbit P54  =   P5^4;
sbit P55  =   P5^5;

/*  SCON  */
sbit SM0   = SCON^7;
sbit SM1   = SCON^6;
sbit SM2   = SCON^5;
sbit REN   = SCON^4;
sbit TB8   = SCON^3;
sbit RB8   = SCON^2;
sbit TI    = SCON^1;
sbit RI    = SCON^0;

/*  P1  */
sbit T2EX       =   P1^1; // 8052 only
sbit T2         =   P1^0; // 8052 only
            
/*  T2CON  */
sbit TF2        =   T2CON^7;
sbit EXF2       =   T2CON^6;
sbit RCLK       =   T2CON^5;
sbit TCLK       =   T2CON^4;
sbit EXEN2      =   T2CON^3;
sbit TR2        =   T2CON^2;
sbit C_T2       =   T2CON^1;
sbit CP_RL2     =   T2CON^0;

//sbit SPEAKER    =   P1^6;
//sbit RC500RST   =   P3^3;

sfr16   RCAP2LH =   0xCA;
sfr16   T2LH    =   0xCC;
回复

使用道具 举报

地板
ID:708209 发表于 2020-4-5 17:39 | 只看该作者
//////////////////////////////////
//端口定义
/////////////////////////////////////////////////////////////////////
//MFRC522
sbit     MF522_RST  =    P5^4;                   //RC500片选
sbit     MF522_NSS  =    P1^2;
sbit     MF522_SCK  =    P1^5;
sbit     MF522_SI   =    P1^3;
sbit     MF522_SO   =    P1^4;
//指示灯
//指示灯
sbit     LED_GREEN  =    P1^5;     
/////////////////////////////////////////////////////////////////////
//函数原型
/////////////////////////////////////////////////////////////////////
void InitializeSystem();                                   
#define BAUD_115200             256 - (OSC_FREQ/192L)/115200L   // 255
#define BAUD_57600              256 - (OSC_FREQ/192L)/57600L    // 254
#define BAUD_38400              256 - (OSC_FREQ/192L)/38400L    // 253
#define BAUD_28800              256 - (OSC_FREQ/192L)/28800L    // 252
#define BAUD_19200              256 - (OSC_FREQ/192L)/19200L    // 250
#define BAUD_14400              256 - (OSC_FREQ/192L)/14400L    // 248
#define BAUD_9600               256 - (OSC_FREQ/192L)/9600L     // 244                                   
#define OSC_FREQ                22118400L
//#define  OSC_FREQ        7372800L
#define OSC_FREQ          22118400L
#define  RCAP2_50us      65536L - OSC_FREQ/40417L
#define  RCAP2_1ms       65536L - OSC_FREQ/2000L
#define  RCAP2_10ms      65536L - OSC_FREQ/1200L
#define  TIME0_500us     65536L - OSC_FREQ/8000L
#define  TIME0_10ms      65536L - OSC_FREQ/200





#define CALL_isr_UART()         TI = 1
#define TRUE 1
#define FALSE 0
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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