非接触式IC读卡程序

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

程序采用标准C 语言编制,以PCW C Compiler IDE 编译器为开发环境,以下是部分程序源代码以及子函数说明。该程序代码在PIC16F876 单片机上测试通过。程序将RF 场适时的开启与关闭,大大降低了MCU 与RF 场的功耗,同时减少了在读卡过程中MF RC500 对MCU 的干扰。

unsigned char regread ( unsigned char reg adr ) :读取寄存器地址的值;

void regwrite ( unsigned char reg adr , unsigned char reg value ) :向寄存器中写值;

unsigned char Get PiccUid ( unsigned char uid[ ] ) :读取卡的卡号;

void ReadMcuEeprom ( unsigned char volume[ ] , unsigned char eeprom adr , unsigned char num ) :读取

MCU EEPROM 中eeprom adr 地址的前num 个数据,放入volume 数组中;

void KeyEncryptArithmetic ( unsigned char key[ ] , unsigned char uid[ ] ) :加密算法;

unsigned char LoadKey ( unsigned char uncoded[ ] , unsigned char coded[ ] ) :编码;

void Picc authent ( unsigned char auth mode , unsigned char addr , unsigned char uid[ ] ) :认证操作; void ConfigurationCard ( unsigned char Config block ) :对配置卡的数据进行读值操作;

void UserCard ( ) :对用户卡中的数据进行读写、加值、减值操作。

main ( )

{ unsigned char status ,uid[ 4 ] ,uncoded key[ 6 ] ,coded key[ 12 ] ,D key[ 6 ] ;

disable interrupt s ( GLOBAL ) ; / / 关闭所有中断

mcuinit ( ) ; / / MCU 初始化

setup wdt ( WDT 2304MS ) ; / / 设置看门狗定时器的时间

GetManufacturerKey ( D key ) ; / / 取厂家密码放入D key 数组中

enable interrupt s ( GLOBAL ) ; / / 开启所有中断

while ( 1 )

{restart wdt ( ) ; / / 启动看门狗定时器

regwrite ( RegCont rol , regread ( RegCont rol ) & (~0x20 ) ) ; / / RC500 跳出等待模式

M500PcdRfReset ( 1 ) ; / / 开启RF场

if ( Get PiccUid ( uid ) = = MI OK ) / / 读到卡

{ReadMcuEeprom ( uncoded key , 0xXX , 6 ) ; / / 从MCU EEPROM 中取配制密码KeyEncryptArithmetic ( uncoded key , uid ) ; / / 通过算法得到用户密码

if (LoadKey ( uncoded key , coded key ) = = MI OK )

status = Picc authent ( PICC AU THENT1A , User block , uid ) ;

if (status = = MI OK ) UserCard ( ) ; / / 是用户卡,执行用户卡的操作

else{memcpy ( uncoded key , D key , 6 ) ; / / 把厂家密码放入uncoded key 中

if ( Get PiccUid ( uid ) = = MI OK )

{ if ( LoadKey ( uncoded key , coded key ) = = MI OK )

status = Picc authent ( PICC AU THENT1A , Con block , uid ) ;

if ( status = = MI OK ) ConfigurationCard ( Config block ) ; / / 是配置卡

else FrameOutput ( 4 , uid ) ; / / 不是配置卡输出卡号

}

}

}

M500PcdRfReset ( 0 ) ; / / 关闭RF

regwrite ( RegCont rol , regread ( RegCont rol ) | ( 0x20 ) ) ;/ / RC500 进入等待模式

}

}

相关文档
最新文档