基于单片机的IC卡读写系统
实验目的:
1.学会并掌握可keil软件的使用; 2.学会并掌握protues软件的使用; 3.实现基于单片机的IC卡读写;
4.通过实验巩固单片机相关知识和检验自身动手能力
实验要求:
掌握单片机相关知识,利用单片机控制和射频模块组合来读写IC卡,并实现软硬件的仿真模拟。lC卡读卡器以MCS-51系列单片机作为核心构成,主要用于家庭和机构门锁的开关,具有安全稳定的特点,在识别,删除,添加,自动开锁时,用于对IC卡进行读写操作。
实验设备和仪器:
1.89c51单片机最小系统
2.射频模块RC522,智能IC卡以及其他附加电路
实验内容:
本次实验设计是由小组五个成员共同完成基于单片机的IC卡读写系统并完成实物搭建和撰写实验报告。 方案一:实验步骤:
1.利用protues画电路图,电路图如图1所示:
图1:方案一电路图
2.模拟刷卡后显示,如图二:
图2:方案一实现图
3.根据电路图编写C语言代码: 代码如下:
#include \#include \#include \#include
#include \#include \
#define uchar unsigned char #define uint unsigned int
sbit Speak = P2^7;//蜂鸣器 sbit RED = P3^4; //红色指示灯 sbit GREEN = P3^3;//绿色指示灯 sbit Relay = P3^2; //继电器
sbit KEY1 = P1^3;//小时加按键 sbit KEY2 = P1^4; //小时减按键 sbit KEY3 = P1^5; //分钟加按键 sbit KEY4 = P1^6; //分钟减按键 sbit KEY5 = P1^7; //添加删除卡
sbit KEY = P2^6; //开门
unsigned char idata RevBuffer[30]; unsigned char Card_Num; void iccardcode(); //系统初始化
void InitializeSystem()//IC卡初始化 {
PcdReset(); //IC卡初始化
PcdAntennaOff(); //IC卡初始化 PcdAntennaOn(); //IC卡初始化
M500PcdConfigISOType( 'A' );//IC卡初始化 }
unsigned char idata UID[4],Temp[4];//读取卡号数组 unsigned char Table[3];//显示数组 unsigned char Num; unsigned Count,Countf,Count1,Count2,Count3,Count4,Count5,C_flag;//卡序号void Auto_Reader(void) //自动寻卡 {
if(PcdRequest(0x52,Temp)==0) //找到卡 {
if(PcdAnticoll(UID)==0) {
char Speak=0;delay_10ms(20);Speak=1;//蜂鸣器提示
Table[0]=UID[0]/100+0x30; //卡号显示 Table[1]=UID[0]/10+0x30; //卡号显示 Table[2]=UID[0]+0x30; //卡号显示
LCD1602_Disp_ZF(0x80+0x40,\卡号显示
LCD1602_Disp_ZF(0x84+0x40,Table,3); //卡号显示 Count = UID[0]; //判断卡是不是有效
if((Count==Count1)||(Count==Count2)||(Count==Count3)||(Count==Count4)||(Count==Count5)) {
LCD1602_Disp_ZF(0x88+0x40,\卡有效
GREEN = 0;Relay=0;delay_10ms(200);Relay=1;GREEN = 1; //绿灯亮,打开继电器
C_flag=1; } else {
LCD1602_Disp_ZF(0x88+0x40,\卡无效 RED = 0;delay_10ms(500);RED = 1; //红灯亮 C_flag=2; }
delay_10ms(200); LCD1602_Disp_ZF(0x80+0x40,\Swipecard\显示初始界面
} } }
uchar DS1302_Table[7]={0}; //读取时间值
void Display_LCD2(uchar Dis_Hour,uchar Dis_Min,uchar Dis_Sec)//显示时间值 {
uchar Dis_Table[8]=\
Dis_Table[0] = Dis_Hour/10+0x30; Dis_Table[1] = Dis_Hour+0x30;
Dis_Table[3] = Dis_Min/10+0x30; Dis_Table[4] = Dis_Min+0x30;
Dis_Table[6] = Dis_Sec/10+0x30;
Dis_Table[7] = Dis_Sec+0x30;
LCD1602_Disp_ZF(0x85,Dis_Table,8);//显示时间值 }
void Run_DS1302(void) {
uchar sec, min, hour, day, month, week, year;
v_W1302(0x8f, 0);
sec = bcdtodec(uc_R1302(0x81)); //读出DS1302中的秒 v_W1302(0x8f, 0);
min = bcdtodec(uc_R1302(0x83)); //读出DS1302中的分 v_W1302(0x8f, 0);
hour = bcdtodec(uc_R1302(0x85)); //读出DS1302中的小时 v_W1302(0x8f, 0);
day = bcdtodec(uc_R1302(0x87)); //读出DS1302中的日 v_W1302(0x8f, 0);
month = bcdtodec(uc_R1302(0x89)); //读出DS1302中的月 v_W1302(0x8f, 0);
week = bcdtodec(uc_R1302(0x8b)); //读出DS1302中的星期 v_W1302(0x8f, 0);
year = bcdtodec(uc_R1302(0x8d)); //读出DS1302中的年
DS1302_Table[0]=year; DS1302_Table[1]=month; DS1302_Table[2]=day; DS1302_Table[3]=week; DS1302_Table[4]=hour; DS1302_Table[5]=min; DS1302_Table[6]=sec;
Display_LCD2(DS1302_Table[4],DS1302_Table[5],DS1302_Table[6]);//显示时间值 }
void main(void) {
InitializeSystem(); LCD1602_init();
//Money_1=x24c02_read(0X01); //x24c02_write(0X03,Money_3); LCD1602_Disp_ZF(0x80,\
//0123456789abcdef
LCD1602_Disp_ZF(0x80+0x40,\