RFID

/**********************RC522实验开发板例程************************
*  CPU:STC89C52RC
*  晶振:11.0592MHZ
------------------------------------------------*/
#include <reg52.h>
#include <STDIO.H>
#include <string.h>
#include "main.h"
#include "mfrc522.h"
#include "lcd.h"

/**********Key**********/
sbit K1=P1^4;             //切换模式

sbit K2=P1^5;   

sbit K3=P1^6;

sbit K4=P1^7;

sbit K5=P3^5;       //退出键

/***********RC522**************/

unsigned char code data1[16] = {0x12,0x34,0x56,0x78,0xED,0xCB,0xA9,0x87,0x12,0x34,0x56,0x78,0x01,0xFE,0x01,0xFE};
//M1卡的某一块写为如下格式,则该块为钱包,可接收扣款和充值命令

//4字节金额(低字节在前)+4字节金额取反+4字节金额+1字节块地址+1字节块地址取反+1字节块地址+1字节块地址取反 
unsigned char code data2[4]  = {0,0,0,0x01};
unsigned char code DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
unsigned char g_ucTempbuf[20];


void Delay10ms( );   //延时10ms


void delay1(unsigned int z)
{
    unsigned int x,y;
    for(x=z;x>0;x--)
    for(y=110;y>0;y--); 
}  


/*******************************************************************************
* 函 数 名         : main
* 函数功能           : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

void main()
{
     unsigned char status,i,j;
       unsigned int temp;

         int mode=0;

         //LCD1602初始化
       InitLcd1602();
         //初始化系统
     InitializeSystem();
         //复位RC522
     PcdReset();
       //关闭天线
     PcdAntennaOff(); 
         //开启天线
     PcdAntennaOn();

       //LcdShowStr(0,0," Mode: ");

         while(1)
     {   
                status = PcdRequest(PICC_REQALL, g_ucTempbuf);//寻卡
        if (status != MI_OK)
        {    
            InitializeSystem( );
                        PcdReset();
                        PcdAntennaOff(); 
                        PcdAntennaOn(); 
                        continue;
        }else{
                    printf("寻卡成功!");
                }


                printf("\n");
                printf("卡的类型:");
                LcdShowStr(0,0,"Mode:");
        for(i=0;i<2;i++)
                {
                        temp=g_ucTempbuf[i];
                        printf("%X",temp);
                }


        status = PcdAnticoll(g_ucTempbuf);//防冲撞

        if (status != MI_OK)
        {    
                        continue;    
                }


                以下为超级终端打印出的内容

                printf("\n");
                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, 1, DefaultKey, g_ucTempbuf);//验证卡片密码

        if (status != MI_OK)
        {    
                        continue;    
              }

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

        if (status != MI_OK)
        {    
                            continue;    
                }

              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("\n");
                        printf("卡读块:"); //超级终端显示,
                        for(i=0;i<16;i++)
                        {
                            temp=g_ucTempbuf[i];
                            printf("%X",temp);

                        }

                        printf("\n");
                        LED_GREEN = 0;
                        for(i=0;i<250;i++)//先输出一种频率的声音
                        {
                            for(j=0;j<80;j++);
                            Speaker=~Speaker;
                        }
                        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=0xF3;          //波特率为2400bps
    TL1=0xF3;
    TH0=0;
    TL0=0; 
    TR0=1;  
    ET0=1;             //允许T0中断
    TR1=1;             //开启定时器
    TI=1;
    EA=1;               //开启总中断

    ES = 1;
    RI = 1;


}


/*******************************************************************************
* 延时10ms
*******************************************************************************/
void Delay10ms(void)  
{
    unsigned char a,b,c;
    for(c=1;c>0;c--)
        for(b=38;b>0;b--)
            for(a=130;a>0;a--);
}





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值