[求助] 关于24位ad转换芯片ads1252转换问题,求高手进

海盗郭兆广   2012-7-15 19:51 楼主

写的这个程序是为了让ads1252转换的电压数值,通过单片机显示到1602上,

可是程序如果不加平均算法,那么数值很不稳定,只能显示到小数点后面两位。可是加上平均值滤波那么前两位一直显示0.0*******。

求高手指导一二。

看看是不是求平均值算法问题啊!!

/******************************************************************************
实验名称:用89C52单片机制作 6位半电压表 
具体方法:24位AD转换器ADS1252转换程序将程序显示到1602上面
作者:  海盗郭兆广
时间:  2012-07-01
目前问题:   
******************************************************************************/

#include "reg52.h"
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
uchar ads_data[10];
unsigned long Adc_pingjun[8];//平均算法滤波
uchar code table1[]="v=";//【电压显示】
sbit CLK=P1^0;    //ADS
sbit DOUT=P3^2;       //ADS
sbit SCLK=P1^2;             //ADS
sbit dula=P2^6;
sbit wela=P2^7;
sbit rs=P3^5;
sbit lcden=P3^4;
sbit we=P3^6;
sbit rd=P3^7;
float a;
ulong b;
uchar count;
//延时函数
void delay(z)
{
 uint x,y;
 for (x=0;x<z;x++)
  for(y=0;y<110;y++);
}
void delay1(m)//小延时
{
 uint x;
 for(x=0;x<m;x++);
}
void write_com(uchar com)//在1602上面写命令
{
 rs=0;
 lcden=0;
 P0=com;
 delay(5);
 lcden=1;
 delay(5);
 lcden=0;
}

void write_date(uchar date)//写数据
{
 rs=1;
 lcden=0;
 P0=date;
 delay(5);
 lcden=1;
 delay(5);
 lcden=0;
}

void init()//1602初始化

 char num;
 wela=0;
 dula=0;
 lcden=0;
 write_com(0x38);
 write_com(0x0c);
 write_com(0x06);
 write_com(0x01);
 write_com(0x80);
 delay(5);
 write_com(0x80);
 for(num=0;num<2;num++)
  {
   write_date(table1[num]);
   delay(5);
  }
/* TMOD=0x01;
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 EA=1;
 ET0=1;
 TR0=1;*/
}

void ads_init()
{

 TMOD = 0x20;      //定时器1工作与方式二
  PCON = 0x80;            //波特率加倍
  SCON = 0x50;      //串口工作方式一,打开接收允许
  TH1  = 0xF3;      //波特率为4800
 TL1  = 0xF3;
 TR1  = 1;      //开定时器T1 
}


ulong ads_read(void)//读取数据
{
 uchar data i; 
 ulong j = 0;       
 SCLK    = 0; 
 CLK     = 0;    
 for(i=0;i<48;i++)
  CLK = ~CLK; //t4  //DRDY 模式  
 for(i=0;i<12;i++)
  CLK = ~CLK; //t2  
 for(i=0;i<12;i++)
  CLK = ~CLK; //t3  
 //DOUT 模式   
 //在SCLK 的下降沿获取数据      
 CLK  = 1; 
 CLK  = 0;   
 SCLK = 1;   
 if(DOUT==1) j=j|0x01;
 CLK  = 1;
 CLK  = 0;
 SCLK = 0;   
 CLK  = 1; 
 CLK  = 0; 
 CLK  = 1; 
 CLK  = 0;   
 for(i=0;i<23;i++) 
  {
   j=j<<1;
   if(DOUT==1)j=j|0x01;  
   SCLK = 1;  
   CLK  = 1; 
   CLK  = 0; 
   CLK  = 1; 
   CLK  = 0;
   SCLK = 0; 
   CLK  = 1; 
   CLK  = 0; 
   CLK  = 1; 
   CLK  = 0;
  } 
  SCLK = 1;  
  CLK  = 1; 
  CLK  = 0; 
  CLK  = 1; 
  CLK  = 0;
  SCLK = 0; 
  CLK  = 1; 
  CLK  = 0; 
  CLK  = 1; 
  CLK  = 0;
  for(i=0;i<248;i++) 
   CLK = ~CLK;
  for(i=0;i<248;i++) 
   CLK = ~CLK;
  return j;   
}

void ads_convert(ulong l_data)
{
 unsigned char count;
   // unsigned char ads_data[] = {0, 0, 0, 0, 0,0,0,0,0,0};
 if(l_data & 0x00800000)
 {
  l_data = ~l_data;
  l_data = l_data + 1;
  l_data = l_data & 0x007fffff;
  a = ((float)(l_data))*5.0/0x7fffff;
  b = (ulong)(a*10000000);
  ads_data[0] = '-';
 }
 else
 {
  a = ((float)(l_data))*5.0/0x7fffff;
  b = (ulong)(a*10000000);
  ads_data[0] = '+';
 }
 ads_data[1] = (b/10000000)+0x30;
 ads_data[2] = '.';
 ads_data[3] = (b/1000000)%10+0x30;
 ads_data[4] = (b/100000)%10+0x30;
 ads_data[5] = (b/10000)%10+0x30;
 ads_data[6] = (b/1000)%10+0x30;
 ads_data[7] = (b/100)%10+0x30;
 ads_data[8] = (b/10)%10+0x30;
 ads_data[9] = b%10+0x30;
 write_com(0x80+2);
    for(count = 0; count< 10; count++)
    write_date(ads_data[count]);
 
}

void main(void)
{
 unsigned long sum,temp;
 unsigned char c;
 unsigned char   ubAdc_cnt=0;
 we=0;
 dula=0;
 wela=0;
 ads_init();
 init();
 while(1)
 {
//  temp=ads_read();
  Adc_pingjun[ubAdc_cnt++]=ads_read();         ///求平均算法滤波。。。。
  if(ubAdc_cnt==8)
     {
  ubAdc_cnt=0;
  for( c=0;c<8;c++)
  {
   delay(6); 
   sum+=Adc_pingjun[c];
  }
  temp=(sum>>3);
  ads_convert(temp);
     }
//  delay(100);
 }
}

 

每天早上叫醒我的不是闹钟 ,而是梦想

回复评论 (10)

每天早上叫醒我的不是闹钟 ,而是梦想
点赞  2012-7-15 19:52
用24位的AD做六位半的话不应该跳动这么大啊。不过也看不出来问题所在。
唯一发现的一点问题是你的sum用完之后或者说是在使用之前没有清零,这样会越累加数越大,直至溢出。最好是在使用前清零。
点赞  2012-7-16 20:20

回复 板凳 jishuaihu 的帖子

谢谢斑竹,真的是sum没有清零的问题。。真心的感谢。。
每天早上叫醒我的不是闹钟 ,而是梦想
点赞  2012-7-17 19:32
不客气
程序做多了就不会犯这样的错误了!
点赞  2012-7-17 20:25
你确定是设计的是6位半吗?怎么感觉是7位半呀????
点赞  2013-1-15 16:40
我想问下,程序里为什么是除以0x7fffff呢?而不是0xffffff呢?
点赞  2013-11-21 12:46

求救

最近在使用ADS1251,不知道为什么采集的数据一直在正计时,从一个数字,一直往下减,求楼主赐教
点赞  2013-12-19 09:03
同求,谢谢大虾呀!!
点赞  2013-12-26 06:59
求QQ想交流一下
点赞  2015-5-19 23:00
求QQ交流,楼主现在解决了没
点赞  2015-7-24 16:32
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复