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

📄 ad7714.c

📁 The use of 24 ad measuring voltage converter chip AD7714
💻 C
字号:
/*
	AD7714(24Bit ADC) ATmega8L 1MHz
	zhb2000
	20060611
	USART 串口输出显示
*/
#include <avr/io.h>
#include <avr/delay.h>
#include "ad7714.h"

volatile char buff[4];							//接收数据缓冲

void init(void);
void spiSend(uchar data);
void spiRead(void);
void waitReady(void);
void usartInit(void);								//USART串口初使化
void usartPutchar(uchar data);			//发送8位数据
uchar usartGetchar(void);						//接收8位数据
void usartReceive(void);						//接收字符串
void usartSend(char *str);					//发送字符串
int main(void)
{
	init();
	_delay_ms(200);
	setb(PORTB,CS);	//CS 为高
	_delay_ms(200);
	spiSend(0x20);	//下一次操作滤波high regist,设置通道AIN1-AIN6
	spiSend(0x47);	//set 24bit FS11~FS9=(0111)2 (双极性方式 单极性方式)
	spiSend(0x30);	//下一次操作滤波low regist,设置通道AIN1-AIN6
	spiSend(0xa0);	//set F8~F1=(10100000)2  code=2000
	spiSend(0x10);	//下一次操作模式寄存器,设置通道AIN1-AIN6
	spiSend(0x20);	//增益为1,自校准
	while(PINB&(1<<DRDY));	//等待转换好
	while(1)
	{
		//读命令寄存器,判断DRAD位是否为0
		waitReady();
		spiSend(0x58);					//注 0101 1 100 (0101 选数据寄存器,1 R/W=1读 , 100 AIN1-AIN2)
		//取数 连读3字节
		spiRead();
		usartPutchar(buff[0]);
		usartPutchar(buff[1]);
		usartPutchar(buff[2]);
		usartPutchar(0x00);
	}
	return 0;
}

void init()
{
	uint baud=25;					//baud 2400
	PORTB=0x85;	//(PORTB 10000101)
	DDRB=0x2d;	//(DDRB  00101101)
	PORTC=0xff;
	DDRC=0xff;
	PORTD=0xff;
	DDRD=0xff;
	
	//SPI 初使化为主机 fosc/128
	SPCR=(1<<MSTR)|(1<<SPR1)|(1<<SPR0);	//(1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0);
	
	UBRRH=(baud>>8);
	UBRRL=baud;
	UCSRA=0x0;
	UCSRB=(1<<RXEN)|(1<<TXEN);								//允许接收和发送
	UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);		//8位数据,1位停止位
}

void spiSend(uchar data)
{
	spiStart();
	clrb(PORTB,CS);
	SPDR=data;
	while(!(SPSR&(1<<SPIF)));
	setb(PORTB,CS);
	spiStop();
	wink();
	_delay_ms(200);
	_delay_ms(200);
	_delay_ms(100);
}

void spiRead()
{
	//while(PINB&(1<<DRDY));	//等待转换好
	spiStart();
	clrb(PORTB,CS);
	//start
	SPDR=0;	//1
	while(!(SPSR&(1<<SPIF)));
	buff[0]=SPDR;
	SPDR=0;	//2
	while(!(SPSR&(1<<SPIF)));
	buff[1]=SPDR;
	SPDR=0;	//3
	while(!(SPSR&(1<<SPIF)));
	buff[2]=SPDR;
	setb(PORTB,CS);
	spiStop();
}

void waitReady()
{
	uchar n=0xff;
	clrb(PORTB,CS);
	while(!tstb(n,DRDY))
	{
		spiSend(0x08);		//下一次操作通信寄存器

		//tst DRDY is ok
		spiStart();
		SPDR=0xaa;			//无用的数据,保持最高位为1
		while(!(SPSR&(1<<SPIF)));
		n=SPDR;
		spiStop();
	}
	setb(PORTB,CS);
}
	
void usartPutchar(uchar data)
{
	while(!tstb(UCSRA,UDRE));				//等待发送标致完成
	UDR=data;											//发送数据
}

uchar usartGetchar(void)
{
	while(!tstb(UCSRA,RXC));				//等待接收标致好
	return UDR;
}

void usartReceive(void)
{
	volatile uchar *p=buff;
	uchar i=0;
	for(i=0;i<3;i++) buff[i]=0xff;
	buff[3]=0;
	while(*p!=0)
	{
		*p=usartGetchar();	//执行usartGetchar()则取出几个字符
		p++;
	}
}

void usartSend(char *str)
{
	uchar *p=str;
	while(*p)
	{
		usartPutchar(*p);
		p++;
	}
}

⌨️ 快捷键说明

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