📄 ads7804.c
字号:
/******************************************************************************
ADS7804.c
12位A/D转换器80C51驱动程序C文件
Copyright (c) 2006,SHP,JYL,CZH
2007-03-16
*******************************************************************************/
#include "INCLUDE.H"
//#define LIMITNUM7804 10
//#define LIMITNUM7804X2 2*LIMITNUM7804
//int xdata MaxMinData7804[LIMITNUM7804X2];
uchar data ADS_Delay_t; /*定义延时变量,用于宏ADS_Delay()*/
/******************************************************************************
宏定义: ADS_Delay()
功 能: 采样延时
*******************************************************************************/
#define ADS_Delay() \
{ \
ADS_Delay_t = (ADS_DELAY_VALUE);\
while ( --ADS_Delay_t != 0 ); \
}
/******************************************************************************
函数: ADS7804Step()
功能: 单点采样子程序用来读取一次采样转换结果
返回: 返回一个有符号整数形式的转换结果
*******************************************************************************/
int ADS7804Step(void)
{
uint u,ul,uh;
P0 = 0xff;
ADS7804RC = 0; /*R/C低电平,进入转换模式*/
_nop_();
ADS7804RC = 1; /*R/C高电平,开始读转换数据*/
while (ADS7804BUSY == 0); /*等待转换完成*/
ADS7804BYTE = 0; /*选择低字节*/
ul = P0; /*读转换结果低8位*/
ADS7804BYTE = 1; /*选择高字节*/
uh = P0;
uh = uh & 0x0f; /*读转换结果高4位*/
u = uh*256+ul; /*得到12位转换结果*/
if(u >= 0x0800)
u |= 0xf000; /*如果为负值,则符号扩展*/
return((int)u); /*返回转换结果*/
}
/******************************************************************************
函数: 定长采样子程序ADSTimeSampleNDatas
功能: 根据给定的采样间隔ADCINTERVAL(单位为us)采样ADCNUM点,并采用
查询51单片机内置定时器的方式来控制采样时序。
返回: ADCNUM点采样结果的平均值
*******************************************************************************/
/*
int ExtremumFilter(int x)
{
uchar i;
if (x>MaxMinData7804[LIMITNUM7804])
{
for(i=LIMITNUM7804+1; i<LIMITNUM7804X2; i++)
{
if( x > MaxMinData7804[i] ) //寻找最小值替换
{
MaxMinData7804[i-1] = MaxMinData7804[i];
}
else
{
MaxMinData7804[i-1] = x;
break;
}
}
if(i==LIMITNUM7804X2)
MaxMinData7804[LIMITNUM7804X2-1] = x;
return(MaxMinData7804[LIMITNUM7804]);
}
if (x<MaxMinData7804[LIMITNUM7804-1])
{
for(i=LIMITNUM7804-1; i>0; i--)
{
if( x < MaxMinData7804[i-1] ) //寻找最小值替换
{
MaxMinData7804[i] = MaxMinData7804[i-1];
}
else
{
MaxMinData7804[i] = x;
break;
}
}
if(i==0)
MaxMinData7804[0] = x;
return(MaxMinData7804[LIMITNUM7804-1]);
}
return(x);
}
*/
/******************************************************************************
函数: 定长采样子程序ADSTimeSample1024Datas
功能: 根据给定的采样间隔ADCINTERVAL(单位为us)采样1024点,并求平均值
返回: ADCNUM点采样结果的平均值
*******************************************************************************/
int ADSTimeSample1024Datas(void)
{
uint i;
int intx16;
long sum32;
//
sum32 = 0L;
for(i=0; i<1024; i++)
{
ADS_Delay();
intx16 = ADS7804Step();
sum32 += intx16; /*采样、存储*/
}
intx16 = (int)(sum32 >> 10);
return(intx16);
}
/******************************************************************************
函数: 定长采样子程序ADSTimeSampleNDatas
功能: 根据给定的采样间隔ADCINTERVAL(单位为us)采样4096点,并求平均值
返回: ADCNUM点采样结果的平均值
*******************************************************************************/
int ADSTimeSampleNDatas(void)
{
uint i;
int intx16;
long sum32;
//
sum32 = 0L;
/*
for(j=0; j<LIMITNUM7804X2; j++)
{
ADS_Delay();
MaxMinData7804[j] = ADS7804Step();
}
for(j=0; j<LIMITNUM7804X2; j++)
{
for(k=LIMITNUM7804X2-1; k>j; k--)
if(MaxMinData7804[k-1]>MaxMinData7804[k])
{
intx16=MaxMinData7804[k-1];
MaxMinData7804[k-1]=MaxMinData7804[k];
MaxMinData7804[k]=intx16;
}
}
*/
for(i=0; i<4096; i++)
{
ADS_Delay();
intx16 = ADS7804Step();
sum32 += intx16; //ExtremumFilter(intx16); //采样、极值滤波、求累加和
}
intx16 = (int)(sum32 >> 12); //求1024平均值
return(intx16);
}
/******************************************************************************
函数: 定长采样子程序ADSTimeSampleMaxDat()
功能: 根据给定的采样间隔ADCINTERVAL(单位为us)采样ADCNUM点,并取最大值,并采用
查询51单片机内置定时器的方式来控制采样时序。
返回: ADCNUM点采样结果的最大值
*******************************************************************************/
int ADSTimeSampleMaxDat(void)
{
uchar i;
int lmax,temp;
lmax = 0;
for(i=0; i<1024; i++)
{
ADS_Delay();
temp = ADS7804Step();
lmax = (lmax > temp) ? lmax : temp; /*采样、存储*/
}
return(lmax);
}
/******************************************************************************
函数: 定长采样子程序ADSTimeSampleMinDat()
功能: 根据给定的采样间隔ADCINTERVAL(单位为us)采样ADCNUM点,并取最大值,并采用
查询51单片机内置定时器的方式来控制采样时序。
返回: ADCNUM点采样结果的最大值
*******************************************************************************/
int ADSTimeSampleMinDat(void)
{
uchar i;
int lmin,temp;
lmin = 0;
for(i=0; i<1024; i++)
{
ADS_Delay();
temp = ADS7804Step();
lmin = (lmin < temp) ? lmin : temp; /*采样、存储*/
}
return(lmin);
}
/************************************** end ***********************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -