⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ads7804.c

📁 ADS7804是美国BURR-BROWN公司推出的一种新型12位A/D转换器。给出了用C51语言编写的数据采集的应用程序。已通过调试
💻 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 + -