单片机技术网|技术阅读
登录|注册

您现在的位置是:单片机技术网 > 技术阅读 > 基于51单片机的IC卡智能水表设计

基于51单片机的IC卡智能水表设计

一.硬件方案

       本设计是以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();};//显示处理
} }

全套资料下载链接: