AVR单片机驱动高精度AD芯片ADS1256的C程序

发布者:Qilin520最新更新时间:2015-06-19 来源: 51hei关键字:AVR单片机  AD芯片  ADS1256 手机看文章 扫描二维码
随时随地手机看文章
#include   

#include    
#include   


/*************************************************************************************/
volatile void delay_us(unsigned char a)   //挺时1uS
{  
volatile unsigned int i=0,j=0;
for(i=0;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<      while((PIND&0X8)!=0); //DRDY信号高时才能写寄存器   
     ads_senddata(0x50+reg);//选择写入寄存器      
     ads_senddata(0x00);    //写入1个寄存器      
     ads_senddata(data);    //写入数据
     PORTB|=(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<      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<          sum=0xffffff-sum;
         return  sum;
     delay_us(1);          //挺时1uS
}

/*************************************************************************************/
void  ADS1256(void)    //初始化ADS1256
{
DDRD&=~(1< PORTD|=(1< DDRD|=(1< PORTD|=(1< PORTB&=~(1< PORTB|=1< 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为输出高电平,节能模式            
}[page]

/*************************************************************************************/
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< /* 设置帧格式: 8 个数据位, 2 个停止位*/
UCSRC = (1< }

void USART_Transmit( unsigned char data )
{PORTD|=(1< /* 等待发送缓冲器为空 */
while ( !( UCSRA & (1< ;
/* 将数据放入缓冲器,发送数据 */
UDR = data;
}

unsigned char USART_Receive( void )
{
/* 等待接收数据*/
while ( !(UCSRA & (1< ;
/* 从缓冲器中获取并返回数据*/
return UDR;
}

 

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

SIGNAL (SIG_UART_TRANS) //发送结束中断
{PORTD&=~(1<


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

void SPI_MasterInit(void)     //配置SPI为主机   
{   
/* 设置MOSI 和SCK 为输出,其他为输入 */   
DDRB|=(1< DDRB&=~(1< PORTB|=(1< /* 使能SPI 主机模式,设置时钟速率为fck/16 */   
SPCR = 0x52; //7e 高位首发,SPI使能,主机模式,SCK空闲保持为低电平,数据在上升沿采样,速率为1:64(FOSC/128)   
SPSR = 0x01; //使能倍速1:32   
}  

//--------------------------------------------------------------------------------------------//  

void  port (void)   
{   
  DDRD|=(1<   PORTD&=~(1<   DDRB|=(1<   PORTB&=~(1<

}  


//主函数
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            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);  

      }   
  }     

关键字:AVR单片机  AD芯片  ADS1256 引用地址:AVR单片机驱动高精度AD芯片ADS1256的C程序

上一篇:比较简单的AVR单片机超声波测距的实例
下一篇:1602 AVR单片机版 报警指示功能

推荐阅读最新更新时间:2024-03-16 14:04

avr单片机eeprom初始化配置及说明
ATmega16 包含 512 字节的 EEPROM 数据存储器。它是作为一个独立的数据空间而存在的,可以按字节读写。 EEPROM 的寿命至少为 100,000 次擦除周期。 EEPROM 的访问 由地址寄存器、数据寄存器和控制寄存器决定。 /* EEPROM 数据存储器 EEPROM 地址寄存器(EEARH 和 EEARL) bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 EEAR7 EEAR6 EEAR5 EEAR4 EEAR3 EEAR2 EEAR1 EEAR0 Res: 保留 保留位,读操作返回值为零。 EEAR8..0
[单片机]
用MEGA8L做的AVR单片机USBASP
最近在学习AVR单片机的过程中遇到了一个很严重的问题,就是我用的笔记本没有并口,这样就无法给单片机下载程序,没有了程序,那单片机就只是一堆废物。这时突然想起之前学习51时自己做的一个USB转串口的东西直接给STC单片机下程序,那这次我何不自己做个USB口的ASP呢?说干就干,立马查资料。首先大家先了解下什么是 ASP 。 一、usbasp 的一般性介绍: 1、下载线,是 ISP (In System Programmability: 在系统编程 )或 IAP (In Application Programing: 在应用编程 ) ,都是 在线编程 的一种方式。 这里的 usbasp 下载线,则是指 利用ATMega8L芯片,模拟
[单片机]
用MEGA8L做的<font color='red'>AVR单片机</font>USBASP
AVR单片机创造机器生命
1 什么是机器生命 机器生命就是一个能自主生存的机器,一个自动为生存下去而奋斗的机器。对于机器生命来说,生存的含义就是不断电,继续运行。机器生命具有完全自主决策、自主行动、活动于未知世界、不需人类参与就能持续运行并且自我维护等特征。影片《终结者》中的天网就是超级机器生命。《霹雳5号》描述了一个机器人从无生命到有生命的过程。 N.维纳(Norbert Wiener,1894~1964)写《控制论》时创造出第一个机器生命Wiener龟,这个机器龟仅有2个电子管组成的模拟计算机,但它却能实现真正的乌龟觅食、睡觉、探索、逃避等行为,其表现如同一个有生命的生物一样。机器龟上面有太阳能电池,当自身电池快用完前,机器龟乐于寻找一个
[单片机]
用<font color='red'>AVR单片机</font>创造机器生命
基于AVR单片机的电动代步车控制器
本世纪将是一个人口老龄化程度越来越高的世纪,老年人和残疾人的护理将是社会的一个沉重负担。据老龄委统计结果显示,2004年底,中国60岁及以上老年人口为1.43亿,2014年将达到2亿,2026年将达到3亿,老龄人口的规模将越来越大。同时在我国人口中有8 296万残疾人,占全国总人口的比例为6.34%,其中肢体残疾人数2 412万,占29.07%。老年人和残疾人这个庞大的弱势群体需要一种适合他们心理和生理的代步车来满足日常生活及参与社会活动的需要。 随着科学技术的迅速发展和人民的生活水平的不断提高,手动轮椅逐渐被性能优越、操作简单、行驶安全的电动代步车所替代。电动代步车的出现除了能满足老年人或残疾人室内外活动的要求之外,还在医
[单片机]
基于<font color='red'>AVR单片机</font>的电动代步车控制器
AVR单片机控制的开关电源
单片机 控制开关电源,单从对电源输出的控制来说,可以有几种控制方式。 其一是 单片机 输出一个电压(经DA芯片或PWM方式),用作电源的基准电压。这种方式仅仅是用单片机代替了原来的基准电压,可以用按键输入电源的输出电压值,单片机并没有加入电源的反馈环,电源电路并没有什么改动。这种方式最简单。 其二是 单片机 扩展AD,不断检测电源的输出电压,根据电源输出电压与设定值之差,调整DA的输出,控制PWM芯片,间接控制电源的工作。这种方式单片机已加入到电源的反馈环中,代替原来的比较放大环节,单片机的程序要采用比较复杂的PID算法。 其三是 单片机 扩展AD,不断检测电源的输出电压,根据电源输出电压与设定值之差,输
[单片机]
基于AVR单片机硬件多机通讯功能的实现
通讯规则: 1:时钟7.3728MHz/波特率9600/9个数据位/奇校验/1个停止位/硬件多机通讯功能/ 2:通讯连接采用硬件MAX485,双向单工 3:每个上行/下行的数据包的字节个数都是一样的(通讯数据量) 4:每个上行/下行的数据包都采用CRC8校验 5:数据接收采用中断+查询的方式 6:总是由主机向从机发送一个数据包,从机收到数据包后向主机回复一个数据包 7:不管是主机还是从机,如果收到的数据包有任何错误,都将丢弃该数据包,等效于没有接收 8:从机之间不能相互通讯,必须通过主机才能交换数据 9:无效地址是0,主机地址是1,从机地址是2.3.4.。。.。。广播地址是255 */ #include #includ
[单片机]
基于<font color='red'>AVR单片机</font>硬件多机通讯功能的实现
AVR单片机模拟比较器
  模拟比较器对正极PB2(AINO)和负极PB3(AINI)的输入 电压 进行比较,当PB2的电压高于PB3的电压时,模拟比较器输出脚ACO置l。      模拟比较器的控制和状态寄存器ACSR地址为$018($28),复位时值为$O。各位定义如下:   ACD:模拟比较器禁止。置l时,模拟比较器的 电源 被关闭。改变ACD时,必须清ACIE位,否则将产生中断。      ACO:模拟比较器输出。ACO直接与模拟比较器的输出脚相连接。      ACI:模拟比较器中断标志。有模拟比较器输出事件时,该位置1。若ACIE置1,且SREG中的1置1,产生中断。中断执行后,ACI由硬件清O。      ACIE:模拟比较器中断使能
[单片机]
用<font color='red'>AVR单片机</font>模拟比较器
高性能DDS芯片AD9959及其应用
0 引言 AD9959是美国ADI公司最新推出的一款四通道高速直接数字频率合成器。该芯片内部集成了四个DDS核,因此可对四个内部同步输出通道独立进行编程。通过一个公用系统时钟在芯片内部同步其独立的通道,AD9959可以对由于模拟处理(例如滤波、放大)或者PCB布线失配而产生的外部信号通道的不均衡进行有效的校正,从而使系统工程师用相当少的时间和精力去处理这个通常很复杂的系统设计问题。 1 AD9959的主要特点 AD9959可以实现最多16电平的频率、相位和幅度调制,还可以工作在线性调频、调相或调幅模式。AD9959的应用范围包括相控阵列雷达/卢纳系统、仪表、同步时钟和RF信号源。AD9959的内部结构如图1所示,主要特性如下
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved