一.硬件方案
本设计是以STC89C52单片机为核心,实现IC卡的读写,控制液晶屏幕的显示、电磁阀的开闭,流量计脉冲的提取,同时具有记忆电路,完成水表信号的读、写处理,监控水表工作的功能。
主要由由51单片机(STC89C51/52、AT89C51/52均可兼容)+LCD1602液晶显示屏+电磁阀模块+继电器电路+流量计+蜂鸣器+按键电路+IC卡读写模块构成;如图:
二.设计功能
(1)用水管理功能:当用户刷有效的IC卡时,系统将剩余水量与购买水量相加,并且将余额数值存入到芯片以防丢失;当用户开始用水的时后,系统将剩余水量与使用的水量自动相减,并且存入到芯片以防丢失。
(2)自动供停水功能:当表内剩余水量为0时,自动关闭阀门;购水刷卡后,阀门开启。
(3)流量检测功能:通过流量传感器检测瞬时的水流量。
(4)显示功能:采用LCD显示,可以显示出用水总量、可用剩余水量、瞬时流量、IC卡号、卡内余量等信息。
(5)报警功能:当剩余水量减少到一定量时,声光报警并提示用户购水。
(6)模拟充值功能:为了演示方便,设置了为IC卡充值的功能。
全套资料如下:
三.设计原理图
(1)原理图主要采用AD软件进行设计,如图:
四.软件设计
(1)程序流程图
(2)主程序源码
void main( )
{
unsigned char status;
int0_1_int();
InitializeSystem( );//初始化
PcdReset(); //复位RC522
PcdAntennaOff(); //关闭天线
PcdAntennaOn(); //开启天线
a=eepromRead(0x2000);//从eeprom读
b=eepromRead(0x2001);//从eeprom读
c=eepromRead(0x2002);//从eeprom读
d=eepromRead(0x2003);//wreeprom
if (a==0xff&b==0xff&c==0xff&d==0xff) {
a=0,b=0,c=0,d=0;
eepromEraseSector (0x2000);//擦除eeprom
eepromWrite(0x2000, a);//写入eeprom
eepromWrite(0x2001, b);//写入eeprom
eepromWrite(0x2002, c);//写入eeprom
eepromWrite(0x2003, d);}//写入eeprom
tot=a*256+b;
mon=c*256+d;
eeprominit();
while ( 1 )
{
if(key1==0){dcf=1;dcfzsd=1;fmq=0;kgbj=0;}else{fmq=1;kgbj=1;}//开盖检测到开启时关阀门、报警
if(key4==0){tot=0;mon=0;wreeprom();}
status = PcdRequest(PICC_REQALL, g_ucTempbuf); //返回卡片类型#define PICC_REQIDL 0x26 寻天线区内未进入休眠状态
if (status != MI_OK){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;
card=0;}//读不到卡,显示清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();}//声音提示标志
ID_DATA[0]=g_ucTempbuf[0];
ID_DATA[1]=g_ucTempbuf[1];
ID_DATA[2]=g_ucTempbuf[2];
ID_DATA[3]=g_ucTempbuf[3];
//
if (key2==0 ){init_k();pro();}//初始化卡
if (key2!=0 & mon<900 & card>0){writek();}//写卡
readk(); //读卡
PcdHalt();//命令卡片进入休眠状态
}
}
}
if(key3==0){Delay(40);if (mon>0){mon--;tot++;}
wreeprom();}//写入eeprom}
if(mon>0&key1!=0){dcf=0;dcfzsd=0;}else{dcf=1;dcfzsd=1;}//有余额时开阀
if(mon<10){qqbj=0;}else{qqbj=1;}//余额低于10时报警灯亮;
if(mon<10&mon>0){fmq=0;}else{fmq=1;}
if (falg_pro){LCD1206b();}else{LCD1206a();};//显示处理
}
}
全套资料下载链接: