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

📄 ad7705liping._c

📁 基于mega128上实现ad7705的驱动程序
💻 _C
字号:
/*
 PB0--SCLK;输出
 PB1--DIN; 输出
 PB2--DOUT;输入
 PB3--DRDY;输入
 PB4--REST;此处未用
 PA---输出指示
*/
#include <iom16v.h>
#include <macros.h>
#include <delay.h>
#include "LCD16021.h"
//#include <putt.h>

#define uchar unsigned char 
#define uint 	unsigned int 
//REST=PB4 此处我们不加
//#define AD7705_RET_SET	(PORTB|= (1<<4 )) 
//#define AD7705_RET_CLR  (PORTB&= ~(1<<4 )) 
//DRDY=PD7
#define AD7705_READY    (PIND& (1<<7 )) 
//sclk=PD3
#define AD7705_CLK_SET  (PORTD |= (1<<3 )) 
#define AD7705_CLK_CLR  (PORTD &= ~(1<<3)) 
//DOUT=PD6
#define AD7705_DOUT     (PIND& (1<<6 )) 
//DIN=1/=0=PD5
#define AD7705_DIN_SET  (PORTD|= (1<<5)) 
#define AD7705_DIN_CLR  (PORTD&= ~(1<<5 )) 

#define SETBIT(x,y) 		( x |= ( 1 << y ) )      
#define CLRBIT(x,y) 		( x &= ( ~ ( 1 << y ) )  
#define CHKBIT(x,y) 		( x & ( 1 << y ) )      
#define INVBIT(x,y) 		( x ^= ( 1 << y ) )     
#define CHKBIT(x,y) 		( x & ( 1 << y ) )   

uchar strin[]={"liping"};

