找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1463|回复: 0
收起左侧

单片机液位检测系统设计剖析

[复制链接]
ID:740223 发表于 2020-4-28 16:47 | 显示全部楼层 |阅读模式
一 功能简介
     本设计经过调研,收集且分析相关技术资料,综合考虑液位检测技术发展和液位检测系统特点的基础上,提出把液位检测显示同超限报警综合的解决方案。本系统采用AT89C51单片机作为处理器,主要完成以下工作:
         基于AT89C51的液位信息检测设计方案。
         传感器LM1042,A/D转换芯片ADC0809与单片机的接口电路设计。
         LED数码管的显示是利用段码加位码循环动态显示实现的。
         设计主要软件程序模块,完成软件设计。

二 系统硬件设计简介
该系统以AT89C51作为核心控制部件,外加传感器。一片A/D转换芯片和一片数码管驱动芯片来完成系统的预期任务,即液位的检测、显示和超限报警。LM1042外接的热阻探针温度的变化依赖于周围材料的热阻的大小,从而可以根据探针在液体中的深度不同时电阻的不同检测出液位的深度信息,由LM1042内部转换电路网络转换为与液位成线性关系的电压信号,再由A/D转换芯片AD0809将模拟信号转换为数字信号,实现液位信息的输入,AT89C51从ADC0809读取液位信息后进行数据处理和超限判断,随后将处理过的数据分别通过位码和段码送给相应的芯片。同时,若液位超限则由单片机驱动蜂鸣器报警。

各部分功能:
电源部分提供+5V +15V电压供系统各部分使用。
传感器LM1042实现液位信息到电压信号的转换。
3. ADC0809将放大器输出的电压信号经A/D转换后送到单片机。
4. AT89C51为处理器,实现液位信息的接收、数据处理、输出到LED显示端.
5.蜂鸣器部分在单片机检测到液位超限是由单片机驱动实现声音报警。
6.单片机对液位数据处理后输出,送给相应芯片控制LED动态显示。

传感器电路的设计

  由于我们在设计的过程中未接触到实际传感器,在protues仿真软件中采用电位器模拟的办法,因此我们只是了解了传感器的原理。传感器电路设计部分并未实现。

  • A/D转换部分的电路设计

本系统经过采用AD0809芯片,其中11脚为电源端,最主要的6脚START,启动控制端口,高电平有效,EOC连接51单片机的终端输入端,触发中断的信号。9脚是输出时能端,电路图中可以看出它是由P2.6控制的。10脚为时钟接口,12,16分别为参考正,参考负。26脚为通道0的信号输入端,23,24,25为通道选择引脚,22为锁存使能信号端,下面的八路信号是输出端,由低到高的对应八位二进制数。13为参考地。 (见附录电路原理设计图)         

  • 数码管显示部分的电路设计

电路图可以参见上面的图2-8,大致控制是通过P0口将段码送给245增加驱动后,送至LED的A-DP的输入端,控制显示的大小。同时通过P2.0,P2.1作为139译码器的输入信号选出一路信号后,作为位码送至LED的1-4端口,决定哪一位显示。整个LED显示电路的控制主要是通过245的使能端控制实现的。至于它的动态显示,是由于在一个时刻,只能送一个位码,一个段码,也就是只能保证一位数字的正确显示,通过快速的程序循环就实现了动态的显示过程。

              

  • 报警装置的电路设计

BU(P2.5接口)蜂鸣器用于报警。当检测到液位高于200cm或者低于100cm时,启动报警装置。

        


    第六章 系统软件部分的设计

    系统的硬件确定以后,功能完善的软件能够很好的指导和协调硬件的工作,可使系统发挥其最大的作用,并且便利以后的更新换代升级。

     一个完整的系统都离不开对系统状态的监控,为了更好的协调软件,硬件各个部分正常工作就必须对整个系统进行严密监控。在本系统中定时器T0中断服务程序担任数据读取,处理和输出显示任务,每隔一定的时间对A/D转化进行一次采样,并进行相应的处理,在经过LED驱动电路来实现液位的显示。而主程序完成的任务相对简单,它只是完成初始化和启动T0定时的工作。

