链接:https://pan.baidu.com/s/1jpk8cm5qicebwcp43mgPZA
提取码:gadz
硬件设计
原理图:
程序设计
#include<reg52.h> //
#include<stdio.h>
#include <intrins.h>
#include "delay.h"
#include "rc522.h"
#include "1602.h"
#include "eeprom.h"
sbit key1 =P1^0; //引脚定义
sbit key2 =P1^1;
sbit key3 =P1^2;
sbit key4 =P1^3;
/********************/
unsigned char cardId[4]={0xD6,0x5F,0x2A,0x79}; //该出修改有效卡ID号
/********************/
unsigned char UID[5]; //暂存卡号
unsigned char Temp[4] ; //中间变量
unsigned long time_20ms; //定时计数
xdata char dis0[16]; //显示数组变量
xdata char dis1[25]; //显示数组变量
bit disFlag; //显示更新标志
unsigned char timelater =0; //时间延时计数
unsigned char readCardFlag = 0; //读卡状态
unsigned int SetNum = 10;//扣费金额
bit rekey =0;//防止重复按下
unsigned char yuE = 100;//余额
void Init_Timer0(void);
void uartSendStr(unsigned char *s,unsigned char length);
void UART_Init(void);
void uartSendByte(unsigned char dat);
unsigned char initFlagData; //初始化数据存读取
/******************把数据保存到单片机内部eepom中******************/
void write_eeprom()
{
SectorErase(0x2000); //擦除整个扇区 注意整个扇区数据都擦出了
byte_write(0x2001, yuE);
byte_write(0x2055, initFlagData);
}
/******************把数据从单片机内部eepom中读出来*****************/
void read_eeprom()
{
yuE = byte_read(0x2001); //读取高字节
initFlagData = byte_read(0x2055); //数据初始化读取
}
/**************开机初始化保存的数据*****************/
void init_eeprom()
{
read_eeprom(); //先读
if(initFlagData != 0x55) //新的单片机初始单片机内问eeprom 如果不是0x55重新写入
{
yuE = 100;
initFlagData = 0x55; //修改值
write_eeprom(); //保存数据
}
}
void main (void)
{
Init_Timer0(); //定时器0初始化
UART_Init();
LCD_Init(); //初始化液晶
DelayMs(20); //延时有助于稳定
LCD_Clear();
init_eeprom();
uartSendStr("ready ok!",9);
PcdReset();//复位RC522
PcdAntennaOn();//开启天线发射
while (1) //主循环
{
if(PcdRequest(0x52,Temp)==MI_OK)
{
if(PcdAnticoll(UID)==MI_OK)
{
// uartSendByte(0x00);
// uartSendStr(UID,4);//上报卡号
// uartSendByte(0x00);
}
}
if(disFlag == 1) //定时更新显示
{
if(readCardFlag == 1) //有效卡
{
LCD_Write_String(0,0,"S:YouXiaoIDCZ:10");//显示
}
else if(readCardFlag == 2) //无效卡
{
LCD_Write_String(0,0,"S:WuXiaoID CZ:10");//显示
}
else //无卡
{
LCD_Write_String(0,0,"S:NoID CZ:10");//显示
}
}
if((key1==0)||(key2==0)||(key3==0)||(key4==0)) //检测到按键按下
{
if(rekey == 0)//防止重复按下
{
DelayMs(20);
if(key1==0)//按键按下
{
rekey =1;
if(readCardFlag == 1) //有效卡
{
if(yuE <= 190) //防止过充 最高充值200元
{
yuE = yuE + 10 ;//充值10元
sprintf(dis1,"CZ:10 NowYuE:%03d \r\n ",(unsigned int)yuE);
uartSendStr(dis1,20);//发送数据
}
}
}
else if(key2==0)//按键按下
{
rekey =1;
if(SetNum>1) //值--
{SetNum =SetNum-1;}
}
write_eeprom(); //保存数据
}
}
else
{rekey =0 ;} //防止重复按下
}
}
.
.