欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

基于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单排座。
系统硬件框图如下:基于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++;        //脉冲计数
}
相关标签: 51单片机