标题:
基于MFRC500的读卡程序-带4-3键盘输入和12864液晶
[打印本页]
作者:
chenye1132
时间:
2017-10-3 15:24
标题:
基于MFRC500的读卡程序-带4-3键盘输入和12864液晶
基于MFRC500射频芯片和51单片机的13.56MHzRFID射频识别系统的读写程序。
0.png
(54.21 KB, 下载次数: 100)
下载附件
2017-10-3 16:20 上传
单片机源程序如下:
/****************************************************************************
* File: MAIN.C *
* Version: 饭卡打卡系统简化版1.0 *
* Created: 2007.11.30 *
* Last Change: 2008.5.15 *
* Author: *
* QQ: *
* EMail: *
* Compiler: KEIL C51 uVision2 V2.23 *
* Description: 操作流程:先读卡,等待键盘输入,再写卡 *
* 注意:键盘输入后,卡不能抽走,不然数据流失! *
* 注意:程序共有18个警告,因为有些函数暂时没用到! *
* 注意:暂没小数显示,由于以后考虑用以太网通讯,故没加进UATR通讯*
* 留言:谢谢Hexing的帮助,如果大家对程序有什么意见可以随时找我 *
****************************************************************************/
#include "main.h"
#include "m500a.h"
#include "PORT.h"
#include "delay.h"
#include "LCD_Key.h"
/*************************公有变量定义**********************************************/
bit KEY_SCAN_G; //键盘扫描标志
bit W_CARD_SCAN_G; //写卡扫描标志
tWord Card_Money; //最大值这里只取9999,显示4位数金额
tByte LCD_Money[5]; //卡中金额显示缓冲区
tByte LCD_Key[6]=" "; //初始化按键显示缓冲区,保证数组最后字节存有结束符'\0'
tByte temp; //临时变量
tByte tt1[2]; //存放卡类型号
tByte Snr_RC500[4]; //存放rc500序列号
tByte AbsoluteBlock = 8; //对绝对块8进行操作, 取值范围为 0 <= AbsoluteBlock < 64
tByte data cardserialno[4]; //存放卡号
tByte idata blockdata[16]; //绝对块8数据缓冲区,注意其储存模式 idata
/************************私有函数原型**************************************************/
void MCU_Init(void); //单片机初始化函数
void BEEP_Ctrl(void); //蜂鸣器控制函数
tByte MF_Active(tByte AbsoluteBlock,tByte data *cardserialno); //卡激活函数
tByte MF_Read (tByte AbsoluteBlock,tByte idata *blockdata); //读卡函数
tByte MF_Write (tByte AbsoluteBlock,tByte idata *blockdata); //写卡函数
tByte data RC500_Disp[13];
void hex_ten(unsigned char *RC500_St);
/*****************************************************************************************
函数名称:主函数
函数输入:
函数输出:
函数功能:
******************************************************************************************/
void main (void)
{
/*************************硬件初始化**********************************************/
MCU_Init();
M500PCD_Init();
KEYPAD_Init();
LCD_Init();
LCD_China_Disp();
BEEP_Ctrl(); //声音提示1,所有初始化完成,等待读卡
/*************************大循环执行**********************************************/
while(1)
{
temp=MF_Active( AbsoluteBlock,cardserialno); //激活一张卡
if(temp!=MI_OK)
{
continue; //跳到 while 入口
}
temp=MF_Read(AbsoluteBlock,blockdata); //读卡数据
if(temp!=MI_OK)
{
continue;
}
BEEP_Ctrl();
hex_ten(cardserialno); //声音提示2,读卡成功,等待键盘扫描
put_char(4,30,RC500_Disp);
/*************************按键扫描循环**********************************************/
KEY_SCAN_G=1; //允许键盘扫描
while(KEY_SCAN_G)
{
Card_Money=blockdata[0]+blockdata[1]*256; //合并绝对块8前两字节
LCD_Money[0]=Card_Money/1000+48; //装载千位数据
LCD_Money[1]=Card_Money%1000/100+48; //百位
LCD_Money[2]=Card_Money%1000%100/10+48; //十位
LCD_Money[3]=Card_Money%1000%100%10+48; //个位
LCD_Money[4]='\0'; //结束符
LCD_KEY_Update(); //键盘和LCD刷新
delay_nms(30); //每隔30毫秒扫描一次键盘
}
/*************************写入卡循环**********************************************/
W_CARD_SCAN_G=1; //允许写卡扫描
while(W_CARD_SCAN_G)
{
blockdata[0]=Card_Money%256; //分解回字节数据,准备写回到绝对块8
blockdata[1]=Card_Money/256;
temp=MF_Active( AbsoluteBlock,cardserialno); //激活同一张卡
if(temp!=MI_OK)
{
continue;
}
temp=MF_Write(AbsoluteBlock,blockdata); //写数据入卡
if(temp!=MI_OK)
{
continue;
}
W_CARD_SCAN_G=0; //清循环标志,跳出while循环
BEEP_Ctrl();
put_char(4,30," ");//声音提示3,表示写卡完成,用户可以取走卡
delay_nms(1000);
} //注意:声音提示后的1秒延迟期间,必须拿走卡,否则体统重新读卡
}
}
/*————————————————————————————————————————————main函数结束———————————————————————————————————————*/
/*****************************************************************************************
函数名称:tByte MF_Active 激活卡函数
函数输入:tByte AbsoluteBlock,tByte data *cardserialno
函数输出:
函数功能:激活A类卡类型
******************************************************************************************/
tByte MF_Active(tByte AbsoluteBlock,tByte data *cardserialno)
{
tByte status1;
tByte *sak1;
/*********************寻卡***************************/
status1 = M500PiccRequest(PICC_REQALL, tt1);
if (status1!=MI_OK)
{
return(FM1715_REQERR);
}
/********************防碰撞**************************/
status1=M500PiccAnticoll(0,cardserialno);
if (status1!=MI_OK)
{
return(FM1715_REQERR);
}
/*********************选择卡*************************/
status1=M500PiccSelect(cardserialno,sak1);
if (status1!=MI_OK)
{
return(FM1715_REQERR);
}
/*************************授权********************************/
status1 = M500PiccAuth(PICC_AUTHENT1A, cardserialno, 1, AbsoluteBlock);
if (status1!=MI_OK) //对第八块(绝对地址)进行授权, 也就是第三个扇区第一块
{
return(FM1715_REQERR);
}
return MI_OK;
}
/*****************************************************************************************
函数名称:tByte MF_Read 读卡函数
函数输入:tByte AbsoluteBlock,tByte idata *blockdata
函数输出:
函数功能:读取射频卡的数据
******************************************************************************************/
tByte MF_Read(tByte AbsoluteBlock,tByte idata *blockdata)
{
tByte status1;
status1=M500PiccRead(AbsoluteBlock, blockdata);
if (status1!=MI_OK)
{
return(FM1715_REQERR);
}
return MI_OK;
}
/*****************************************************************************************
函数名称:tByte MF_Write 写卡函数
函数输入:tByte AbsoluteBlock,tByte idata *blockdata
函数输出:
函数功能:写入射频卡数据
******************************************************************************************/
tByte MF_Write(tByte AbsoluteBlock,tByte idata *blockdata)
{
tByte status1;
status1 = M500PiccWrite(AbsoluteBlock,blockdata);
if (status1!=MI_OK)
{
return(FM1715_REQERR);
}
return MI_OK;
}
/*****************************************************************************************
函数名称:MCU_Init函数
函数输入:
函数输出:
函数功能:初始化RC500
******************************************************************************************/
void MCU_Init(void)
{
RC500RST = FALSE;
RC500_CS = TRUE; // Enable the CS for RC500
IT0 = 1; // Config ext0 as edge trigger for RC500
EX0 = 1; // Enable ext0 interrupt for RC500
EA = TRUE; // Enable all interrupts
}
/*****************************************************************************************
函数名称:BEEP_Ctrl (void) 蜂鸣器驱动初始化
函数输入:
函数输出:
函数功能:有源蜂鸣器
******************************************************************************************/
void BEEP_Ctrl (void)
{
BEEP = OFF;
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
基于MFRC500读卡芯片的读卡程序-带4-3键盘输入和12864液晶.zip
(244.28 KB, 下载次数: 42)
2017-10-3 15:22 上传
点击文件名下载附件
13.56MHz
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1