找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

帖子
查看: 4235|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)液位檢測(cè)C語(yǔ)言,測(cè)量時(shí) 數(shù)據(jù)偏大 求大神幫忙矯正程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
我是用的at89s52單片機(jī),一個(gè)水位傳感器,范圍0~5mm和ADC0832數(shù)模轉(zhuǎn)換芯片,進(jìn)行液位測(cè)量時(shí),測(cè)出的數(shù)據(jù)偏大而且大于3 的時(shí)候,結(jié)果保持在3.0.鍵盤(pán)是對(duì)預(yù)設(shè)值加減,有超限報(bào)警。實(shí)物圖如下:






C語(yǔ)言程序如下,求大神矯正:
/**************************包含頭文件*****************/
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
/******************端口定義****************************/
sbit CS=P3^5; //使能
sbit Clk=P2^1;//時(shí)鐘
sbit DATO=P3^7; // 數(shù)據(jù)輸出
sbit DATI=P3^6;//數(shù)據(jù)輸入
sbit Buzzer=P2^0;
sbit SW1=P1^0;
sbit SW2=P1^1;
/******************定義全局變量****************************/
unsigned char dat=0x00;  //AD值
unsigned char count=0x00;   //定時(shí)器計(jì)數(shù)
unsigned char CH;     //通道變量
unsigned char dis[]={0x00,0x00,0x00};   //顯示數(shù)值
unsigned Hmax;
bit Bjj(unsigned  Hmax);
/*************************共陽(yáng)LED段碼表*****************************/
unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};  //段碼0-9
char code tablewe[]={0xdf,0xef,0xf7,0xfb};  // 位碼P25-P22
/*******************************************************************
函數(shù)功能:AD轉(zhuǎn)換子程序
入口參數(shù):CH
出口參數(shù):dat
*****************************************************/
unsigned char adc0832(uchar CH)
{
uchar i,test,adval;
adval=0x00;
test=0x00;
Clk=0;
DATI=1;
_nop_();
CS=0;
_nop_();
Clk=1;
_nop_();
if(CH==0x00)  //通道選擇
{
  Clk=0;//1個(gè)下降沿DI=1
  DATI=1;  //通道0的第一位
_nop_();
  Clk=1;
  _nop_();
  Clk=0;
  DATI=0;  //通道0的第二位
  _nop_();
  Clk=1;
  _nop_();
}
else
{
  Clk=0;
  DATI=1;   //通道1的第一位
  _nop_();
  Clk=1;
  _nop_();
  Clk=0;
  DATI=1;  //通道1的第二位
  _nop_();
  Clk=1;
  _nop_();
}
Clk=0;
DATI=1;
for(i=0;i<8;i++)   //讀取前8位的值
  {
   _nop_();
   adval<<=1;
   Clk=1;
   _nop_();
   Clk=0;
   if(DATO)
     adval|=0x01;
   else
     adval|=0x00;
   }
   for(i=0;i<8;i++)   //讀取后8位的值
    {
     test>>=1;
     if(DATO)
        test|=0x80;
     else
         test|=0x00;
     _nop_();
     Clk=1;
     _nop_();
     Clk=0;
    }
    if(adval==test)    //比較前后8位的值,不同則舍去,若一直顯示為0,請(qǐng)將改行去掉
       dat=test;
       _nop_();
       CS=1;     //釋放ADC0832
       DATO=1;
       Clk=1;
       return dat;
}
/*********************************************************
函數(shù)功能:延時(shí)子程序
入口參數(shù):
出口參數(shù):
*********************************************************/
void delay(void)
{
   int k;
   for(k=10;k<500;k++);
}

/*********************************************************
函數(shù)功能:將0-255級(jí)換算成0.00-5.00的電壓數(shù)值
入口參數(shù):i
出口參數(shù):
*********************************************************/
void convdata(uchar i)
{
   dis[0]=i/51;    //gewei
   dis[1]=(i%51)*10/51;  //小數(shù)點(diǎn)后1位
   dis[2]=((i%51)*10%51)*10%51; //小數(shù)點(diǎn)后2位
}

