用AT89C51设计IC卡读写器
1
拍明芯城
基于AT89C51的IC卡读写器详细设计
一、引言
在当今数字化快速发展的时代,IC卡凭借其安全性高、存储容量大、使用便捷等显著优势,在众多领域得到了极为广泛的应用。公交系统中,乘客手持公交IC卡轻松乘车,无需准备零钱,大大提高了出行效率;校园一卡通系统里,学生凭借一张IC卡就能完成身份识别、食堂消费、图书馆借阅等多项操作,为校园生活带来了极大的便利;企业门禁系统中,IC卡作为员工身份识别的重要凭证,有效保障了企业的安全。而要实现IC卡的各种功能,IC卡读写器则是不可或缺的关键设备。

AT89C51作为一款经典的8位微控制器,具有稳定性高、成本低、易于开发等诸多优点,非常适合用于设计IC卡读写器。本文将详细介绍基于AT89C51的IC卡读写器的设计过程,包括硬件设计和软件设计,并对关键元器件的选型、作用及选择原因进行深入分析。
二、IC卡读写器总体设计概述
基于AT89C51的IC卡读写器主要由硬件和软件两部分组成。硬件部分负责与IC卡进行物理连接和数据传输,为整个系统提供物理支撑;软件部分则负责控制硬件工作、处理数据以及实现各种应用功能,是系统的核心逻辑部分。
当IC卡插入读写器后,读写器首先会通过特定模块向IC卡发送复位信号,唤醒IC卡,使其进入可通信状态。然后,根据不同的应用需求,读写器会与IC卡进行数据交互。例如,在读取IC卡中的用户信息、余额等数据时,读写器会向IC卡发送读取指令,IC卡接收到指令后,会将相应的数据返回给读写器;而当要向IC卡写入数据时,读写器则会发送写入指令,并将需要写入的数据传输给IC卡。
三、硬件设计
3.1 AT89C51单片机
AT89C51是整个IC卡读写器的核心控制部件,它基于Intel 8051架构,内置了4K字节的可编程只读存储器(Flash)和128字节的随机存取存储器(RAM)。这款单片机具有8位CPU,能够满足大多数简单控制系统的需求。其4K字节的Flash存储器可用于存储程序代码,使得程序可以方便地进行在线编程和修改;128字节的RAM则用于临时存储数据,为数据处理提供了必要的空间。
选择AT89C51作为核心控制器,主要基于以下几方面原因。首先,它具有较高的稳定性和可靠性,经过多年的市场验证,在各种嵌入式系统中表现出色,能够保证IC卡读写器长期稳定运行。其次,AT89C51的开发资源丰富,有大量的开发工具和资料可供参考,开发人员可以快速上手进行开发,大大缩短了开发周期。此外,其成本相对较低,能够有效降低整个IC卡读写器的制造成本,提高产品的市场竞争力。
3.2 电源电路
电源电路为整个IC卡读写器提供稳定的工作电压,是系统正常运行的基础。一般采用直流电源,将市电通过整流、滤波、稳压等电路处理后,得到适合单片机及其他芯片工作的电压值,常见的为5V电压。
在电源电路中,选用7805线性稳压器。7805是一种常用的三端稳压集成电路,能够将输入电压稳定在5V输出。它具有输出电压稳定、纹波小、负载调整率好等优点,能够为AT89C51单片机及其他外围电路提供稳定的电源。同时,为了进一步提高电源的稳定性,在电源电路中还加入了电容进行滤波。其中,10μF的电解电容用于滤除低频噪声,0.1μF的陶瓷电容用于滤除高频噪声,有效减少了电源中的干扰信号,确保了系统的稳定运行。
3.3 复位电路
复位电路确保单片机在上电或遇到异常情况时能够重置并重新开始运行,是保证系统可靠性的重要环节。复位过程需要一个短暂的高电平信号,通常通过上拉电阻和电容的组合来实现上电复位。电容的充电和放电时间决定了复位信号的持续时间。
在复位电路中,选用1kΩ的上拉电阻和10μF的电解电容。当系统上电时,电容开始充电,在充电初期,电容两端的电压较低,复位引脚处于高电平状态,使单片机进行复位操作。随着电容的充电,其两端电压逐渐升高,当达到一定值时,复位引脚变为低电平,单片机结束复位,开始正常工作。这种复位电路结构简单,成本低,能够可靠地实现单片机的复位功能。
3.4 时钟电路
时钟电路为CPU和外围设备提供时钟信号,是整个系统同步工作的关键。AT89C51可以工作在两种模式下:外部晶振模式和内部振荡模式。在外部晶振模式下,需要外接晶振和两个负载电容。
本设计选用11.0592MHz的晶振,这是因为其便于生成标准的波特率,用于串口通信。在许多与上位机通信的应用中,需要使用串口进行数据传输,而标准的波特率能够保证数据的准确传输。同时,选用30pF的负载电容与晶振一起确定振荡频率。负载电容的大小会影响晶振的振荡频率和稳定性,经过实验验证,30pF的负载电容能够与11.0592MHz的晶振良好匹配,提供稳定可靠的时钟信号,确保单片机及整个系统的正常工作。
3.5 IC卡接口电路
IC卡接口电路用于实现读写器与IC卡之间的通信,是IC卡读写器的关键部分。它通常包括复位电路、数据传输线路等。复位电路确保在每次操作前,IC卡处于正确的初始状态;数据传输线路则用于准确地传输读写器与IC卡之间的数据。
对于接触式IC卡,如SLE4442卡,其接口电路需要符合国际标准化组织(ISO)7816的标准。在接口电路中,需要设计合适的插卡检测电路,以检测IC卡是否插入。可以通过在卡座上设置一对常开触点,将其中一个触点与Vcc连接,另一个触点与AT89C51的引脚连接,平时该引脚通过一个电阻连接到地,当有卡插入时,触点短接,Vcc将引脚上拉到高电平,通过对该引脚上的电平查询就可以知道是否有卡插入。同时,还需要设计数据传输线路,将IC卡的数据引脚与单片机的相应I/O口连接,实现数据的双向传输。
3.6 显示电路
显示电路用于向用户展示读写器的工作状态、IC卡的相关信息等,方便用户操作和了解系统情况。可以采用液晶显示屏(LCD),如LCD1602液晶显示屏。LCD1602是一种专门用于显示字母、数字、符号等的点阵型液晶模块,它由很多的点阵字符位组成,每个点阵字符位都可以表示一个字符。内置了显示数据RAM,将需要显示的字符置于此,即可在显示屏上显示相应内容。
在硬件连接上,AT89C51的P0口直接与LCD1602的数据总线DB0 - DB7相连,用于传输显示数据;P2口的0、1、3、5、6引脚分别和LCD1602的/CSB、/CSA、E、R/W、D/I相连,在单片机程序执行过程中,对这些引脚作相应的控制,即可实现对LCD1602的显示控制。例如,通过编程可实现对液晶显示屏的任意位置的显示、滚动显示和反显等功能,能够清晰地向用户展示IC卡的余额、交易记录等信息。
3.7 按键电路
按键电路为用户提供操作接口,用户可以通过按下不同的按键,实现对读写器的各种功能控制,如启动读卡、写入数据、查询信息等。按键电路一般通过单片机的I/O口与按键相连,当按键按下时,会产生电平变化,单片机检测到该变化后执行相应的操作。
在按键电路设计中,可以采用独立按键的方式,每个按键连接到一个单独的I/O口。这种方式电路简单,编程容易实现。例如,设置三个按键,分别用于读卡、写卡和查询功能。当按下读卡按键时,对应的I/O口电平发生变化,单片机检测到该变化后,执行读卡操作,从IC卡中读取数据并显示在LCD上;当按下写卡按键时,单片机执行写卡操作,将预设的数据写入IC卡;当按下查询按键时,单片机查询IC卡的相关信息并显示。
3.8 通信电路
通信电路用于实现读写器与上位机之间的通信,当需要将IC卡的数据上传到上位机或接收上位机的指令时,就需要通过通信电路进行数据传输。常用的通信接口是RS232串行接口,可直接接到PC机的COM1或COM2上。
由于PC机串口通常采用RS - 232电平,而单片机串口是TTL电平,二者不兼容,所以接口必须做电平转换处理。本设计采用MAX232芯片进行电平转换。MAX232是一种常用的电平转换芯片,能够将TTL电平转换为RS - 232电平,反之亦然。AT89C51单片机TXD端连接到MAX232的T1IN端,用于发送数据;PC机的RD端连接到MAX232的T1OUT端,用于接收数据;AT89C51单片机RXD端连接到MAX232的R1OUT端,用于接收数据;PC机的TD端连接到MAX232的R1IN端,用于发送数据。通过这种连接方式,实现了单片机与PC机之间的可靠通信。
四、软件设计
4.1 主程序
主程序是整个软件的核心框架,它首先对单片机及各个模块进行初始化设置,包括设置I/O口的工作模式、初始化定时器、初始化串口等。然后进入一个循环,不断检测按键状态。当检测到有按键按下时,根据按键对应的功能,调用相应的子程序进行处理。
以下是一个简单的主程序框架示例:
#include <reg51.h>
#include <intrins.h>
// 函数声明
void Init_System();
void Key_Scan();
void Read_Card();
void Write_Card();
void Query_Info();
void main() {
Init_System(); // 系统初始化
while(1) {
Key_Scan(); // 按键扫描
}
}
void Init_System() {
// 初始化I/O口
// 初始化定时器
// 初始化串口
// 其他初始化操作
}
void Key_Scan() {
// 检测按键状态
// 根据按键状态调用相应子程序
if(/* 读卡按键按下 */) {
Read_Card();
}
else if(/* 写卡按键按下 */) {
Write_Card();
}
else if(/* 查询按键按下 */) {
Query_Info();
}
}
void Read_Card() {
// 读卡操作具体实现
}
void Write_Card() {
// 写卡操作具体实现
}
void Query_Info() {
// 查询操作具体实现
}
4.2 IC卡读写子程序
IC卡读写子程序负责实现与IC卡的数据交互。在这个子程序中,首先要按照IC卡的通信协议,向IC卡发送正确的指令。例如读取IC卡数据时,要发送读取指令,并等待IC卡返回数据。当接收到IC卡返回的数据后,要对数据进行校验和处理,确保数据的准确性。如果数据校验通过,就将数据存储到单片机的内存中,或者进行进一步的处理,如显示在显示屏上、上传到上位机等。
以下是一个简单的IC卡读取数据子程序示例(以接触式IC卡为例):
#include <reg51.h>
#include <intrins.h>
// 函数声明
void Init_System();
void Key_Scan();
void Read_Card();
void Write_Card();
void Query_Info();
void main() {
Init_System(); // 系统初始化
while(1) {
Key_Scan(); // 按键扫描
}
}
void Init_System() {
// 初始化I/O口
// 初始化定时器
// 初始化串口
// 其他初始化操作
}
void Key_Scan() {
// 检测按键状态
// 根据按键状态调用相应子程序
if(/* 读卡按键按下 */) {
Read_Card();
}
else if(/* 写卡按键按下 */) {
Write_Card();
}
else if(/* 查询按键按下 */) {
Query_Info();
}
}
void Read_Card() {
// 读卡操作具体实现
}
void Write_Card() {
// 写卡操作具体实现
}
void Query_Info() {
// 查询操作具体实现
}
4.3 数据处理子程序
数据处理子程序用于对从IC卡读取的数据进行加工和分析。例如,如果读取的是公交IC卡的余额数据,数据处理子程序可以将余额数据进行格式化处理,然后显示在显示屏上;如果是校园一卡通的消费记录数据,数据处理子程序可以对消费记录进行分类统计,如按日期统计消费次数、消费金额等,并将统计结果进行显示或存储。
以下是一个简单的数据处理子程序示例,用于统计消费金额:
void Process_Consumption_Data(unsigned char *data, unsigned char length) {
unsigned int total = 0;
unsigned char i;
for(i = 0; i < length; i++) {
total += data[i]; // 假设数据为消费金额的字节数组
}
// 将总金额显示在LCD上或其他处理
}
4.4 通信子程序
通信子程序用于实现读写器与上位机之间的通信。当需要将IC卡的数据上传到上位机时,通信子程序会将数据按照规定的通信协议进行打包,通过串口或其他通信接口发送给上位机。同时,它也会接收上位机发送的指令,根据指令内容执行相应的操作,如更新IC卡数据等。
以下是一个简单的串口通信发送数据子程序示例:
#include <reg51.h>
void UART_Send_Byte(unsigned char dat) {
SBUF = dat;
while(!TI);
TI = 0;
}
void UART_Send_String(unsigned char *str) {
while(*str != '

产品分类