STC12C5A60S2的RC522驱动

uart.h

  代码如下:

#ifndef __UART_H__
#define __UART_H__

void UART_Init();
void send ( unsigned char d );
void send_str ( unsigned char *dat );
void send_str_len ( unsigned char *dat, unsigned int len );
#endif

uart.c

  代码如下:

#include <STC12C5A.H>
#include "uart.h"

unsigned int count = 0, temp = 0;

void UART_Init() {
   
    EA = 0;
    SCON = 0x50;
    TMOD = 0x20;
    TL1 = 0xfd;
    TH1 = 0xfd;
    TR1 = 1;
    ES = 1;
    AUXR &= 0x7F;
    TMOD &= 0xF0;
    TMOD |= 0x02;
    TL0 = 0xA4;
    TH0 = 0xA4;
    TF0 = 0;
    TR0 = 1;
    ET0 = 1;
    EA = 1;
}

void send ( unsigned char d ) {
    /* 串口1发送一个字节的数据,形参d即为待发送数据 */
    SBUF = d; /* 将数据写入到串口缓冲 */

    while ( !TI ); /* 等待发送完毕 */
}

void send_str ( unsigned char *dat ) {
    /* 串口1发送字符串 */
    while ( *dat ) {
   
        send ( *dat );
        dat++;
    }
}

void send_str_len ( unsigned char *dat, unsigned int len ) {
    /* 串口1发送指定长度的字符串 */
    unsigned char i = 0;

    for ( ; i < len; i++ ) {
   
        send ( dat[i] );
    }
}

void uart() interrupt 4 {
    /* 串口1用来与上位通讯 */
    if ( RI ) {
    /* 收到数据 */
        RI = 0; /* 清中断请求 */
        IE2 |= 0x01;
    } else if ( TI ) {
    /* 发送完一字节数据 */
        TI = 0;
    }

    ES = 1; /* 允许串口中断 */
}

void timer0() interrupt 1 {
   
    if ( count < 20000 ) {
   
        count++;

        if ( count >= 20000 ) {
    /* 每100次花费1秒 */
            count = 0;
        }
    }
}

mfrc522.h

  代码如下:

#ifndef MFC522_H
#define MFC522_H

#include <STC12C5A.H>
/* MFRC522的端口定义 */
sbit MF522_RST = P2 ^ 3; /* RC500片选 */
sbit MF522_SO  = P2 ^ 4;
sbit MF522_NSS = P2 ^ 5; /* SDA */
sbit MF522_SCK = P2 ^ 6;
sbit MF522_SI  = P2 ^ 7;

char PcdReset ( void );
void PcdAntennaOn ( void );
void PcdAntennaOff ( void );
char PcdRequest ( unsigned char req_code, unsigned char *pTagType );
char PcdAnticoll ( unsigned char *pSnr );
char PcdSelect ( unsigned char *pSnr );
char PcdAuthState ( unsigned char auth_mode, unsigned char addr, unsigned char *pKey, unsigned char *pSnr );
char PcdRead ( unsigned char addr, unsigned char *pData );
char PcdWrite ( unsigned char addr, unsigned char *pData );
char PcdValue ( unsigned char dd_mode, unsigned char addr, unsigned char *pValue );
char PcdBakValue ( unsigned char sourceaddr, unsigned char goaladdr );
char PcdHalt ( void );
char PcdComMF522 ( unsigned char Command, unsigned char *pInData, unsigned char InLenByte, 
                   unsigned char *pOutData, unsigned int  *pOutLenBit );
void CalulateCRC ( unsigned char *pIndata, unsigned char len, unsigned char *pOutData );
void WriteRawRC ( unsigned char Address, unsigned char value );
unsigned char ReadRawRC ( unsigned char Address );
void SetBitMask ( unsigned char reg, unsigned char mask );
void ClearBitMask ( unsigned char reg, unsigned char mask );
char M500PcdConfigISOType ( unsigned char type );
void delay_10ms ( unsigned int _10ms );

/* MF522命令字 */
#define PCD_IDLE       0x00 /* 取消当前命令 */
#define PCD_AUTHENT    0x0E /* 验证密钥 */
#define PCD_RECEIVE    0x08 /* 接收数据 */
#define PCD_TRANSMIT   0x04 /* 发送数据 */
#define PCD_TRANSCEIVE 0x0C /* 发送并接收数据 */
#define PCD_RESETPHASE 0x0F /* 复位 */
#define PCD_CALCCRC    0x03 /* CRC计算 */

/* Mifare_One卡片命令字 */
#define PICC_REQIDL    0x26 /* 寻天线区内未进入休眠状态 */
#define PICC_REQALL    0x52 /* 寻天线区内全部卡 */
#define PICC_ANTICOLL1 0x93 /* 防冲撞 */
#define PICC_ANTICOLL2 0x95 /* 防冲撞 */
#define PICC_AUTHENT1A 0x60 /* 验证A密钥 */
#define PICC_AUTHENT1B 0x61 /* 验证B密钥 */
#define PICC_READ      0x30 /* 读块 */
#define PICC_WRITE     0xA0 /* 写块 */
#define PICC_DECREMENT 0xC0 /* 扣款 */
#define PICC_INCREMENT 0xC1 /* 充值 */
#define PICC_RESTORE   0xC2 /* 调块数据到缓冲区 */
#define PICC_TRANSFER  0xB0 /* 保存缓冲区中数据 */
#define PICC_HALT      0x50 /* 休眠 */

#define DEF_FIFO_LENGTH 64 /* MF522的FIFO长度定义 */

/* MF522寄存器定义 */
/* PAGE 0 */
#define RFU00         0x00
#define CommandReg    0x01
#define ComIEnReg     0x02
#define DivlEnReg     0x03
#define ComIrqReg     0x04
#define DivIrqReg     0x05
#define ErrorReg      0x06
#define Status1Reg    0x07
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值