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

📄 ad7706.c

📁 采用普通单片机控制的电桥测试仪
💻 C
字号:
/*
*********************************************************************************************************
*										File Name:	AD7706.c
*
*								Last Modified Data: 2006-08-14
*
*										Last Version:V1.0
*
*								Description:完成对AD7706的控制
*
*********************************************************************************************************
*/
#define _AD7706_
#include <intrins.h>
#include "..\Inc\Include.h"

/*
********************************************************************************************************
* Function:RestAd7706
*
* Descriptions:复位AD7706
*
* Input:无
* 
* OutPut:无
*******************************************************************************************************
*/
void RestAd7706(void)
{
	uchar i;   
   	uint  k=0;
    bit   c=1; 

   	ADXiao=0;
   	Seq();
   	WriteToReg(0x20);             //0010 0000 写AIN1的时钟寄存器       
   	WriteToReg(0x0c);			  //0000 1100
   	WriteToReg(0x10);             //0001 0000 写ANI1的设置寄存器
   	WriteToReg(0x44);             //0100 0100
   	do
   	{    
		WriteToReg(0x08);
        i = ReadReg();
        k++;
        if(k>5000)  {  c=0;      ADXiao=1;  }
    }while(i&0x80&&c);
   	Delay3ms();
	WriteToReg(0x21);            //*clock register   0010 0001写AIN2的时钟寄存器  
   	WriteToReg(0x0c);			//					0000 1100
   	WriteToReg(0x11);            //*setup register	0001 0001写ANI2的设置寄存器
   	WriteToReg(0x44);            //44				0100 0100
   	do
   	{    
		WriteToReg(0x09);		// 0000 1001
        i = ReadReg();
        k++;
        if(k>5000) {  c=0;     ADXiao=1;     }
    }while(i&0x80&&c);
    
	Delay3ms();
   	
	WriteToReg(0x22);            //*clock register	 0010 0010
    WriteToReg(0x0c);			//					 0000 1100设置输出更新速率
    WriteToReg(0x12);            //*setup register	 0001 0010
    WriteToReg(0x44);            //32倍				 0100 0100用于选择工作模式和输入增益
    do
    {    
		WriteToReg(0x0a);		//0000 1010
        i=ReadReg();
        k++;
        if(k>5000) {  c=0;     ADXiao=1;     }
    }while(i&0x80&&c);
    Delay3ms();
   
	WriteToReg(0x23);            //*clock register	   0010 0011写AIN3的时钟寄存器
   	WriteToReg(0x0c);			//					   0000 1100
   	WriteToReg(0x13);            //*setup register	   0001 0011写ANI3的设置寄存器
   	WriteToReg(0x44);			//             		   0100 0100
   	do
   	{    
		WriteToReg(0x0b);        //0000 1011
        i=ReadReg();
        k++;
        if(k>5000) {  c=0;     ADXiao=1;        }
    }while(i&0x80&&c);
   	Delay3ms();
}

/*
********************************************************************************************************
* Function:Seq
*
* Descriptions:
*
* Input:无
* 
* OutPut:无
*******************************************************************************************************
*/
void Seq(void)
{ 
	uchar i;
    i = 40;
    ADSCLK1;
    ADSCLK0;
    ADDIN1;
    for(i=0;i<31;i++)
    {
    	ADSCLK1;
    	ADSCLK0;
  	}
  	ADSCLK1;
}

/*
********************************************************************************************************
* Function:ReadReg
*
* Descriptions:读寄存器的状态
*
* Input:无
* 
* OutPut:无
*******************************************************************************************************
*/
uchar ReadReg(void)
{ 
	uchar x = 0;
  	uchar i = 8;
	
	SDA_1=1;
  	ADSCLK0;
	do{
    	ADSCLK1;
      	if(SDA_1)
      	x = x|0x01;
      	if(i>1)
      	{ 
	     	x=x<<1;
         	ADSCLK0;
	  	}
    }while(--i);
  
  	return x;
}
/*
********************************************************************************************************
* Function:WriteToReg
*
* Descriptions:向AD7706的寄存器写数据
*
* Input:x 需要写入的数据
* 
* OutPut:无
*******************************************************************************************************
*/
void WriteToReg(uchar x)
{
	uchar i = 8;
  	
	do{
  		ADSCLK0;
  		if(x&0x80)	ADDIN1;	
		else	  	ADDIN0;
  		x = x<<1;
  		ADSCLK1;
	}while(--i);
}

/*
********************************************************************************************************
* Function:ReadData
*
* Descriptions:读AD7706转换的数据
*
* Input:无
* 
* OutPut:返回AD7706的状态
*******************************************************************************************************
*/
uint ReadData(void)
{ 
	uint x=0;
  	uchar i=16;
  
  	SDA_1 = 1 ;//SDA_1= P3^6;
 	ADSCLK0;
  	do{
    	ADSCLK1;
     	if((SDA_1&0x01)==1)
     	x = x|0x01;
     	if(i>1)
     	{
			x = x<<1;
      		ADSCLK0;
		}
    }while(--i);
	return x;
}


/*
********************************************************************************************************
* AD
*
* Descriptions:
*
* Input:无,
* 
* OutPut:返回AD代码值
*******************************************************************************************************
*/
uint AD(uchar x )
{
  uint  m=0,kk=0;
  uchar a,b,k=0;
  uchar c=1;

	if(x==1) 		{a=0x08;b=0x38;}
  	else if(x==2)   {a=0x09;b=0x39;}
  	else 			{a=0x0b;b=0x3b;}
   	do
   	{
		WriteToReg(a);                    // 读通信寄存器 时间判断 最大转化时间需要修改
		k = ReadReg();					 
        m++;							//延时
        if(m>6000) c=0 ;
    }while((k&0x80)&&c); 
	
	if(c)
    {
    	WriteToReg(b);//读数据寄存器
        kk=ReadData();
    }
    else kk=0;
	return kk;                        //要处理代码的极限
}

/*
********************************************************************************************************
* Function:Delay3ms
*
* Descriptions:3ms延时
*
* Input:无
* 
* OutPut:无
*******************************************************************************************************
*/
void Delay3ms(void)
{
	uint  k;
	for(k=0;k<500;k++);
}

/*
********************************************************************************************************
* Function:
*
* Descriptions:改变AD7706的增益
*
* Input:无
* 
* OutPut:无
*******************************************************************************************************
*/
void GainAD7706(uchar x)
{
   	uchar i;
   	uint  k=0;
   	bit   c=1;

	switch(x)
	{
		case 0: i=0x44;     ADGain=1;   break;
		case 1: i=0x44|1<<3;ADGain=2;   break;		   
		case 2:	i=0x44|2<<3;ADGain=4;   break;
		case 3:	i=0x44|3<<3;ADGain=8;   break;
		case 4:	i=0x44|4<<3;ADGain=16;  break;
		case 5:	i=0x44|5<<3;ADGain=32;  break;
		case 6:	i=0x44|6<<3;ADGain=64;  break;
		case 7:	i=0x44|7<<3;ADGain=128; break;
		default:i=0x44|7<<3;ADGain=128;	break;
	}
	WriteToReg(0x11); //写设置寄存器            
   	WriteToReg(i);              //44
   	do
   	{
		WriteToReg(0x08);		 
        i=ReadReg();
        k++;
        if(k>5000)  
		{  
			c=0; 
			ADXiao=1;  
		}
   	}while(i&0x80&&c);
}

⌨️ 快捷键说明

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