基于51单片机的水流量传感器测试系统

目录

  热水器上水报警器


 

一、实验目的

1. 了解水流量传感器工作原理

2. 学会使用水流量传感器检测水流量

3. 会使用八段数码管显示热水器水箱水量百分比

4. 学会使用蜂鸣器发出报警声

 

二、设计项目要求

经常会看到某家属楼外墙排水管水哗哗的流着,原来是某家太阳能热水器上水忘记关阀门了,水白白浪费掉,非常可惜!为解决太阳能热水器上水忘记关阀门问题,请设计一款热水器上水报警器。该报警器通过水流量传感器检测上水的体积,并显示已上水的体积占总体积的百分比(最大值为100),当水上满后,启动蜂鸣器报警提醒用户关闭上水水阀。假设热水器总容量为1升。

三、项目系统连接图

 四、代码实现部分

//数码管显示模块

#include <shumaguan.h>
sbit DX=P2^6;
sbit WX=P2^7;
u8 code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00}; //共阴数码管编码

void Print_u32_LED(u32 n)//输出6位无符号整数(0-999999)到6位数码管,不足6位时,前面不显示
{u8 t=0xdf;
 while(n)
 {	P0=0xff; //消影
	WX=1;//允许更新位码
	P0=t; //送位码
	WX=0;//锁存位码
	   
	P0=0x00; //消影
	DX=1;//允许更新段码
	P0=table[n%10]; //送段码
	DX=0;//锁存段码
	  		 	   
    n=n/10;
	t=_cror_(t,1);
	delay_ms(3);
 }
}
void Print_str_LED(u8 *f)//输出数字串到数码管
{
 u8 t=0xdf,i;
 i=strlen(f);
 while(i)
 {	P0=0xff; //消影
	WX=1;//允许更新位码
	P0=t; //送位码
	WX=0;//锁存位码
	   
	P0=0x00; //消影
	DX=1;//允许更新段码
	switch(f[i-1])
	{
	case '.':i--;P0=table[f[i-1]-'0']|0x80;break;
	case '-':P0=0x40;break;
	case ' ':P0=0x00;break;
	default:P0=table[f[i-1]-'0']; 
	} //送段码
	DX=0;//锁存段码
	  		 	   
    i--;
	t=_cror_(t,1);
	delay_ms(3);
 }
 }

void Print_float_LED(float n,u8 x)//输出小数(有效数字不超过6位)到6位数码管,保留x(0-3)位小数
{
 u8 prtstr[10];
 switch(x)
 {
 case 0:sprintf(prtstr,"%.0f",n);break;
 case 1:sprintf(prtstr,"%.1f",n);break;
 case 2:sprintf(prtstr,"%.2f",n);break;
 case 3:sprintf(prtstr,"%.3f",n);break;
 } 
 Print_str_LED(prtstr);

}
main函数代码实现:

#include <config.h>
#include <shumaguan.h>
sbit beep=P2^3;	//蜂鸣器引脚
u8 print[20];//输出缓冲区
unsigned int num=0;
float current=0.0;
void delay_ms(u16 x)//毫秒延时函数
{
 u16 i;
 u8 j;
 for(i=0;i<x;i++)
    for(j=0;j<115;j++);
}
void delay_us(u8 t) //10倍微秒延时函数,延时10*t微秒
{
 u8 i;
 for(i=0;i<=t;i++);
}

void Alarm(u8 t) //蜂鸣器报警,持续t秒
{
 u8 i,j,k; 	
 for(j=0;j<t;j++)
 { for(i=0;i<200;i++)
      {beep=0;delay_us(50);beep=1;delay_us(50);}
   for(k=0;k<100;k++)
      {beep=0;delay_us(110);beep=1;delay_us(110);}
 }
}

void main()
{
  
  u8 i,j;
 // Init_COM();   //初始化
//	EA=1;
	//IT0=1;
	//EX0=1;
	
 while(1)
 {
	P2=0X00; 
	 Alarm(5);
		// beep=0;
    // if(num>=450) { Alarm(5);}
		//current=100*num/450.0;
		//sprintf(print,"%d",current/1000);
	  //for(i=10;i>0;i--)	  Print_float_LED(current,2);	//输出到数码管

 
 }
}


void EX_INT0() interrupt 0		 /*INT0中断服务程序*/
{
	num++;
	
}

猜你喜欢

转载自blog.csdn.net/qq_37037348/article/details/86560098