目录
一、实验目的
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++;
}