非接触式IC读卡程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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 进入等待模式
}
}