📄 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 + -