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

📄 ad.c

📁 ad7705运行成功程序
💻 C
字号:
/*****************************************************************
 ** 文件名:AD.c
 ** Copyright (c) 中国地质大学
 ** 创建人:赵帅
 ** 日  期:2007-8-24	
 ** 描  述:AD7705 16位串行AD转换芯片,自带增益可调和校准 
 ** 版  本:Version 1.00	
 *****************************************************************/

#include <reg52.h>
#define uchar unsigned char
#define uint  unsigned int
#define	ulong unsigned long

//------------------------------------------------------------------------------------
// Global CONSTANTS
//-----------------------------------------------------------------------------------
  
sbit AdReady = P1^7;
sbit AdClk = P1^4;
sbit AdDin  = P1^5;
sbit AdDout = P1^6;
//sbit AdCS = P2^6;//AD7705片选

//常数
#define CH1 1 //AD7705输入通道IN1
#define CH2 2 //AD7705输入通道IN2
#define BIPOLAR 0 //AD7705双极性输入
#define UNIPOLAR 1 //AD7705单极性输入
#define AD_CLK_WIDTH 10 //AD7705串口时钟脉冲宽度
//全局变量
uint g_iCurrADValue;
uchar DisData[8];
//-------------------------------------------------------------------------
//函数名称     :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);
        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, bit polarity, uchar gain)
{
    uchar x;

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

    AdCS = 0;   
    //AD_WriteByte(0x20); //写ch0 clock register
    //AD_WriteByte(0x07); //2MHz时钟,500Hz数据更新速率
    
    AD_WriteByte(0x21); //写CH1 clock register
    AD_WriteByte(0x07); //1MHz时钟,500Hz数据更新速率
    
    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)
{
   uint timeout = 0;

   AD_Init(channel,1,1);

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

	AdCS=0;

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


  uint exchange(uint value)
  {
  	   uint tp;
	   uchar i;
	   for(i=0;i<16;i++)
	   {
	   	   tp<<=1;
		   if(value&0x0001==1)
		     tp=tp|0x0001;
		   else
		     tp=tp&0xfffe;
		   value>>=1;
	   
	   }
	   return tp;
  
  }


  void  DataConvert(uint value)
  {
  
  	   uchar i;
	   ulong temp;
	   temp=(ulong)value;
	   DisData[0]=temp/13107;
	   temp=temp%13107;
	   DisData[1]=0x2e;	
	   for(i=2;i<8;i++)
	   {
	   		temp=temp*10;
			DisData[i]=	temp/13107;		   //  13107=65535/5V
			temp=temp%13107;
			
	   }
  
  }

  

⌨️ 快捷键说明

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