#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
/*************************************************************************************/
volatile void delay_us(unsigned char a) //挺時(shí)1uS
{
volatile unsigned int i=0,j=0;
for(i=0;i<a;i++)
for(j=0;j<50;j++)
;
}
/*************************************************************************************/
//ads126發(fā)送一字節(jié)的數(shù)據(jù)
unsigned char ads_senddata(unsigned char data) //SPI發(fā)送數(shù)據(jù),要在外部保證SS = 0
{
SPDR = data; //啟動(dòng)數(shù)據(jù)傳輸
while((SPSR & 0x80) == 0); // 等待傳輸結(jié)束
data = SPDR;
return data;
}
/*************************************************************************************/
void ad_write(unsigned char reg,unsigned char data)//寫寄存器。選擇寄存器地址,寫入的數(shù)據(jù)。
{
PORTB&=~(1<<PB1); //SPI的CS=0使能
while((PIND&0X8)!=0); //DRDY信號高時(shí)才能寫寄存器
ads_senddata(0x50+reg);//選擇寫入寄存器
ads_senddata(0x00); //寫入1個(gè)寄存器
ads_senddata(data); //寫入數(shù)據(jù)
PORTB|=(1<<PB1); //SPI的CS=1,停止
delay_us(1); //挺時(shí)1uS //可更改。但讀數(shù)據(jù)必須在要等待最小一個(gè)采集周期(大約90ms)后。
}
/*************************************************************************************/
unsigned long int ad_read()//讀A/D數(shù)據(jù)。
{
unsigned long int sum=0;
unsigned char r=0,a=0;
PORTB&=~(1<<PB1); //SPI的CS=0使能
ads_senddata(0xfc); //SYNC AD同步
ads_senddata(0xff); //WAKEUP 喚醒,并啟動(dòng)AD轉(zhuǎn)換
while((PIND&0X8)!=0); //DRDY信號低時(shí)才能寫寄存器 ,等待轉(zhuǎn)換完畢
{
delay_us(1); //挺時(shí)1uS
ads_senddata(0x01); //發(fā)送讀取數(shù)據(jù)命令
delay_us(1); //挺時(shí)1uS
for (r=0;r<3;r++) //讀取24位數(shù)據(jù)
{
a=ads_senddata(0x00); //讀取數(shù)據(jù),先高位,后低位
sum|=a;
sum=sum<<8;
}
sum=sum>>8;
}
PORTB|=(1<<PB1); //SPI的CS=1,停止
sum=0xffffff-sum;
return sum;
delay_us(1); //挺時(shí)1uS
}
/*************************************************************************************/
void ADS1256(void) //初始化ADS1256
{
DDRD&=~(1<<PD3); //DRDY
PORTD|=(1<<PD3);
DDRD|=(1<<PD4); //START
PORTD|=(1<<PD4);
PORTB&=~(1<<PB2); //復(fù)位ADS1256
PORTB|=1<<PB2;
ad_write(00,0xf7); //初始化STATUS reg ID位為f,數(shù)據(jù)輸出高位在先,自動(dòng)校準(zhǔn)開,輸入緩沖關(guān)閉,DRDY高電平
ad_write(01,0x80); //初始化MUX reg 單端輸入第0通道為選通
ad_write(02,0x00); //初始化ADCOM reg 時(shí)鐘輸出關(guān)閉,傳感器檢測關(guān)閉,放大倍數(shù)為1
ad_write(03,0xf0); //初始化DRATE reg 數(shù)據(jù)速率為30K
ad_write(04,0x0f); //初始化DRATE reg 定義IO為輸出高電平,節(jié)能模式
}
/*************************************************************************************/
unsigned long int ads_sum(unsigned char data)//讀A/D數(shù)據(jù)。
{
unsigned long int aa=0;
if((data>=0)&&(data<=7))
{
ad_write(01,0x80+data); //第幾通道為選通
ads_senddata(0xf0); //自校準(zhǔn)
aa=ad_read(); //讀24位A/D數(shù)據(jù)。
}
return aa;
}
volatile unsigned char sum=0; //定義全局的指令變量
//設(shè)置串口的參數(shù)
void USART_Init( unsigned int baud )
{
/* 設(shè)置波特率9600*/
UBRRH = 0;
UBRRL = 47;
/* 接收器與發(fā)送器使能*/
UCSRB = (1<<TXCIE)|(1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
/* 設(shè)置幀格式: 8 個(gè)數(shù)據(jù)位, 2 個(gè)停止位*/
UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
}
void USART_Transmit( unsigned char data )
{PORTD|=(1<<PD2); //485輸出使能
/* 等待發(fā)送緩沖器為空 */
while ( !( UCSRA & (1<<UDRE)) )
;
/* 將數(shù)據(jù)放入緩沖器,發(fā)送數(shù)據(jù) */
UDR = data;
}
unsigned char USART_Receive( void )
{
/* 等待接收數(shù)據(jù)*/
while ( !(UCSRA & (1<<RXC)) )
;
/* 從緩沖器中獲取并返回?cái)?shù)據(jù)*/
return UDR;
}
SIGNAL (SIG_UART_RECV) //接收中斷
{sum=UDR;}
SIGNAL (SIG_UART_TRANS) //發(fā)送結(jié)束中斷
{PORTD&=~(1<<PD2); } //485輸入使能
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~配置SPI~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
void SPI_MasterInit(void) //配置SPI為主機(jī)
{
/* 設(shè)置MOSI 和SCK 為輸出,其他為輸入 */
DDRB|=(1<<PB1)|(1<<PB2)|(1<<PB3)|(1<<PB5);
DDRB&=~(1<<PB4);
PORTB|=(1<<PB1)|(1<<PB2)|(1<<PB4); //定義SS的使能端
/* 使能SPI 主機(jī)模式,設(shè)置時(shí)鐘速率為fck/16 */
SPCR = 0x52; //7e 高位首發(fā),SPI使能,主機(jī)模式,SCK空閑保持為低電平,數(shù)據(jù)在上升沿采樣,速率為1:64(FOSC/128)
SPSR = 0x01; //使能倍速1:32
}
//--------------------------------------------------------------------------------------------//
void port (void)
{
DDRD|=(1<<PD2); //485 cs
PORTD&=~(1<<PD2);
DDRB|=(1<<PB0); //power 燈
PORTB&=~(1<<PB0);
}
//主函數(shù)
main(void)
{
unsigned long int d=0,p[12],n=0,m=0;
unsigned char aa=0,a=0,b=0,c=0,i=0;
port(); //端口初始化
SPI_MasterInit(); //SPI端口初始化
USART_Init(1); //串口初始化
ADS1256(); //初始化ADS1256
sei();
while(1)
{
aa=sum;
if(aa<=10)
{sum=15;
a=0;b=0;c=0;n=0x400000;m=0;
for (i=0;i<12;i++)
{
p[i]=ads_sum(aa);//讀A/D數(shù)據(jù)。通道地址0~7 0、1、2、3、4、5、6、7
if(n>p[i])
n=p[i];
if (m<p[i])
m=p[i];
d=d+p[i];
}
d=(d-n-m)/10;
a=d%256;
d=d>>8;
b=d%256;
d=d>>8;
c=d%256;
USART_Transmit(c);
USART_Transmit(b);
USART_Transmit(a);
}
}
}