说明
首先很感谢您对这篇文章的阅读,这是我第一次写博文,写得不好的地方请谅解。文章中如果有侵权的请联系我,我会及时删除,谢谢。
功能描述
本项目是基于STC12C5A60S2单片机的热水卡系统,主要实现刷卡出水。当一张符合类型的卡并且卡内有余额时,系统会检测到并打开开关放水,出水过程中,通过水流量传感器感应出水量并对水卡进行相应的扣款,当卡内余额为0时,出水开关关上,停止出水。同时LCD显示屏上会显示出卡号、卡余额、扣款和出水量。当刷完卡之后把卡片从刷卡器移开之后,系统会通过WiFi把本次操作的余额、扣款、出水等信息发送到手机APP端。
主要材料
一、硬件
- STC12C5A60S2单片机最小系统
- RC522刷卡模块
- ATK-WIFI模块(刷AT指令的固件,教程网上很多)
- LCD12864液晶显示屏
- YF-S201水流量传感器
- 12V的电磁阀
- 5V的光耦继电器模块
- 12V3A的电源适配器(输出的插头为DC005插头)
- 5V的有源蜂鸣器
- USB转DC5.5*2.1mm电源线
- USB转TTL单片机程序下载器
二、软件
- keil5
- 程序串口下载软件(如stc-isp)
- 网络调试助手手机APP
原理图和实物图
部分代码
main.c
#include "main.h"
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
sbit sw = P1^4; //光耦继电器控制引脚
sbit alarm = P3^7; //蜂鸣器控制引脚
/*unsigned char code data1[16] = {0x12,0x34,0x56,0x78,
0xED,0xCB,0xA9,0x87,
0x12,0x34,0x56,0x78,
0x01,0xFE,0x01,0xFE};
//M1卡的某一块写为如下格式,则该块为钱包,可接收扣款和充值命令
//4字节金额(低字节在前)+4字节金额取反+4字节金额+1字节块地址+1字节块地址取反+1字节块地址+1字节块地址取反
*/
unsigned char code data2[4] = {
0x01,0,0,0};//每次扣款金额
unsigned char code DefaultKey[6] = {
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; //卡密码
//待显示的内容
unsigned char xdata Tab2[]={
"卡号: "};
unsigned char xdata Tab3[]={
"余额: 元 "};
unsigned char xdata Tab4[]={
"水流量: ml "};
unsigned char xdata Tab5[]={
"已扣款: 元 "};
unsigned char flags = 0; //水流量标志位
unsigned char num = 0; //余额
unsigned int water = 0; //出水量
unsigned char cost = 0; //已扣款
void InitializeSystem();
unsigned char g_ucTempbuf[20];
void Delay1ms(unsigned int y)
{
unsigned int x;
for( ; y>0; y--)
{
for(x=110; x>0; x--);
}
}
void Uart_send_byte(unsigned char tmp) //发送一个字节
{
SBUF=tmp;
while(!TI);
TI=0;
}
void Uart_send_String(unsigned char *string) //发送一个字符串
{
while(*string)
{
Uart_send_byte(*string)