本设计主要采用AT89C52单片机和mcm200模块实现Mifare 1射频卡的识别和卡上信息的采集,RS485通讯接口和单片机控制系统连接来对Mifare非接触式智能射频卡进行相应的读写操作。读卡距离约为25毫米。当卡进入射频天线频带时,卡上的数据将被读取并显示在顶部PC上。读卡器可以在平时独立工作。mcm200读卡模块采用AT89C52单片机和8K字节闪存作为控制器。
对于软件部分,需要读写IC卡的内部信息,并与最高管理计算机进行通信。也就是说,主要通过串行通信程序的设计和调试,无卡时显示时钟,有卡时读取卡上的数据并显示在计算机屏幕上,由读卡程序和编程DS1302执行。
程序如下:
lcd_init() //LCD初始化设定
{
lcd_wcmd(0x38);
Delay(1);
lcd_wcmd(0x0c);
Delay(1);
lcd_wcmd(0x06);
Delay(1);
lcd_wcmd(0x01); //清除LCD的显示内容
Delay(1);
}
LCD1602()
{
lcd_pos(0x03); // 显示ID:
lcd_wdat(dis2[0]);
lcd_wdat(dis2[1]);
lcd_wdat(dis2[2]);
lcd_pos(0x06); // 显示ID号
lcd_wdat(dis5[ID_DATA[0]/16]);
lcd_wdat(dis5[ID_DATA[0]%16]);
lcd_wdat(dis5[ID_DATA[1]/16]);
lcd_wdat(dis5[ID_DATA[1]%16]);
lcd_wdat(dis5[ID_DATA[2]/16]);
lcd_wdat(dis5[ID_DATA[2]%16]);
lcd_wdat(dis5[ID_DATA[3]/16]);
lcd_wdat(dis5[ID_DATA[3]%16]);
lcd_pos(0x40); // 读到卡,请进,WALK UP!
if(falg==1)
{
lcd_wdat(dis3[0]);
lcd_wdat(dis3[1]);
lcd_wdat(dis3[2]);
lcd_wdat(dis3[3]);
lcd_wdat(dis3[4]);
lcd_wdat(dis3[5]);
lcd_wdat(dis3[6]);
lcd_wdat(dis3[7]);
lcd_wdat(dis3[8]);
lcd_wdat(dis3[9]);
lcd_wdat(dis3[10]);
lcd_wdat(dis3[11]);
lcd_wdat(dis3[12]);
lcd_wdat(dis3[13]);
lcd_wdat(dis3[14]);
lcd_wdat(dis3[15]);
}
lcd_pos(0x40); // 没读到卡或者卡没有权限显示,welcome you!!
if(falg==0)
{
lcd_wdat(dis4[0]);
lcd_wdat(dis4[1]);
lcd_wdat(dis4[2]);
lcd_wdat(dis4[3]);
lcd_wdat(dis4[4]);
lcd_wdat(dis4[5]);
lcd_wdat(dis4[6]);
lcd_wdat(dis4[7]);
lcd_wdat(dis4[8]);
lcd_wdat(dis4[9]);
lcd_wdat(dis4[10]);
lcd_wdat(dis4[11]);
lcd_wdat(dis4[12]);
lcd_wdat(dis4[13]);
lcd_wdat(dis4[14]);
lcd_wdat(dis4[15]);
}
}
当系统开始供电时进入工作状态,初始化接着开启天线,当初始化结束后便开始寻找天线范围内的卡片,当有卡刷入时开始选定卡片,输入卡片ID号,接着可以进行对卡片的添加或删除权限的操作。当选择卡片有权限时门打开,当无权限时门不打开。
status = PcdRequest(PICC_REQALL, g_ucTempbuf);
//返回卡片类型#define PICC_REQALL 0x26 寻天线区内所有卡
if(status!= MI_OK) //读不到卡,显示清0;
{
LED=1;
TYPE_DATA[0]=0;
TYPE_DATA[1]=0;
ID_DATA[0]=0;
ID_DATA[1]=0;
ID_DATA[2]=0;
ID_DATA[3]=0;
falg_pro=0;
}
if (status == MI_OK) //读到卡
{
LED=0;
TYPE_DATA[0]=g_ucTempbuf[0];
TYPE_DATA[1]=g_ucTempbuf[1];
status = PcdAnticoll(g_ucTempbuf); //防冲撞 ,返回卡片ID号 4字节
if (status == MI_OK)
{
status = PcdSelect(g_ucTempbuf); //选定卡片 ,输入卡片ID号
if (status == MI_OK)
{
if(falg_pro==0)//声音提示标志
{
falg_pro=1;
pro();
}
ID_DATA[0]=g_ucTempbuf[0];
ID_DATA[1]=g_ucTempbuf[1];
ID_DATA[2]=g_ucTempbuf[2];
ID_DATA[3]=g_ucTempbuf[3];
init_k();//将卡写成门卡,或者清门卡
readk(); //读卡,读字节3的数据判断是否是AA
if(value_DATA[3]==0xaa)//权限正确,标志写1
{
falg=1;//
}
}
}
}
|