基于51单片机的流量计制作(流程+程序)

时间:2024-03-26 08:02:04

 

关注【电子开发圈】微信公众号,一起学习吧!

电子DIY、Arduino、51单片机、STM32单片机、FPGA……
电子百科、开发技术、职业经验、趣味知识、科技头条、设备拆机……

点击链接,免费下载100G+电子设计学习资料!

http://mp.weixin.qq.com/mp/homepage?__biz=MzU3OTczMzk5Mg==&hid=7&sn=ad5d5d0f15df84f4a92ebf72f88d4ee8&scene=18#wechat_redirect

 

流量计主要应用于检测流体流速,通过检测累计流量可以做到控制流体体积的功能,今天笔者给大家介绍一种基于STC89C52的流量计制作方法,主要能够实现检测实时流速,并在液晶屏上显示出来,累计流量达到限定值后,蜂鸣器产生警报的功能。需要的材料有:BUZZER蜂鸣器,30P无极电容,DC接口(小),10uf极性电容,水流量传感器,2.54间距3芯单排针,LCD1302液晶屏,LED灯,103电位器,9012直插电极管,10K电阻,1K电阻,按键,STC89C52单片机 ,电源开关,晶振,IC座,2.54单排座。 

 

基于51单片机的流量计制作(流程+程序)


 系统硬件框图如下:` 
 程序执行的大致流程给大家用流程图表示出来了; 
 下面给大家分享一下笔者使用的源代码:

 

基于51单片机的流量计制作(流程+程序)

 

#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++;        //脉冲计数
}


--------------------- 
作者:qq_40977332 
来源:CSDN 
原文:https://blog.csdn.net/qq_40977332/article/details/80252009 
版权声明:本文为博主原创文章,转载请附上博文链接!