流量计主要应用于检测流体流速,通过检测累计流量可以做到控制流体体积的功能,今天笔者给大家介绍一种基于STC89C52的流量计制作方法,主要能够实现检测实时流速,并在液晶屏上显示出来,累计流量达到限定值后,蜂鸣器产生警报的功能。需要的材料有:BUZZER蜂鸣器,30P无极电容,DC接口(小),10uf极性电容,水流量传感器,2.54间距3芯单排针,LCD1302液晶屏,LED灯,103电位器,9012直插电极管,10K电阻,1K电阻,按键,STC89C52单片机 ,电源开关,晶振,IC座,2.54单排座。
系统硬件框图如下:`
程序执行的大致流程给大家用流程图表示出来了;
下面给大家分享一下笔者使用的源代码:
#include #include #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++; //脉冲计数 }
上一篇:基于单片机的电热水器控制系统设计
下一篇:基于单片机的智能社区安全监测系统设计
推荐阅读最新更新时间:2024-10-30 22:38
设计资源 培训 开发板 精华推荐
- 使用 NXP Semiconductors 的 TL431BCD 的参考设计
- CN0313
- 【ART-Pi】2.4G遥控器拓展板
- ADR421 超精密、低噪声、2.048 Vout XFET 电压基准作为可编程电流源的典型应用
- VNH7070BAS评估板
- 具有脉冲计数接口的双线电隔离式 IC 温度传感器参考设计
- 哥特摩天轮/Gothic Ferris Wheel
- 使用 FAN9673 180 至 264 VAC 输入、5kW CCM PFC 控制器的 3 通道交错 CCM PFC
- 使用 NXP Semiconductors 的 TDA1519C 的参考设计
- 用于 Intel 486TM DX4TM Overdrive 微处理器的 LT1587CT 3A 低压差稳压器的典型应用