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

📄 ad7705.c

📁 AVR单片机读写AD7705源代码
💻 C
字号:
#include <iom16v.h> 
#include <macros.h>
#include "UART.c" 
#define uchar unsigned char 
#define uint unsigned int 
#define Add_key  PINC

#define VREF 50000 
  
#define CS_1				(PORTB|= (1<<4 ))  
#define CS_0				(PORTB&= ~(1<<4 ))  
#define LED_1				(PORTB|= (1<<0 ))  
#define LED_0				(PORTB&= ~(1<<0 ))  
#define LED1_1			(PORTB|= (1<<1 ))  
#define LED1_0			(PORTB&= ~(1<<1 ))  
#define DRDY				(PINB& 0x08)  
#define ADDR				(PINC& 0x01)  
#define SPE_1				(SPCR|= (1<<6 )) 
uint value1; 

//**********************短延时程序50us**************************// 
void delay50us(uint t) 
{ 
  uint j; 
  for(;t>0;t--) 
  	for(j=0;j<70;j++); 
} 
//**********************短延时程序5us**************************// 
void delay5us(uint t) 
{ 
  uint j; 
  for(;t>0;t--) 
		for(j=0;j<7;j++); 
} 
//**********************长延时程序50ms**************************// 
void delay50ms(uint t) 
{ 
	uint i;  
	for(;t>0;t--) 
		for(i=0;i<52642;i++);   
} 
//**************************端口初始化*************************// 
void IO_Init(void) 
{ 
	DDRC  = 0x00; 
	PORTC = 0x00; 
	DDRB  = 0b10110111;		//PB3\PB6输入 
	PORTB = 0b11110111;		//MISO输入加上拉电阻 
} 
void spi_init(void) 
{ 
	SPCR = 0b01011111; //使能SPI,MSB先发送,主机,SCK空闲高,模式三,128分频 
	SPSR = 0x00; //setup SPI,主机倍频 
	//CS_0;    //使能SPI器件 
} 

//******************SPI写寄存器函数*******************************// 
void WriteToReg_ADC(uint byteword) 
{ 
	CS_0;    //使能SPI器件 
	//SPE_1; 
	SPDR=byteword;		//发送数据 
	while(!(SPSR & (1<<SPIF)));//等待发送完毕 
	CS_1;    //禁止SPI器件 
	//delay5us(10); 
} 
//******************SPI读函数*******************************// 
unsigned char Read_Byte_SPI(void) 
{    
	SPDR = 0xff;  //发送数据,给AD7705提供脉冲 
	while (!(SPSR &(1<<SPIF))); 
	return SPDR; 
} 
//******************SPI读数据寄存器函数*******************************// 
uint Read_ADC16BitValue(void) 
{    
	uchar temp1=0; 
	uint temp=0;  
	CS_0;    //使能SPI器件 
	temp=Read_Byte_SPI(); 
	temp=temp<<8; 
	temp1=Read_Byte_SPI(); 
	temp=temp|temp1;  
	CS_1;    //禁止SPI器件 
	return temp; 
} 
//******************绿灯闪烁******************************// 
void greenled(void) 
{ 
	LED_0; 
	delay50us(50); 
	LED_1;  
	delay50us(50); 
	LED_0; 
	delay50us(50); 
	LED_1;  
	delay50us(50); 
} 
//******************绿灯闪烁******************************// 
void yellowled(void) 
{ 
	LED1_0; 
	delay50us(50); 
	LED1_1;  
	delay50us(50); 
	LED1_0; 
	delay50us(50); 
	LED1_1;  
	delay50us(50); 
} 
//**************************AD初始化*************************// 
void ADC_Init(void) 
{  
	uchar i; 
	for(i=10;i>0;i--) 
		WriteToReg_ADC(0xff);			//持续DIN高电平写操作,恢复AD7705接口 
	WriteToReg_ADC(0x20);       //通道1,下一个写时钟寄存器 
	WriteToReg_ADC(0x0c);       //写时钟寄存器设置更新速率为200hz 
	WriteToReg_ADC(0x10);       //通道1,下一个写设置寄存器 
	WriteToReg_ADC(0x44);       //自校准,增益1,单极,无缓冲 
	delay50us(100);             //延时 
	//WriteToReg_ADC(0x21);     //通道2,下一个写时钟寄存器 
	//WriteToReg_ADC(0x0c);     //写时钟寄存器设置更新速率为200hz 
	//WriteToReg_ADC(0x11);     //通道2,下一个写设置寄存器 
	//WriteToReg_ADC(0x44);     //自校准,增益1,单极,无缓冲 
	//delay50us(100);  
} 
//***************************读取****************************// 
void ceshi(void) 
{ 
	if(DRDY == 0)     //数据准备好 
	{ 
		WriteToReg_ADC(0x38);       //下一操作为读数据寄存器1 
		value1=Read_ADC16BitValue();//读取 
		LED_1;                 			//进入AD,指示等灭 
		yellowled();           			//黄灯闪烁
		put_asc16(value1*VREF/0xffff);
		CR; 
	} 
	greenled();               		//绿灯闪烁 
}

void main(void) 
{ 
	delay50us(100);   //延时等待外围器件稳定 
	IO_Init();
	uart0_init(); 
	spi_init(); 
	ADC_Init(); 
	
	while(1) 
	{  
		ceshi();         //读取AD数据 
	} 
} 

⌨️ 快捷键说明

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