8051单片机C语言数据采集程序
/*---------------------------------------------------------------
* *
* float型转为2位char型,并发送至串行 *
* void Convert_AD_VOL_ValueToChar() *
* *
---------------------------------------------------------------*/
void Convert_AD_VOL_ValueToChar(uint vol)
{
float temp_float_vol;
unsigned int temp;
uchar AD_Hight,AD_Low;
temp_float_vol=vol*0.0048*AD_VOL_PER;
temp=temp_float_vol*100;
AD_Hight=temp /100;//取个位数
AD_Low=temp-AD_Hight*100;//取2位小数
ComBuf[2]=AD_Hight;
ComBuf[3]=AD_Low;
SendByteArray();//发送数据
}
/*--------------------------------
* *
* 预先采集一次AD数据 *
* *
*--------------------------------*/
void Befor_Once_AD()
{
uchar i;
ADCLK=ADOUT=0;
//----------
ADCS=0; //开启控制电路,使能DATA OUT和I/O CLOCK
for(i=1;i<=10;i++)
{
ADCLK=1;
ADCLK=0;
}
ADCS=1;
delay(25);//两次转换间隔大于21us
}
/*---------------------------------------------------------------
* GetAD() TLC1549数据采集 *
* sbit ADCLK=P2^0; *
* sbit ADOUT=P2^1; *
* sbit ADCS=P2^2; *
-----------------------------------------------------------------*/
void GetAD()
{
uchar i=1,w,PickCount;
uint vol;
Befor_Once_AD();//预先采集一次AD数据
//---------------
if (ComBuf[1]==0)ComBuf[1]=0x01;
PickCount=ComBuf[1];
for(w=1;w<=PickCount;w++)
{
ADCLK=ADOUT=0;
vol=0;
ADCS=0; //开启控制电路,使能DATA OUT和I/O CLOCK
for(i=1;i<=10;i++)
{
//给一个脉冲
ADCLK=1;
vol<=1;
if(ADOUT)vol|=0x01;
ADCLK=0;
}
ADCS=1;
delay(21);//两次转换间隔大于21us
//---------------
ComBuf[1]=w;//发送第几次采集的序号
Convert_AD_VOL_ValueToChar(vol);//对float转为2位char型,并发送至串行口
P2=0xff;//p2口置初始状态
}
}
/*---------------------------------------------------------------
* *
* TLC1549数据软件滤波采集 *
* *
-----------------------------------------------------------------*/
void GetAD_With_VOL_Filter()
{
uchar i,w,j,k,PickCount,AD_Hight=0,AD_Low=0;
uint Vol=0,VolArray[10],temp;
float SumVol=0;
Befor_Once_AD();//预先采集一次AD数据
//---------------
//---------------
PickCount=11;
for(w=0;w<=PickCount;w++)
{
ADCLK=ADOUT=0;
Vol=0;
ADCS=0; //开启控制电路,使能DATA OUT和I/O CLOCK
for(i=1;i<=10;i++)
{
//给一个脉冲
ADCLK=1;
Vol<=1;
if(ADOUT)Vol|=0x01;
ADCLK=0;
}
ADCS=1;
delay(21);//两次转换间隔大于21us
VolArray[w]=Vol;//保存采集来的数据
//---------------
P2=0xff;//p2口置初始状态
}
//-------按从小到大排序--------
//选择排序法..
for(i=0;i<=PickCount-1;i++)
{
k=i;
for(j=PickCount+1;j{
if(VolArray[j]>VolArray[k])k=j;
if(k!=i)
{
temp=VolArray[k];
VolArray[k]=VolArray[i];
VolArray[i]=temp;
}
}
}
//----------累加计算平静均值------------
//乎略最小和最大值
for(i=1;i<=PickCount-1;i++)
{
SumVol=SumVol+VolArray[i];//累加结果
}
SumVol=SumVol/(PickCount-1)*0.0048;//电压值=平均值*介数
/*------------------------------
0时为正常采集,1为CD4051循环采集
因为CD4051通道存在电压消耗,
所以和正常的直接采集的校准值不一样
-------------------------------*/
/*电压校准比*/
if(CD4051_Vol_Conver_Flag)
SumVol*=AD_Loop_PickVol_PER;//采用CD4051时的电压校准值
else
SumVol*=AD_VOL_PER;//直接输入时的电压校准值
//----------------
temp=SumVol*100;//保留2位小位
AD_Hight=temp /100;//取个位数
AD_Low=temp-AD_Hight*100;//取2位小数
//ComBuf[1]=w;//发送第几次采集的序号
ComBuf[2]=AD_Hight;
ComBuf[3]=AD_Low;
SendByteArray();//发送数据
}
/*-------------------------------------------------------------------------*
* *
* CD4051_PickVol...8路选通TLC1549采集 *
* *
*-------------------------------------------------------------------------*/
void CD4051_PickVol()
{
CD4051_Vol_Conver_Flag=1;
P1=CD4051_NUM[ComBuf[1]];//CD4051通道选通
// delay(2300);//通道切换时间间隔,避免电路的残余电
GetAD_With_VOL_Filter();
CD4051_Vol_Conver_Flag=0;
}
/*-------------------------------------------------------------------------*
* *
* CD4051_LoopPickVol()...8路巡检TLC1549采集 *
* *
*-------------------------------------------------------------------------*/
void CD4051_LoopPickVol()
{
uchar i=0,w;
w=ComBuf[1]-1;//通导号等于。。。通道数-1
for(;i<=w;i++)
{
ComBuf[1]=i;//通道号
CD4051_PickVol();
}
P1=0xff;//关闭通道
}
/*-------------------------------------------------------------------------*
* *
* 电容放电计数测试 *
* TestCapCount() *
* *
*-------------------------------------------------------------------------*/
void TestCapCount()
{
uint Vol,TempVol=0xff,Count=0,temp1,temp2;
uchar i,CAPDELAYTIME;
float TEST_CAP_OUT_value="/0.05;"
P1=CD4051_NUM[1];//CD4051通道选通,1号通道
TEST_CAP_VOL_CRLT=0;//打开
8051单片机数据采 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)
