基于RC522的非接触式IC卡读卡器设计(含程序) 下载本文

内容发布更新时间 : 2024/12/24 4:02:00星期一 下面是文章的全部内容请认真阅读。

中北大学2016届毕业设计说明书

附图3 读卡器系统原理图

第 41 页 共 61 页

中北大学2016届毕业设计说明书

附录B 程序

#include #include #include #include \#include \#include \#include \#include \

const INT8U DefaultKeyABuf[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; INT8U FromCardRevBuf[16] = { 0 }; //定义从卡发送过来的信息,即RC522从卡中读取信息(存储信息)

INT8U const tangliankai[16] = {

0x74, 0x61, 0x6e, 0x67, 0x6c, 0x69, 0x61,0x6e,0x6b,0x61,

0x69, 0x00, 0x00, 0x00, 0x00, 0x00, };

//0xff,0x07,0x80,0x69为控制字,所有数据块,均可读可写可修改 //每一数据块都有4种控制模式可以供选择,可以有多种控制模式并存 //也可以所有模式都被禁止

INT8U bPass = 1; bWarn = 0; //bpass 上电操作成功 //操作成功,声音 void main(void) {

if((PCON&0x10)==0) //如果上电复位标志位POF位=0 {

PCON=PCON|0x10; //将POF位置1

IAP_CONTR=0x60; //软复位,从ISP监控区启动 } else {

PCON=PCON&0xef; //将POF位清零 }

init_all(); while(1) {

ctrl_process(); } }

void init_all(void) {

EA = 0;

第 42 页 共 61 页

中北大学2016届毕业设计说明书

init_uart(); init_rc522(); init_par();

// EA = 1;//串口发送使用查询发送。 }

void init_uart(void) {

SCON = 0x50;//工作方式1,禁止串行接收 ES=1;//打开接收中断

TMOD = 0x21;//定时器工作方式2 TH1 = 0xFD; TL1 = 0xFD;

TR1 = 1; // 启动定时器 }

//串口发送程序

void send_byte( INT8U SendData ) {

ES = 0; TI = 0;

SBUF = SendData;

while( TI == 0 );//发送结束后,TI=1 TI = 0;//软件复位 ES = 1;//打开接收中断 }

void send_bytes( INT8U *Buf, INT8U Len ) {

while( Len-- ) {

send_byte( *Buf++ ); } }

/////////////////////////////////////////////////////////////////// //RC522初始化

/////////////////////////////////////////////////////////////////// void init_rc522(void) {

PcdReset();

PcdAntennaOff();

M500PcdConfigISOType( 'A' ); PcdAntennaOn(); }

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

第 43 页 共 61 页

中北大学2016届毕业设计说明书

//功 能:复位RC522 //返 回: 成功返回MI_OK

///////////////////////////////////////////////////////////////////// char PcdReset(void) {

SET_RC522RST; delay_us(10); CLR_RC522RST; delay_us(10); SET_RC522RST; delay_us(10);

Write_Reg_RC(CommandReg,PCD_RESETPHASE);//复位命令 delay_us(10); return MI_OK; }

///////////////////////////////////////////////////////////////////// //关闭天线

///////////////////////////////////////////////////////////////////// void PcdAntennaOff(void) {

ClearBitMask(TxControlReg, 0x03); }

///////////////////////////////////////////////////////////////////// //开启天线

//每次启动或关闭天险发射之间应至少有1ms的间隔

///////////////////////////////////////////////////////////////////// void PcdAntennaOn(void) {

unsigned char i;

i = Read_Reg_RC(TxControlReg); if (!(i & 0x03)) {

SetBitMask(TxControlReg, 0x03); } }

////////////////////////////////////////////////////////////////////// //设置RC522的工作方式

////////////////////////////////////////////////////////////////////// char M500PcdConfigISOType(unsigned char type) {

if (type == 'A') //ISO14443_A {

ClearBitMask(Status2Reg,0x08);//清与卡认证成功位

第 44 页 共 61 页

中北大学2016届毕业设计说明书

Write_Reg_RC(ModeReg,0x3D);//为PCD发送器的开启做准备,sigin高电平有效,CRC预设值6363

Write_Reg_RC(RxSelReg,0x86);//84 选择UART输入,定义帧保护时间 Write_Reg_RC(RFCfgReg,0x7F); //接收器信号电压的增益因子48dB //Timer: TPrescaler*TreloadVal/6.78MHz = 24ms Write_Reg_RC(TReloadRegL,30);//tmoLength);// TReloadVal = 'h6a =tmoLength(dec)

Write_Reg_RC(TReloadRegH,0);

Write_Reg_RC(TModeReg,0x8D); delay_us(1000); }

else{ return -1; } return MI_OK; }

void init_par( void ) {

BEEP_OFF; }

//模式选择程序

void ctrl_process( void ) {

board_process(); if( bPass ) {

bPass = 0; pass(); }

if( bWarn ) {

bWarn = 0; warn(); } }

void pass( void ) {

BEEP_ON;

delay_ms(1500); BEEP_OFF; }

//操作故障,声音 void warn(void) {

INT8U i;

自动启动定时器,减计数, 第 45 页 共 61 页

//