在该系统的软件部分的设计中,第一部分主要是对流程图的介绍,第二部分是系统工作程序的编程内容,由于全部编程部分较多,只取最重要的水位检测主程序段。本程序段主要实现启动ADC0809转换器,并从A/D转换器采集信号的功能。

二 程序清单

#include<reg51.h>
unsigned char A_DV0;                                //A_D转换得到值
unsigned Hmax,Hmin;                                //上下限值
unsigned char A_DV[4];                               //当前液位值
char T0c=0;
char A;                                             //T0计时次数
void T0Run(void);                                    //T0启动子程序
void LED(unsigned char A_DV[]);                       //LED显示子程序
void A_DRun(void);                                   //启动A_D转换子程序
void A_DReA_D(void);                                //A_D转换子程序
int Height;
bit Bjj(int Height,unsigned  Hmax,Hmin);              //数值比较函数
sbit BU=P2^5;
sbit L1=P2^0;
sbit               L2=P2^1;
sbit ST=P2^6;
sbit OE=P2^7;
sbit EOC=P3^2;
main()
    {   
                   BU=0;
         Hmax=200;                              //上限值,根据实际情况设定
         Hmin=100;                              //下限值 ,根据实际情况设定
         T0Run();
                            while(1);
    }
void T0Run(void)                                  //T0启动子程序
  {
    IE=0x82;                                     //启动中断T0  
    TMOD=0x01;                                  //设置T0工作于模式1
    TH0=0xff;                                 
    TL0=0xec;                                     //送入计数初值
    TR0=1;
              ST=0;
              OE=0;                                         //启动定时器T0
  }
void time0(void) interrupt 1
  {
    TH0=0xff;
              TL0=0xec;                                      //重装计数初值
    T0c++;
    if(T0c>19)                                      //如果计时20次即1s  
      {      
                 T0c=0;
       A_DRun();                                    //启动A_D转换                                                        
       A_DReA_D();
       LED(A_DV);
       Bjj(Height,Hmax,Hmin);
      }
}
void A_DRun(void)                                   //启动A_D程序
{
                ST=0;
                ST=1;
                ST=0;
}
void A_DReA_D(void)
{   
     int A_DV0;
     while(EOC==0);
              OE=1;
              A_DV0=P1;
              OE=0;                                                                                                                                                                        
     Height=A_DV0;                                                                                                                              //计算A_D转换值
     A_DV[0]=Height%10;                             //逐位分离液位值
     A_DV[1]=(Height%100)/10;
     A_DV[2]=(Height%1000)/100;
     A_DV[3]=0;
}
void LED(unsigned char A_DV[])                         //LED显示子程序      
{
  int i,k;
  char a[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};   
                   //数字零到数字九的共阳极显示时的七段码
  char b[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
  for(i=0;i<1000;i++)                                                  
              //设定循环次数,使这四位数循环快速显示,实现长时间的动态显示
  {

   k=A_DV[3];
   L1=1;
   L2=1;
   A=a[k];
   P0=A;   
                                                     //显示第3位            
   k=A_DV[0];
   L1=0;
   L2=1;
   A=b[k];  
   P0=A;
                                                     //显示第2位
   k=A_DV[1];
   L1=1;
   L2=0;
   A=a[k];
   P0=A;
                                                      //显示第1位
   k=A_DV[2];
   L1=0;
   L2=0;
   A=a[k];
   P0=A;  
}
}
bit Bjj(int Height,unsigned  Hmax,Hmin)               //数值比较函数
{  if(Height>Hmax||Height<Hmin)
     BU=1;
    else BU=0;                   //p2.5接的是蜂鸣器,到有高电平时,蜂鸣器就会响起
     return 1;
}   

            

以上的Word格式文档51黑下载地址:
单片机51hei设计——液位检测系统剖析.doc (940 KB, 下载次数: 20)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表