本设计包括两个终端,包括负责水卡充值(可选择金额)的充值终端和每次刷卡扣费两元的付费终端。制作成品时建议两个终端做在一块板子上,用跳帽切换两个51单片机的电源。
主控芯片51单片机
射频模块RC522
射频卡M1卡S50
以下是付费终端的程序
#include "reg52.h"
#include "main.h"
#include "mfrc522.h"
#include
#include
#include
unsigned char code data1[16] = {0x00,0x00,0x00,0x00,0xff,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x01,0xFE,0x01,0xFE};
//M1卡的某一块写为如下格式,则该块为钱包,可接收扣款和充值命令
//4字节金额(低字节在前)+4字节金额取反+4字节金额+1字节块地址+1字节块地址取反+1字节块地址+1字节块地址取反
unsigned char data2[4] = {0x00,0x00,0x00,0x00};//存值减值金额
unsigned char code DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; //密码
unsigned char TYPE_DATA[2]; //类型
unsigned char ID_DATA[4]; //ID地址
unsigned char value_DATA[4]; //卡里面的值
unsigned char g_ucTempbuf[20]; //卡号
unsigned char code dis0[] = {"S50"};
unsigned char code dis1[] = {"S70"};
unsigned char code dis2[] = {"X"};
unsigned char code dis3[] = {"44"};
unsigned char code dis4[] = {"ID:"};
unsigned char code dis5[] = {"RMB:"};
unsigned char code dis6[] = {"0123456789ABCDEF"};
unsigned int tt=0,a=2,b,falg_pro; //falg_pro声音提示标志
void main( )
{
unsigned char status;
InitializeSystem( ); //初始化
PcdReset(); //复位RC522
PcdAntennaOff(); //关闭天线
PcdAntennaOn(); //开启天线
data2[1]=a/256;
data2[0]=a%256;
while ( 1 )
{
status = PcdRequest(PICC_REQALL, g_ucTempbuf); //返回卡片类型#define PICC_REQIDL 0x26 寻天线区内未进入休眠状态
if(status!= MI_OK) //读不到卡,显示清0;
{
TYPE_DATA[0]=0;
TYPE_DATA[1]=0;
ID_DATA[0]=0;
ID_DATA[1]=0;
ID_DATA[2]=0;
ID_DATA[3]=0;
value_DATA[0]=0;
value_DATA[1]=0;
value_DATA[2]=0;
value_DATA[3]=0;
falg_pro=0;
b=0;
}
if (status == MI_OK)
{
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();
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』