/*********************************************************
函數(shù)功能:數(shù)碼管顯示子程序
入口參數(shù):
出口參數(shù):
*********************************************************/
void display(void)
{
P2=0xff;
P0=tab[dis[0]]&0x7f;;    //顯示個(gè)位和小數(shù)點(diǎn)
P2=0xef;
delay();

P0=tab[dis[1]];       //顯示小數(shù)點(diǎn)后1位
P2=0xf7;
delay();

P0=tab[dis[2]];      //顯示小數(shù)點(diǎn)后2位
P2=0xfb;
delay();

P0=tab[Hmax];
P2=0x7f;
delay();
}
/*********************************************************
函數(shù)功能:主函數(shù)
入口參數(shù):
出口參數(shù):
*********************************************************/
void main(void)
{
   P2=0xff;   //端口初始化
   P0=0xff;
   delay();
   CH=0x00;   //選擇通道0或1
   Hmax=3; //上限值
   TMOD=0x01; //設(shè)置中斷
   TH0=(65536-50000)/256; //定時(shí)器1初值定時(shí)50ms
   TL0=(65536-50000)%256;
   IE=0x82;
   TR0=1;
   while(1)   //主循環(huán)
   {
     dat=adc0832(CH);
     convdata(dat);   //數(shù)據(jù)轉(zhuǎn)換
     display();       //顯示數(shù)值
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:205345 發(fā)表于 2017-5-28 16:05 | 只看該作者
急求急求!
回復(fù)

使用道具 舉報(bào)

板凳
ID:123289 發(fā)表于 2017-5-28 21:51 | 只看該作者
1、液位檢測(cè)的原理是什么?
2、液位是如何圍成電壓信號(hào)的?
能說(shuō)清楚以上兩點(diǎn),估計(jì)問(wèn)題就解決得差不多了。
回復(fù)

使用道具 舉報(bào)

地板
ID:205345 發(fā)表于 2017-5-29 12:43 | 只看該作者
yzwzfyz 發(fā)表于 2017-5-28 21:51
1、液位檢測(cè)的原理是什么?
2、液位是如何圍成電壓信號(hào)的?
能說(shuō)清楚以上兩點(diǎn),估計(jì)問(wèn)題就解決得差不多了 ...

是一種簡(jiǎn)單易用的水位傳感器,該傳感器的工作原理是通過(guò)電路板上一系列裸露的印刷平行導(dǎo)線(xiàn)測(cè)量水量的大小。水量越多,就會(huì)有更多的導(dǎo)線(xiàn)被聯(lián)通,隨著導(dǎo)電的接觸面積增大,輸出的電壓就會(huì)逐步上升。
但是實(shí)際檢測(cè)的時(shí)候,剛測(cè)量ad轉(zhuǎn)換得到的數(shù)據(jù)就有100了,最多也就180. 0~255的測(cè)量范圍達(dá)不到。
所以我先測(cè)出整數(shù)位對(duì)應(yīng)的數(shù)字量,然后分為五段了。雖然還是有偏差,但是整數(shù)位測(cè)出來(lái)比較準(zhǔn)確了
回復(fù)

使用道具 舉報(bào)

5#
ID:7485 發(fā)表于 2017-5-29 15:54 | 只看該作者
“      剛測(cè)量ad轉(zhuǎn)換得到的數(shù)據(jù)就有100了,最多也就180. 0~255的測(cè)量范圍達(dá)不到  ”是什么意思?
程序是自己寫(xiě)的嗎?
許多這類(lèi)的測(cè)量,傳感器給出的信號(hào)一般不可能剛剛和和理想的結(jié)果相對(duì)應(yīng),往往是一個(gè)線(xiàn)性數(shù)值(有時(shí)僅僅是一個(gè)相關(guān)的曲線(xiàn)),需要通過(guò)程序用一個(gè)系數(shù)進(jìn)行矯正。有時(shí)還要進(jìn)行插值計(jì)算。
回復(fù)

使用道具 舉報(bào)

6#
ID:205345 發(fā)表于 2017-5-29 18:26 | 只看該作者
ahshmj 發(fā)表于 2017-5-29 15:54
“      剛測(cè)量ad轉(zhuǎn)換得到的數(shù)據(jù)就有100了,最多也就180. 0~255的測(cè)量范圍達(dá)不到  ”是什么意思?
程序是 ...

我用的是ADC0832芯片,它是8位的,經(jīng)過(guò)轉(zhuǎn)換就是0~255.我又改了一下程序,雖然還是有誤差,但是整數(shù)位測(cè)量的比較準(zhǔn)確了
void convdata(uchar i)
{
/*  dis[0]=i/100; //gewei
   dis[1]=((i)%100)/10;  //小數(shù)點(diǎn)后1位
   dis[2]=((i)%100)%10; //小數(shù)點(diǎn)后2位*/      //AD轉(zhuǎn)換值檢測(cè),測(cè)出整數(shù)位對(duì)應(yīng)的8位數(shù)據(jù)
  
if((110<dat)&&(dat<=140))
  { dis[0]=(i-110)/30; //gewei
   dis[1]=((i-110)%30)*10/30;  //小數(shù)點(diǎn)后1位
   dis[2]=(((i-110)%50)*10%30)*10%30; //小數(shù)點(diǎn)后2位   //0~1mm
  }
  if((140<dat)&&(dat<=160))
  { dis[0]=((i-140)/20)+1; //gewei
   dis[1]=((i-140)%20)*10/20;  //小數(shù)點(diǎn)后1位
   dis[2]=(((i-140)%20)*10%18)*10%20; //小數(shù)點(diǎn)后2位   //1~2mm
  }
  if((160<dat)&&(dat<=170) )
  { dis[0]=((i-160)/10)+2; //gewei
   dis[1]=((i-160)%10)*10/10;  //小數(shù)點(diǎn)后1位
   dis[2]=(((i-160)%10)*10%6)*10%10; //小數(shù)點(diǎn)后2位    //2~3mm
}
    if((170<dat)&&(dat<=175))
  { dis[0]=((i-170)/5)+3; //gewei
   dis[1]=((i-170)%5)*10/5;  //小數(shù)點(diǎn)后1位
   dis[2]=(((i-170)%5)*10%5)*10%5; //小數(shù)點(diǎn)后2位       //3~4mm
}
    if((175<dat)&&(dat<=180))
  { dis[0]=((i-175)/5)+4; //gewei
   dis[1]=((i-175)%5)*10/5;  //小數(shù)點(diǎn)后1位
   dis[2]=(((i-175)%5)*10%5)*10%5; //小數(shù)點(diǎn)后2位        4~5mm
   }
}
回復(fù)

使用道具 舉報(bào)

7#
ID:257481 發(fā)表于 2017-12-4 23:33 | 只看該作者
樓主來(lái)一份
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表