/////////////////////////////////////////
unsigned char adc[5];
///////////////读读读读读读//////////////////
/*
unsigned int Read16()    
{
	uchar bData;
	unsigned char cLoop;
	unsigned int cData;
	for(cLoop=0;cLoop<16;cLoop++)
	{
		AD7705_CLK_CLR;   //上升沿
		delay_nus(2);
		AD7705_CLK_SET;
		delay_nus(2);
		bData=AD7705_DOUT;//有资料说高8位和低8位分别倒序,而不是对16位一起倒序噢
		cData<<=1;
		if(AD7705_DOUT)
		{
			cData|=0x01;
		}
		delay_nus(10);
	}
	return cData;
}
*/
unsigned int Read16()    
{
	uchar bData;
	unsigned char cLoop;
	unsigned int 	cData=0;
	for(cLoop=0;cLoop<16;cLoop++)
	{
	   
		AD7705_CLK_CLR;   //上升沿
		//delay_nus(2); 
		cData<<=1;
		bData=AD7705_DOUT;//有资料说高8位和低8位分别倒序,而不是对16位一起倒序噢
		if(bData)//AD7705_DOUT)
		{
			cData|=0x01;		//cData的初始值=0;
		}
		AD7705_CLK_SET;
		//delay_nus(5);
	}
	AD7705_CLK_SET;
	//AD7705_DIN_SET;
	return cData;
}
///////////////////写写写写写写//////////////////////
/*
void Write8(unsigned char cData)
{
	unsigned char cLoop;
	for(cLoop=0;cLoop<8;cLoop++)
	{
		AD7705_CLK_SET; //下降沿??
		delay_nus(5);
		AD7705_CLK_CLR;
		delay_nus(5);
		if((cData&0x80)==0)
		{
			AD7705_DIN_CLR;
		}
		else
		{
			AD7705_DIN_SET;
		}
		AD7705_CLK_SET;
		delay_nus(5);
		//clk=1;
		cData<<=1;
	}
}
*/
	void Write8(unsigned char c)
{
	unsigned char cLoop,cData;
	cData=c;//chang(c);
	for(cLoop=0;cLoop<8;cLoop++)
	{
	    AD7705_CLK_CLR; 		//CLK=0
		//delay_nus(2);
		if((cData&0x80)==0)
		{
			AD7705_DIN_CLR;
		}
		else
		{
			AD7705_DIN_SET;
		}
		AD7705_CLK_SET;	    
		//delay_nus(5);
		cData<<=1;
	}
}
//
/////////////////初始化初始化初始化////////////////////////
void AD7705_init(void)
{
	uchar i;
	//AD7705_RET_CLR;
	//delay_nms(5);
	//AD7705_RET_SET ;
	AD7705_DIN_SET; 
  	for(i=0;i<100;i++)//prevent interface from losting
  {
    AD7705_CLK_CLR;
    AD7705_CLK_SET;
  }  
    AD7705_DIN_SET;
	//dout=1;
	Write8(0x20);//写通 信寄存器选择通道0  AIN1,下一步操作的对象为写“时钟寄存器”(20H
	Write8(0x06);//写 时钟寄存器,根据使用的主时钟频率选择时钟位为1.数据更新率为250 Hz(06
	Write8(0x10);//写通信寄存器选择通道0  AIN1,下一步操作的对 象为写“设置寄存器"( lOH )
	Write8(0x54);//写设置寄存器,使增益为1、自校准方式,单极性模拟信号(44H)
} 
//////////////住函数主函数主函数////////////////////////
void main(void)  
{ 
   	uint AD_data;
	long num,out;
	uchar tempH,tempL,i;
	DDRD=0X3F;
	DDRA=0XFF;
	//PORTA=0X0F;
	LCD_INI();
	LCD_Clear();
 	LCD_Display_String (2,1,strin);	
	 AD7705_init();
	 while(1)
	 { 	   
		//delay_nms(100);
		while(AD7705_READY)//(PINB&0x08)==1)则一直等待,直到DRDY=0
		   ;   
		Write8(0x38);//(PINB&0x08)==0)说明DRDY=0,则开始读数据
		AD7705_CLK_SET;  
		AD_data=0;
		//	delay_nus(5);
		AD_data=Read16();
	    	//puts(AD_data);
/////////////////以下是数据处理///////////////////////////////
    	tempL=AD_data;  //低位开赋值
	  	tempH=AD_data>>8;
		//tempH=chang(tempH);
		//tempL=chang(tempL);
		//num=((chang(tempH))*256+(chang(tempL)));
		//num=(int)num;
	  	num=tempH*256+tempL;
       // num*=256;                     //乘以100,给2个小数
      //  num/=262;//65535;        num*2.50*100/65535基准电压扩大100倍得到实际的电压值
 	      for(i=0;i<5;i++)
    		{
   		    	adc[i]=num%10;
   			    num/=10;
  		    }  
 	LCD_DisplayString (1,1,adc);//	disp(adc); 
		//PORTA=AD_data;
	delay_nms(1000);
	}
}
/////////////////////////////////////////////

/**--------------------数码管显示 数码管显示----------------------------------*
void disp(uchar result[4])
{
  unsigned char j;       
  unsigned char leddat[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//0-9
  unsigned char ledadd[]={0xf7,0xfb,0xfd,0xfe};   //共阴数码管
  //unsigned char leddat[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  //unsigned char ledadd[]={0x10,0x20,0x40,0x80};
  DDRD=0XFF;
 // PORTD=0XFF;
  DDRA=0XFF;
  //0xff;       //指示输出 
 for(j=0;j<=3;j++)  
   {	     
   //PORTD=0XFF;                                           //数码管暂停显示,达到动态显示的目的   
    // delay_nms(5);
     PORTD=ledadd[j];                           //送地址	
    if(j==2)                                   //显示小数点   
    PORTA=leddat[result[j]]-0x80;            //送数据
	else     
	 PORTA=leddat[result[j]];
	 delay_nms(6);
   PORTA=0XFF; 
   }   
}

////////////////////////////单片机输入倒序/////////////////
uchar chang(uchar a)
{
 uchar i,b;
 b=a&0x01;
 for(i=0;i<8;i++)
   {
     b=b<<1;
	 a>>=1;
	 b=b+(a&0x01);
   }
 return (b);
}
*/

⌨️ 快捷键说明

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