开发前的准备:
霍尔水流量传感器一块(红色接5V黑色接GND黄色是数据传接口)
#include <REGX52.H>//头文件
#include "LCD1602.H"//1602显示的头文件
#include "Buzzer.h"//蜂鸣器的头文件
#define uchar unsigned char //宏定义
#define uint unsigned int //宏定义
#define stand 40 //设置报警值(可调根据自己需求调)
uint flag;//设置标志位
sbit led=P2^0;
sbit K1=P3^1;//定义按键Key1引脚
float Q,F,num;//Q为流量,单位L/min;F为频率,单位HZ
//毫秒级延时函数
void delay(uint z)
{
uint x,y;
for(x = z; x > 0; x--)
for(y = 114; y > 0 ; y--);
}
uint read()//得到计数器0当前脉冲次数函数
{
uint tl,th1,th2;//读两次高位,两次高位一样说明没有低位进位,读数更加精确。
uint value;//设置存储值value
while(1)
{
th1=TH0;//定时器置高位赋值给th1
tl=TL0;//定时器置低位赋值给t1
th2=TH0;//定时器置高位赋值给th2
if(th1==th2)//判断如果两个高位相等就结束
break;
}
value=th1*256+tl;//把定时器高位转为二进制+上低位
return value;//返回val的值
}
void buzzer()//蜂鸣器报警
{
Buzzer_Time(100);
}
void timer0()//定时器函数
{
TMOD=0x15;//定时器计数器工作方式配置
TH0=0;//高位
TL0=0;//低位
TH1=(65536-45872)/256;//确定高位
TL1=(65536-45872)%256;//确定低位
EA=1;//开总中断
ET0=1;//中断允许
ET1=1;
TR0=1;//运行控制位
TR1=1;
}
void KeyPro()//按键函数
{
static uint a;//静态变量a标志位
if(K1==0)//如果k1按下
{
delay(20);//按时20ms
if(K1==0)//再一次判断
{
a++;//标志位+1
if(a%2==0)//标注位对二求余等于0
{
flag=1;//flag就等于1
}
else//否则就flag等于0
{
flag=0;
}
}
}
}
void main()//主函数
{
LCD_Init();//初始化
timer0();//定时器初始化
while(1)//死循环
{
KeyPro();//按键函数
LCD_ShowNum(1,2,Q,4);//lcd1602显示函数
LCD_ShowString(1,6,"ML");//lcd1602显示函数 字符串
if(stand <= Q)//判断预设值和报警值
{
if(flag==1)//标注位等于1的话蜂鸣器就报警
{
buzzer();//蜂鸣器报警
}
}
}
}
void T0_time()interrupt 1//中段函数1
{
TH0=0;
TL0=0;
}
void T1_time()interrupt 2//中断3
{
TH1=(65536-45872)/256;//50毫秒
TL1=(65536-45872)%256;
num++;
if(num==5) //1s更新一次数据,送至数码管显示
{
num=0;
F=read();//每隔1s读一次计数器0,该值则为频率。计算出Q后立马把计数器0清零重新计数。
if(F>0)
{
Q=(F+3)/8.1*100; //流量传感器经验公式根据这个公式计算水流量
TH0=0;
TL0=0;
}
else
{
Q=0;//如果不加这句,当F=0,由公式知道Q!=0。
TH0=0;
TL0=0;
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。