|
ADS1230,网上的.
#include
#include
#include
#define uint unsigned int
#define ulong unsigned long
#define uchar unsigned char
uchar dispcnt;
uchar tmscnt;
uint cnt;
sbit dout=P3^4;
sbit sclk=P3^5;
// 0 1 2 3 4 5 6 7
code uchar duanma[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,
// 8 9 U P - 0.
0xfe,0xf6,0x7c,0xce,0x02,0xfd,0x00};
code uchar dispbitcode[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
data uchar vlog[8]={14,14,0,0,0,0,0,0};
ulong sum[2]={0,0};//滑动滤波值的存储
void delay1ms(void);
ulong adcover(void);
ulong filter(ulong ad);
ulong filter1(ulong ad);
void zijian(void);
void jieguo(void);
/****************主程序*********************/
void main()
{ uint i;
TMOD=0x01; //100/0.5425=184;256-184=72=0x48;定时100us
TH0=(65536-1840)/256;
TL0=(65536-1840)%256;
TR0=1;
ET0=1;
EA=1;
P3_2=0;
zijian();
while(1)
{
jieguo();
for(i=0;i<50;i++)//改显示延时
{
delay1ms();
}
}
}
/************延时1ms子程序***************************/
void delay1ms(void) //延时1ms
{
uint i;
for(i=0;i<922;i++) //0.5425*2*922
{ _nop_();
}
}
/***************开机自检程序***************************/
void zijian(void)
{
uint i,j,k;
vlog[0]=12;
vlog[1]=12;
vlog[2]=12;
vlog[3]=10;
vlog[4]=11;
vlog[5]=12;
vlog[6]=13;
vlog[7]=1;
for(i=0;i<500;i++) //显示---UP-0.1后延时一秒
{
delay1ms();
}
for(i=0;i<10;i++) //显示数字0---9;
{
for(j=0;j<8;j++)
{
vlog[j]=i;
}
for(k=0;k<250;k++)
{
delay1ms();
}
}
for(i=0;i<8;i++)
{
vlog=14;
}
}
/**************AD转换程序**********************/
ulong adcover(void)
{
ulong result;
// ulong result1;
uint rice=0;
uchar i;
uchar rice1=0;
sclk=0;
_nop_();
_nop_();
if(dout==0) //dout为低,开始读取数据
{
// EA=0;//关显示中断
for(i=0;i<4;i++)
{
_nop_();
_nop_();
}
for(i=0;i<12;i++) //高12位
{ sclk=1;
_nop_();
_nop_();
sclk=0;
if(dout==1)
rice=(rice<<1)|0x0001;
else
rice=rice<<1;
_nop_();
_nop_();
}
for(i=0;i<8;i++) //低八位
{
sclk=1;
_nop_();
_nop_();
sclk=0;
if(dout==1)
rice1=(rice1<<1)|0x01;
else
rice1=rice1<<1;
_nop_();
_nop_();
}
dout=1;
for(i=0;i<2;i++)
{
_nop_();
_nop_();
}
// EA=1;
}
// EA=0;
result=0;
result=(ulong)rice*256+(ulong)rice1;
if(result>524287)
{
result=1048576-result;
}
//result1=(float)result*0.0308166;
//result=(ulong)result1;
return result;
//EA=1;
}
/************滑动平均法数字滤波**************************/
ulong filter(ulong ad)
{
static ulong buff[9]={0,0,0,0,0,0,0,0,0}; //滤波缓冲区的大小,改的话6可以改,下面也要改,3个要改动
static uchar in=0;
static ulong total=0;
total-=buff[in];
buff[in]=ad;
in++;
if(in==9)
{
in=0;
}
total+=ad;
return (total/9);
}
/*************算术平均值滤波***************************
ulong filter1(ulong ad)
{
ulong total=0;
uchar i;
for(i=0;i<3;i++)
{
total+=ad;
}
return(total/3);
}
/****************显示锁定**************************/
/***************写缓冲区**********************/
void jieguo(void)
{
ulong temp;
ulong sum1;
ulong sum2;
EA=0;
temp=sum[0];
sum[0]=sum[1];
sum[1]=filter(adcover()); //判断sum[0]与sum[1]的大小
if(abs(sum[0]-sum[1])<=14) //如果小于给定,则sum[1]内容不变,100是内码的变化量,可调这个
{
sum[1]=sum[0];
}
sum2=sum[1];
sum1=(float)sum2*0.034518;
sum1=(ulong)sum1;
//vlog[2]=(sum1%1000000)/100000;
vlog[3]=(sum1%100000)/10000;
vlog[4]=(sum1%10000)/1000;
vlog[5]=(sum1%1000)/100;
vlog[6]=(sum1%100)/10;
vlog[7]=sum1%10;
EA=1;
}
/*************中断显示程序*************************/
void t0() interrupt 1 using 0 //每周期的时间为0.545s 定时时间为100us
{
TH0=(65536-1840)/256; //1ms
TL0=(65536-1840)%256;
tmscnt++;
//if(tmscnt==1) //1ms
// {
// tmscnt=0;
P0=0x00;
P2=duanma[vlog[dispcnt]];
P0=dispbitcode[dispcnt];
dispcnt++;
if(dispcnt==8)
{
dispcnt=0;
}
}
//}
|
|