基于51单片机的流量计制作
程序员文章站
2022-06-08 21:06:47
...
流量计主要应用于检测流体流速,通过检测累计流量可以做到控制流体体积的功能,今天笔者给大家介绍一种基于STC89C52的流量计制作方法,主要能够实现检测实时流速,并在液晶屏上显示出来,累计流量达到限定值后,蜂鸣器产生警报的功能。需要的材料有:BUZZER蜂鸣器,30P无极电容,DC接口(小),10uf极性电容,水流量传感器,2.54间距3芯单排针,LCD1302液晶屏,LED灯,103电位器,9012直插电极管,10K电阻,1K电阻,按键,STC89C52单片机 ,电源开关,晶振,IC座,2.54单排座。
系统硬件框图如下:`
程序执行的大致流程给大家用流程图表示出来了;
下面给大家分享一下笔者使用的源代码:
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<stdio.h>
#include "1602.h"
#include "delay.h"
sbit buzzer=P1^2; //蜂鸣器
sbit key1=P1^1; //按键1
sbit key2=P1^0; //按键2
unsigned long PluNum=0; //检测速度转化来的脉冲量
unsigned long time_ms; //定时器计数
float ShunShi=0; //瞬时流量
float LeiJi=0; //累计流量
float setNum=1.5; //设置流量值
char dis0[16]; //显示更新暂存
char dis1[16]; //显示更新暂存
unsigned char dealFlag=0; //处理速度标志
bit rekey =0; //防止重复
void Init_Timer0(void); //函数声明
/*------------------------------------------------
主函数
------------------------------------------------*/
void main (void)
{
Init_Timer0(); //定时器0初始化
EX0=1; //外部中断0开
IT0=1; //边沿触发
EA=1; //全局中断开
LCD_Init(); //初始化液晶
DelayMs(20); //延时有助于稳定
LCD_Clear(); //清屏
sprintf(dis0,"SH:%4.2fL/s",ShunShi); //打印瞬时流量
LCD_Write_String(0,0,dis0); //显示 瞬时流量
sprintf(dis1,"LJ:%4.1fL %4.1f",LeiJi,setNum); //打印累计流量
LCD_Write_String(0,1,dis1); //显示累计流量
buzzer=0; //关闭蜂鸣器
while (1) //主循环
{
if(dealFlag==1) //定时处理流速
{
dealFlag=0;
ShunShi=(float)PluNum*0.00223*2; //计算瞬时流量 一个脉冲代表0.00223ml 3s处理一次
LeiJi=LeiJi+(float)PluNum*0.00223; //累计计算累计流量
sprintf(dis0,"SH:%4.2fL/s",ShunShi); //打印瞬时流量
LCD_Write_String(0,0,dis0); //显示 瞬时流量
sprintf(dis1,"LJ:%4.1fL %4.1f",LeiJi,setNum); //打印累计流量
LCD_Write_String(0,1,dis1); //显示累计流量
PluNum=0; //清空计数
if(LeiJi>setNum) //对比设置和实际值
{buzzer=0;} //蜂鸣器报警
else
{buzzer=1;} //关闭蜂鸣器
}
if((key1 == 0)||(key2 == 0)) //有按键情况下
{
if(rekey == 0)
{
DelayMs(10);
if(key1 == 0) //按键1按下
{
rekey =1; //防止重复按下
if(setNum<99.9) //设置值++
setNum = setNum + 0.1;
}
else if((key2 == 0))//按键2按下
{
rekey =1; //防止重复按下
if(setNum>0.1) //设置值--
setNum = setNum - 0.1;
}
}
}
else
{
rekey = 0; //防止重复按下
}
}
}
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH0=(65536-20000)/256; //重新赋值 20ms
TL0=(65536-20000)%256;
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
void Timer0_isr(void) interrupt 1
{
TH0=(65536-20000)/256; //重新赋值 20ms
TL0=(65536-20000)%256;
time_ms++;
if(time_ms%25==0) //时间定时500ms
{
dealFlag=1;
}
}
/*------------------------------------------------
外部中断程序
------------------------------------------------*/
void ISR_Key(void) interrupt 0 using 1
{
PluNum++; //脉冲计数
}
上一篇: JoshChen_php新手进阶高手不可或缺的规范介绍
下一篇: LED部分