AT89S8252单片机实现接触式IC卡读写控制的设计

从上高中开始,我们学校用的餐卡就为接触式的ic卡,在校园里还分布着很多的ic卡电话,上大学以后学校使用的校园一卡通,为非接触式是射频式ic卡,因此对ic卡有了兴趣,在学习单片机的过程中,了解到单片机可以实现ic卡的读写控制,在参考有关资料的基础上,学习的利用单片机实现接触式的ic卡读写控制。
主要器件:
1、 at89s8252单片机芯片,此芯片具有spi接口,可以用来读写ic卡芯片。
2、 使用与spi接口兼容的串行数据接口的ic卡芯片at45d041a,支持在系统重编程,可用于数字语音、图像和数据的存储。
试验流程图:
试验电路图:
试验程序代码:
//icrdwr.h程序
#ifndef _icrdwr_h // 防止icrdwr.h被重复引用
#define _icrdwr_h
#include // 重要的头文件引用
#define uchar unsigned char
#define uint unsigned int
/* 指令宏定义 */
#define buffer_1_write 0x84 // buffer1写指令代码
#define b1_to_mm_page_no_era 0x88 // 无在线擦除的buffer1写主内存页指令代码
#define mm_page_read 0xd2 // 主内存页读指令代码
#define stat_reg_read 0xd7 // 状态寄存器读指令代码
#define data_in_max_len 8
#define data_out_max_len 8
uint page_start_addr; // 页中起始字节地址
uint page_addr; // 页地址,16位中低9位为有效位
uint buf_start_addr; // buffer中起始字节地址,16位中低11位为有效位
uchar data_in[data_in_max_len]; // 要写入ic卡的数据
uchar data_out[data_out_max_len]; // 要从ic卡中读出的数据
#endif
//icrdwr.c程序
#include “icrdwr.h”
/* 延时t毫秒 */
void delay(uint t)
{
uint i;
while(t--)
{
/* 对于11.0592m时钟,约延时1ms */
for (i=0;i《125;i++)
{}
}
}
/* 获取需要存入ic卡数据的函数*/
void getdata()
{
// 此函数简化如下:
uchar i;
for (i=0;i《8;i++)
data_in[i]=i+1;
}
/* 写单片机at89s8252的spdr寄存器,数据通过spi口串行输出给ic卡芯片 */
void write_spi(uchar dat)
{
spdr = dat;
while (!(spsr & 0x80)) ; // 等待一次传输完成
}
/* 获取ic卡芯片状态函数 */
uchar ic_stat(void)
{
p1_1 = 0; // 使能ic卡芯片;/cs=0
write_spi(stat_reg_read); // 写入读ic卡芯片状态指令
write_spi(0x00); // 写无关比特
p1_1 = 1; // 禁用ic卡芯片;/cs=1
return spdr; // 返回ic卡芯片状态字节
}
/* 写ic卡芯片函数:将数据写入buffer,如果buffer满,
则将buffer中数据写入主内存页 */
void write_to_ic(uchar dat)
{
uchar stat;
/* 检查ic卡芯片是否忙 */
stat = ic_stat();
while ((stat&0x80)==0x00);
/* 数据写入buffer */
p1_1 = 0; // 使能ic卡芯片;/cs=0
write_spi(buffer_1_write); // buffer1写指令代码
write_spi(0x00); // 写入8位无关位
write_spi((uchar)(buf_start_addr》》8)); // 写入7位无关位加上9位buffer起始字节地址的第1位
write_spi((uchar)buf_start_addr); // 写入9位buffer起始字节地址的后8位
write_spi(dat); // 写入数据
p1_1 = 1; // 禁用ic卡芯片;结束buffer write指令
buf_start_addr++; // 下一buffer起始字节地址
/* 如果buffer写满,则将buffer中数据写入主内存页 */
if (buf_start_addr 》 263)
{
buf_start_addr = 0; // buffer起始字节地址重置0
if (page_addr 《 2047) // 如果主内存页不满
{
/* buffer数据写入主内存页 */
p1_1 = 0; // 使能ic卡芯片;/cs=0
write_spi(b1_to_mm_page_no_era); // 写入无在线擦除的buffer1写主内存页指令代码
write_spi((uchar)(page_addr》》7)); // 写入4位保留位加上11位页地址的高4位
write_spi((uchar)(page_addr《《1)); // 写入11位页地址的低7位和1位无关位
write_spi(0x00); // 再写入8位无关位
p1_1 = 1; // 禁用ic卡芯片;结束无在线擦除的buffer写主内存页指令
page_addr++; // 下一页地址
}
}
}
/* 读ic卡芯片函数,如果一页读完,则读取下一页 */
uchar read_from_ic()
{
uchar stat;
uchar tmp;
/* 检查ic卡芯片是否忙 */
stat = ic_stat();
while ((stat&0x80)==0x00);
/* 从主内存页中读出数据 */
p1_1 = 0; // 使能ic卡芯片;/cs=0
write_spi(mm_page_read) ; // 写入主内存页读指令代码
tmp = (uchar)(page_addr》》7);
write_spi(tmp); // 写入4位保留位加上11位页地址的高4位
tmp = (uchar)(page_addr《《1)|((uchar)(page_start_addr》》8)&0x01);
write_spi(tmp); // 写入11位页地址的低7位和9位页起始字节地址的最高位
tmp = (uchar)(page_start_addr);
write_spi(tmp); // 写入9位页起始字节地址的低8位
write_spi(0x00) ; // 写入8位无关位
write_spi(0x00) ; // 写入8位无关位
write_spi(0x00) ; // 写入8位无关位
write_spi(0x00) ; // 再写入8位无关位,共写入32位无关位
write_spi(0xff) ; // 写入8位无意义值以确保完成一字节数据的读出
p1_1 = 1; // 禁用ic卡芯片;结束主内存页读指令
page_start_addr++; // 下一页中起始字节地址
/* 如果读完一页,则读取下一页 */
if (page_start_addr 》 263)
{
page_start_addr = 0; // 页起始字节地址重置0
if (page_addr 《 2047) // 如果主内存页没有读完
page_addr++; // 下一页地址
}
return spdr; // 返回读出数据
}
接上篇程序:
/* 主函数 */
void main()
{
uchar i;
p1_0 = 1; // /rst引脚置高
/* spie=0,spe=1,dord=0,mstr=1,cpol=cpha=1,spr1=0,spr0=1*/
spcr=0x5d;
buf_start_addr = 0;
page_start_addr = 0;
page_addr = 0;
/* 获取需要写入ic卡的数据,存放在data_in[]中 */
getdata();
/* 将data_in[]中存放数据写入ic卡 */
for (i=0;i
{
write_to_ic(data_in[i]);
delay(2); // 延时2ms
}
delay(10); // 延时10ms
buf_start_addr = 0;
page_start_addr = 0;
page_addr = 0;
/* 数据读出ic卡,存放在data_out[]中 */
for (i=0;i
{
data_out[i] = read_from_ic();
delay(2); // 延时2ms
}
while(1);
}

新能源电动汽车充电站及云平台发展趋势探讨
LED串并联优缺点比较
电动工具巨头对锂电池的选择变向
什么是预训练AI模型?
不得不佩服德国超强的自动化科技
AT89S8252单片机实现接触式IC卡读写控制的设计
关于智能制造发展的五个阶段
织物顶破强力仪基本参数特点的介绍
基于现场4G LTE网络的新LTE多服务网关
紫光展锐基于AiP的5G毫米波终端重要部分完成
100天搞定机器学习:day54 聚类系列:层次聚类原理及案例
清大科越:开发智能虚拟电厂助力我国碳减排
基于AT89C51单片机的用电故障控制系统的实现
无纸化办公时代即将到来,开启工作现代化新征程
台积电代工最新消息:台积电详细代工价曝光
计算机网络的这些基础知识你知道吗
德州仪器车用感测器(车用液压阀)解决方案
如何提高PLC应用系统的可靠性
为电源选择正确的工作频率
便携式气象站价格多少?市场前景如何?