久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

AVR單片機驅動高精度AD芯片ADS1256的C程序

作者:佚名   來源:mcuc   點擊數:  更新時間:2013年10月31日   【字體:

#include <avr/io.h>  
#include <avr/interrupt.h>  
#include <avr/signal.h>  


/*************************************************************************************/
volatile void delay_us(unsigned char a)   //挺時1uS

volatile unsigned int i=0,j=0;
for(i=0;i<a;i++)
for(j=0;j<50;j++)
;
}

/*************************************************************************************/
//ads126發送一字節的數據 
unsigned char ads_senddata(unsigned char data)  //SPI發送數據,要在外部保證SS = 0 
{
SPDR = data;                //啟動數據傳輸 
while((SPSR & 0x80) == 0); // 等待傳輸結束 
data = SPDR; 
return data; 
}

/*************************************************************************************/
void ad_write(unsigned char reg,unsigned char data)//寫寄存器。選擇寄存器地址,寫入的數據。
{              
     PORTB&=~(1<<PB1);      //SPI的CS=0使能
     while((PIND&0X8)!=0); //DRDY信號高時才能寫寄存器  
     ads_senddata(0x50+reg);//選擇寫入寄存器     
     ads_senddata(0x00);    //寫入1個寄存器     
     ads_senddata(data);    //寫入數據
     PORTB|=(1<<PB1);       //SPI的CS=1,停止
     delay_us(1);          //挺時1uS     //可更改。但讀數據必須在要等待最小一個采集周期(大約90ms)后。
}
/*************************************************************************************/
unsigned long int ad_read()//讀A/D數據。
{    
     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     喚醒,并啟動AD轉換
     while((PIND&0X8)!=0);    //DRDY信號低時才能寫寄存器   ,等待轉換完畢
        {
                 delay_us(1);         //挺時1uS
         ads_senddata(0x01);  //發送讀取數據命令
                 delay_us(1);         //挺時1uS
         for (r=0;r<3;r++)   //讀取24位數據
            {
                   a=ads_senddata(0x00); //讀取數據,先高位,后低位
                   sum|=a;
                   sum=sum<<8;
            }
                 sum=sum>>8;
                }
     PORTB|=(1<<PB1);     //SPI的CS=1,停止
         sum=0xffffff-sum;
         return  sum;
     delay_us(1);          //挺時1uS
}

/*************************************************************************************/
void  ADS1256(void)    //初始化ADS1256
{
DDRD&=~(1<<PD3);   //DRDY
PORTD|=(1<<PD3);  
DDRD|=(1<<PD4);    //START
PORTD|=(1<<PD4);  
PORTB&=~(1<<PB2);     //復位ADS1256
PORTB|=1<<PB2;
ad_write(00,0xf7);     //初始化STATUS reg  ID位為f,數據輸出高位在先,自動校準開,輸入緩沖關閉,DRDY高電平
ad_write(01,0x80);     //初始化MUX    reg  單端輸入第0通道為選通
ad_write(02,0x00);     //初始化ADCOM  reg  時鐘輸出關閉,傳感器檢測關閉,放大倍數為1
ad_write(03,0xf0);     //初始化DRATE  reg  數據速率為30K
ad_write(04,0x0f);     //初始化DRATE  reg  定義IO為輸出高電平,節能模式           
}

/*************************************************************************************/
unsigned long int ads_sum(unsigned char data)//讀A/D數據。
  {  
     unsigned long int aa=0;
         if((data>=0)&&(data<=7))
        {
                ad_write(01,0x80+data);     //第幾通道為選通
            ads_senddata(0xf0);         //自校準
            aa=ad_read();               //讀24位A/D數據。
                }
         return aa;
  }

volatile unsigned char sum=0;    //定義全局的指令變量

//設置串口的參數
void USART_Init( unsigned int baud )
{
/* 設置波特率9600*/
UBRRH = 0;
UBRRL = 47;
/* 接收器與發送器使能*/
UCSRB = (1<<TXCIE)|(1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
/* 設置幀格式: 8 個數據位, 2 個停止位*/
UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
}

void USART_Transmit( unsigned char data )
{PORTD|=(1<<PD2);   //485輸出使能
/* 等待發送緩沖器為空 */
while ( !( UCSRA & (1<<UDRE)) )
;
/* 將數據放入緩沖器,發送數據 */
UDR = data;
}

unsigned char USART_Receive( void )
{
/* 等待接收數據*/
while ( !(UCSRA & (1<<RXC)) )
;
/* 從緩沖器中獲取并返回數據*/
return UDR;
}

 

SIGNAL (SIG_UART_RECV)  //接收中斷
{sum=UDR;}  

SIGNAL (SIG_UART_TRANS) //發送結束中斷
{PORTD&=~(1<<PD2); }    //485輸入使能


//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~配置SPI~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  

void SPI_MasterInit(void)     //配置SPI為主機  
{  
/* 設置MOSI 和SCK 為輸出,其他為輸入 */  
DDRB|=(1<<PB1)|(1<<PB2)|(1<<PB3)|(1<<PB5);  
DDRB&=~(1<<PB4);  
PORTB|=(1<<PB1)|(1<<PB2)|(1<<PB4); //定義SS的使能端  
/* 使能SPI 主機模式,設置時鐘速率為fck/16 */  
SPCR = 0x52; //7e 高位首發,SPI使能,主機模式,SCK空閑保持為低電平,數據在上升沿采樣,速率為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);    

}  


//主函數
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數據。通道地址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);  

      }  
  }    

關閉窗口

相關文章

主站蜘蛛池模板: 日韩亚洲欧美一区 | 日韩免费在线观看视频 | 久久精品无码一区二区三区 | 久久精品毛片 | 嫩草一区二区三区 | 精品在线一区 | 国产成人精品久久二区二区 | 午夜视频在线免费观看 | 日韩福利片 | 免费成年网站 | 国产午夜精品一区二区三区四区 | 91社区在线高清 | 日韩网站在线 | 欧美成人精品一区二区男人看 | 在线观看亚洲精品视频 | 国产高清在线 | 欧美亚洲国产一区二区三区 | 男人av的天堂 | 亚洲精品日韩在线 | 中日韩毛片 | 成人精品一区二区三区 | 四虎影院免费在线播放 | 午夜精品视频在线观看 | 国产日韩欧美激情 | 国产精品日本一区二区不卡视频 | 四虎最新地址 | 91看片在线观看 | 午夜国产一级 | 精品国产乱码久久久久久丨区2区 | 九一国产精品 | 91久久北条麻妃一区二区三区 | 国产免费观看一级国产 | 成人一区二区在线 | 亚洲成人动漫在线观看 | 精品粉嫩aⅴ一区二区三区四区 | 女生羞羞视频 | 日本精品一区 | 日韩精品视频一区二区三区 | 密室大逃脱第六季大神版在线观看 | 三级高清| 午夜av电影院 |