写的这个程序是为了让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);
}
}