当前位置:首页 > 单片机 > 单片机
[导读]从上高中开始,我们学校用的餐卡就为接触式的IC卡,在校园里还分布着很多的IC卡电话,上大学以后学校使用的校园一卡通,为非接触式是射频式IC卡,因此对IC卡有了兴趣,在学习单片机的过程中,了解到单片机可以实现IC卡的读写控制,在参考有关资料的基础上,学习的利用单片机实现接触式的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);

}

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

单片机是一种嵌入式系统,它是一块集成电路芯片,内部包含了处理器、存储器和输入输出接口等功能。

关键字: 单片机 编写程序 嵌入式

在现代电子技术的快速发展中,单片机以其高度的集成性、稳定性和可靠性,在工业自动化、智能家居、医疗设备、航空航天等诸多领域得到了广泛应用。S32单片机,作为其中的佼佼者,其引脚功能丰富多样,是实现与外部设备通信、控制、数据...

关键字: s32单片机引脚 单片机

在微控制器领域,MSP430与STM32无疑是两颗璀璨的明星。它们各自凭借其独特的技术特点和广泛的应用领域,在市场上占据了重要的位置。本文将深入解析MSP430与STM32之间的区别,探讨它们在不同应用场景下的优势和局限...

关键字: MSP430 STM32 单片机

该系列产品有助于嵌入式设计人员在更广泛的系统中轻松实现USB功能

关键字: 单片机 嵌入式设计 USB

单片机编程语言是程序员与微控制器进行交流的桥梁,它们构成了单片机系统的软件开发基石,决定着如何有效、高效地控制和管理单片机的各项资源。随着微控制器技术的不断发展,针对不同应用场景的需求,形成了丰富多样的编程语言体系。本文...

关键字: 单片机 微控制器

单片机,全称为“单片微型计算机”或“微控制器”(Microcontroller Unit,简称MCU),是一种高度集成化的电子器件,它是现代科技领域的关键组件,尤其在自动化控制、物联网、消费电子、汽车电子、工业控制等领域...

关键字: 单片机 MCU

STM32是由意法半导体公司(STMicroelectronics)推出的基于ARM Cortex-M内核的32位微控制器系列,以其高性能、低功耗、丰富的外设接口和强大的生态系统深受广大嵌入式开发者喜爱。本文将详细介绍S...

关键字: STM32 单片机

在当前的科技浪潮中,单片机作为嵌入式系统的重要组成部分,正以其强大的功能和广泛的应用领域受到越来越多行业的青睐。在众多单片机中,W79E2051以其卓越的性能和稳定的工作特性,成为市场上的明星产品。本文将深入探讨W79E...

关键字: 单片机 w79e2051单片机

单片机,又称为微控制器或微处理器,是现代电子设备中的核心部件之一。它集成了中央处理器、存储器、输入输出接口等电路,通过外部信号引脚与外部设备进行通信,实现对设备的控制和管理。本文将详细介绍单片机的外部信号引脚名称及其功能...

关键字: 单片机 微控制器 中央处理器

随着科技的飞速发展,单片机和嵌入式系统在现代电子设备中的应用越来越广泛。它们不仅提高了设备的智能化水平,还推动了各行各业的创新与发展。在单片机和嵌入式系统的开发中,编程语言的选择至关重要。本文将深入探讨单片机和嵌入式系统...

关键字: 单片机 嵌入式系统 电子设备
关闭
关闭