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

📄 ad.c

📁 基于MB95F168气体检漏仪软件代码
💻 C
字号:
/*****************************************************************
 ** 文件名:AD.c
 ** Copyright (c) 中国地质大学
 ** 创建人:邵威
 ** 日  期:2007-12-01	
 ** 描  述:AD7705 16位串行AD转换芯片,自带增益可调和校准 
 ** 版  本:Version 1.00	
 *****************************************************************/

#include "mb95100.h"
#define uchar unsigned char
#define uint  unsigned int

//------------------------------------------------------------------------------------
// Global CONSTANTS
//-----------------------------------------------------------------------------------
/*  
sbit AdReady = P0^7;
sbit AdClk = P0^4;
sbit AdDin  = P0^6;
sbit AdDout = P0^5;
sbit AdCS = P2^6;//AD7705片选
*/
#define AdReady PDR0_P07
#define AdClk	PDR6_P65
#define AdDin  	PDR6_P66
#define AdDout 	PDR6_P67
//常数
#define CH1 1 //AD7705输入通道IN1
#define CH2 2 //AD7705输入通道IN2
#define BIPOLAR 0 //AD7705双极性输入
#define UNIPOLAR 1 //AD7705单极性输入
#define AD_CLK_WIDTH 10 //AD7705串口时钟脉冲宽度
//全局变量
extern unsigned int g_iCurrADValue;
//-------------------------------------------------------------------------
//函数名称     :Wait
//功能描述     :Ad7705时钟延时
//输入参数     :t--单位时间个数
//输出参数     :无
//-------------------------------------------------------------------------
void AD_Wait(uint t)
{
    for (; t > 0; t--)
        ;
}

//-------------------------------------------------------------------------
//函数名称     :WriteByte
//功能描述     :向AD7705写入一个字节
//输入参数     :x--要写入的数值
//输出参数     :无
//-------------------------------------------------------------------------
void AD_WriteByte(uchar x)
{
    uchar i;
    AdClk = 1;
    for (i = 0; i < 8; i++)
    {
        AdClk = 0;
        AD_Wait(AD_CLK_WIDTH);
        //AdDin = (bit)(x &0x80);
   //////////////////////////////////////
   if(x&0x80) AdDin=1;
   else AdDin=0;
   //////////////////////////////////////
   
        AD_Wait(AD_CLK_WIDTH);
        AdClk = 1;
        AD_Wait(AD_CLK_WIDTH);
        x <<= 1;
    }
}

//-------------------------------------------------------------------------
//函数名称     :ReadWord
//功能描述     :从AD7705读一个字
//输入参数     :无
//输出参数     :AD转换值(2字节)
//-------------------------------------------------------------------------
uint AD_ReadWord()
{
    uchar i;
    uint x;
    AdClk = 1;
    for (i = 0, x = 0; i < 16; i++)
    {
        AdClk = 0;
        AD_Wait(AD_CLK_WIDTH);
        x <<= 1;
        if (AdDout)//输出为1
        {
            x |= 0x01;
        }
        AdClk = 1;
        AD_Wait(AD_CLK_WIDTH);
    }
    return x;
}

//-------------------------------------------------------------------------
//函数名称     :Reset
//功能描述     :AD7705通信端口复位
//输入参数     :无
//输出参数     :无
//-------------------------------------------------------------------------
void AD_Reset()
{
    uchar i;
//	AdCS = 0;
    for (i = 0; i < 64; i++)
    {
        //多于连续32个 DIN=1 使串口复位
        AdClk = 0;
        AD_Wait(AD_CLK_WIDTH);
        AdDin = 1;
        AD_Wait(AD_CLK_WIDTH);
        AdClk = 1;
        AD_Wait(AD_CLK_WIDTH);
    }
//	AdCS = 1;
}

//-------------------------------------------------------------------------
//函数名称     :Ad7705Init
//功能描述     :AD7705初始化(非缓冲模式)
//输入参数     :输入通道channel ----1=IN1,2=IN2;
//              输入极性polarity----0=双极性,1=单极性;
//              增益gain -----------[1,2,4,8,16,32,64,128]
//输出参数     :无
//-------------------------------------------------------------------------
void AD_Init(uchar channel, uchar polarity, uchar gain)
{
    uchar x;

    AD_Reset(); //防止串口失步

//    AdCS = 0;   
    AD_WriteByte(0x20); //写ch0 clock register
    AD_WriteByte(0x07); //2MHz时钟,500Hz数据更新速率
    
    //WriteByte(0x21); //写CH1 clock register
    //WriteByte(0x03); //1MHz时钟,200Hz数据更新速率
    
    if (channel == 1)    //com register ,选择下步操作 setup register
    {
        AD_WriteByte(0x10);
    }
    else
    {
        AD_WriteByte(0x11);
    }
    

    if (polarity)//单极性
    {
        x = 0x04;
    }
    else//双极性
    {
        x = 0x00;
    }
    
    switch (gain)
    {
        case 1:
            x |= 0x40;
            break;
        case 2:
            x |= 0x48;
            break;
        case 4:
            x |= 0x50;
            break;
        case 8:
            x |= 0x58;
            break;
        case 16:
            x |= 0x60;
            break;
        case 32:
            x |= 0x68;
            break;
        case 64:
            x |= 0x70;
            break;
        case 128:
            x |= 0x78;
            break;
        default:
            x |= 0x40;
            break;
    }
    AD_WriteByte(x);
//	AdCS = 1;
}

//-------------------------------------------------------------------------
//函数名称     :Ad7705GetData
//功能描述     :读AD7705转换数据
//输入参数     :输入通道channel ----1=IN1,2=IN2;
//输出参数     :无
//-------------------------------------------------------------------------
void AD_GetData(uchar channel,uchar adchannel)
{
   uint timeout = 0;
    _CD4051(adchannel);
   AD_Init(1,2,1);

   while ( AdReady ) 
   {timeout++; if(timeout>6000) {AD_Reset();return;}}
   timeout = 0;
   while ( AdReady==0 ) 
   {timeout++;  if(timeout>6000) {AD_Reset();return;}}
   timeout = 0;
   while ( AdReady ) 
   {timeout++;  if(timeout>6000) {AD_Reset();return;}}

//	AdCS=0;

	if (channel == 1)
	{
		AD_WriteByte(0x38);
	}
	else
	{
	    AD_WriteByte(0x39);
	}
	g_iCurrADValue =  AD_ReadWord();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -