MEGA16读AD7705程序

发布者:Yaqi最新更新时间:2016-10-28 来源: eefocus关键字:MEGA16  读AD7705 手机看文章 扫描二维码
随时随地手机看文章
#include  

#include  
#define uchar unsigned char 
#define uint unsigned int 
#define Add_key  PINC 
  
#define CS_1        (PORTB|= (1<<4 ))  
#define CS_0        (PORTB&= ~(1<<4 ))  
#define LED_1       (PORTB|= (1<<0 ))  
#define LED_0       (PORTB&= ~(1<<0 ))  
#define LED1_1       (PORTB|= (1<<1 ))  
#define LED1_0       (PORTB&= ~(1<<1 ))  
#define DRDY        (PINB& 0x08)  
#define ADDR        (PINC& 0x01)  
#define SPE_1       (SPCR|= (1<<6 )) 
uint value,value1,value2; 

//**********************短延时程序50us**************************// 
void delay50us(uint t) 

    uint j;                 
    for(;t>0;t--)                         
        for(j=0;j<70;j++)         
            ; 

//**********************短延时程序5us**************************// 
void delay5us(uint t) 

    uint j;                 
    for(;t>0;t--)                         
        for(j=0;j<7;j++)         
            ; 

//**********************长延时程序50ms**************************// 
void delay50ms(uint t) 

        uint i;  
        for(;t>0;t--) 
                for(i=0;i<52642;i++) 
                        ;                                                                  

//**************************端口初始化*************************// 
void IO_Init(void) 

 DDRC=0x00; 
 PORTC=0x00; 
  DDRB=0b10110111;   //PB3\PB6输入 
 PORTB=0b11110111; //MISO输入加上拉电阻 

void spi_init(void) 

 SPCR = 0b01011111; //使能SPI,MSB先发送,主机,SCK空闲高,模式三,128分频 
 SPSR = 0x00; //setup SPI,主机倍频 
 //CS_0;    //使能SPI器件 


//******************SPI写寄存器函数*******************************// 
void WriteToReg_ADC(uint byteword) 

   CS_0;    //使能SPI器件 
  //SPE_1; 
  SPDR=byteword;       //发送数据 
  while(!(SPSR & (1<    CS_1;    //禁止SPI器件 
//  delay5us(10); 

//******************SPI读函数*******************************// 
unsigned char Read_Byte_SPI(void) 
{    
    SPDR = 0xff;  //发送数据,给AD7705提供脉冲 
    while (!(SPSR &(1<     return SPDR; 

//******************SPI读数据寄存器函数*******************************// 
uint Read_ADC16BitValue(void) 
{    
    uchar temp1=0; 
    uint temp=0;  
         CS_0;    //使能SPI器件 
        temp=Read_Byte_SPI(); 
        temp=temp<<8; 
        temp1=Read_Byte_SPI(); 
        temp=temp|temp1;  
         CS_1;    //禁止SPI器件 
        return temp; 

//******************绿灯闪烁******************************// 
void greenled(void) 

           LED_0; 
          delay50us(50); 
          LED_1;  
          delay50us(50); 
          LED_0; 
          delay50us(50); 
          LED_1;  
          delay50us(50); 

//******************绿灯闪烁******************************// 
void yellowled(void) 

           LED1_0; 
          delay50us(50); 
          LED1_1;  
          delay50us(50); 
          LED1_0; 
          delay50us(50); 
          LED1_1;  
          delay50us(50); 

//**************************AD初始化*************************// 
void ADC_Init(void) 
{  
  uchar i; 
   for(i=10;i>0;i--) 
    {WriteToReg_ADC(0xff);}  //持续DIN高电平写操作,恢复AD7705接口 
 WriteToReg_ADC(0x20);       //通道1,下一个写时钟寄存器 
 WriteToReg_ADC(0x0c);       //写时钟寄存器设置更新速率为200hz 
 WriteToReg_ADC(0x10);       //通道1,下一个写设置寄存器 
 WriteToReg_ADC(0x44);       //自校准,增益1,单极,无缓冲 
 delay50us(100);              //延时 
//WriteToReg_ADC(0x21);       //通道2,下一个写时钟寄存器 
// WriteToReg_ADC(0x0c);       //写时钟寄存器设置更新速率为200hz 
// WriteToReg_ADC(0x11);       //通道2,下一个写设置寄存器 
//WriteToReg_ADC(0x44);       //自校准,增益1,单极,无缓冲 
// delay50us(100);  

//***************************读取****************************// 
void ceshi(void) 

  if(DRDY==0)     //数据准备好 
          {         
           
           WriteToReg_ADC(0x38);       //下一操作为读数据寄存器1 
           value1=Read_ADC16BitValue();//读取 
           
          LED_1;                 //进入AD,指示等灭 
           yellowled();           //黄灯闪烁 
          } 
  greenled();               //绿灯闪烁 

void main(void) 

        delay50us(100);   //延时等待外围器件稳定 
        IO_Init(); 
        spi_init(); 
        ADC_Init(); 

        while(1) 
        {  
         ceshi();         //读取AD数据 
    }         

------------------------------------------------------------------- 
AD7705精度在16位,第一次用16位的AD,很好....先前一直不能正确读取数值.是因为AD7705坏了,损坏的原因是设计上的失误,我把REF IN+接地了,REF IN-接参考电压..后来重新焊接了一个板子,把REF IN+修改了.就好了,哎,不是问题的问题!! 
大家看下面的图,REF IN+接错了,其它的还是比较准确的,程序已经测试过了,谁要用的着的,可以看看, 
MEGA16读AD7705程序 - 潇洒一回 - 芯的起点

两个通道依次读取,注意写通讯寄存器的数值, 
#include  
#include  
#define uchar unsigned char 
#define uint unsigned int 
#define Add_key  PINC 
  
#define CS_1        (PORTB|= (1<<4 ))  
#define CS_0        (PORTB&= ~(1<<4 ))  
#define LED_1       (PORTB|= (1<<0 ))  
#define LED_0       (PORTB&= ~(1<<0 ))  
#define LED1_1       (PORTB|= (1<<1 ))  
#define LED1_0       (PORTB&= ~(1<<1 ))  
#define DRDY        (PINB& 0x08)  
#define ADDR        (PINC& 0x01)  
#define SPE_1       (SPCR|= (1<<6 )) 
uint value,value1,value2; 
uchar ch_flag=0; 
//**********************短延时程序50us**************************// 
void delay50us(uint t) 

    uint j;                 
    for(;t>0;t--)                         
        for(j=0;j<70;j++)         
            ; 

//**********************短延时程序5us**************************// 
void delay5us(uint t) 

    uint j;                 
    for(;t>0;t--)                         
        for(j=0;j<7;j++)         
            ; 

//**********************长延时程序50ms**************************// 
void delay50ms(uint t) 

        uint i;  
        for(;t>0;t--) 
                for(i=0;i<52642;i++) 
                        ;                                                                  

//**************************端口初始化*************************// 
void IO_Init(void) 

 DDRC=0x00; 
 PORTC=0x00; 
  DDRB=0b10110111;   //PB3\PB6输入 
 PORTB=0b11110111; //MISO输入加上拉电阻 

void spi_init(void) 

 SPCR = 0b01011111; //使能SPI,MSB先发送,主机,SCK空闲高,模式三,128分频 
 SPSR = 0x00; //setup SPI,主机倍频 
 //CS_0;    //使能SPI器件 


//******************SPI写寄存器函数 8BIT*******************************// 
void WriteToReg_ADC(uchar byteword) 

   CS_0;    //使能SPI器件 
  //SPE_1; 
  SPDR=byteword;       //发送数据 
  while(!(SPSR & (1<    CS_1;    //禁止SPI器件 
//  delay5us(10); 

//******************SPI读函数 8BIT*******************************// 
unsigned char Read_Byte_SPI(void) 
{    
    SPDR = 0xff;  //发送数据,给AD7705提供脉冲 
    while (!(SPSR &(1<     return SPDR; 

//******************SPI读数据寄存器函数 16BIT****************************// 
uint Read_ADC16BitValue(void) 
{    
    uchar temp1=0; 
    uint temp=0;  
         CS_0;    //使能SPI器件 
        temp=Read_Byte_SPI(); 
        temp=temp<<8; 
        temp1=Read_Byte_SPI(); 
        temp=temp|temp1;  
         CS_1;    //禁止SPI器件 
        return temp; 

//******************绿灯闪烁******************************// 
void greenled(void) 

           LED_0; 
          delay50us(50); 
          LED_1;  
          delay50us(50); 
          LED_0; 
          delay50us(50); 
          LED_1;  
          delay50us(50); 

//******************绿灯闪烁******************************// 
void yellowled(void) 

           LED1_0; 
          delay50us(50); 
          LED1_1;  
          delay50us(50); 
          LED1_0; 
          delay50us(50); 
          LED1_1;  
          delay50us(50); 

//**************************AD初始化*************************// 
void ADC_Init(void) 
{  
  uchar i; 
   for(i=10;i>0;i--) 
    {WriteToReg_ADC(0xff);}  //持续DIN高电平写操作,恢复AD7705接口 
 WriteToReg_ADC(0x20);       //通道1,下一个写时钟寄存器 
 WriteToReg_ADC(0x0a);       //写时钟寄存器设置更新速率为200hz 
 WriteToReg_ADC(0x10);       //通道1,下一个写设置寄存器 
 WriteToReg_ADC(0x40);       //自校准,增益1,双极,缓冲 
 delay50us(100);              //延时 
 WriteToReg_ADC(0x21);       //通道2,下一个写时钟寄存器 
 WriteToReg_ADC(0x0a);       //写时钟寄存器设置更新速率为200hz 
 WriteToReg_ADC(0x11);       //通道2,下一个写设置寄存器 
 WriteToReg_ADC(0x40);       //自校准,增益1,双极,缓冲 
 delay50us(100);  


//***************************按照通道1读取****************************// 
void Read_ch1(void) 

  uint temp1=0; 
  if(DRDY==0)     //数据准备好 
          {                   
           
           temp1=Read_ADC16BitValue();//读取           
           LED_1;                 //进入AD,指示等灭 
           yellowled();           //黄灯闪烁 
          } 
    greenled();               //绿灯闪烁 
        value1=temp1; 
        WriteToReg_ADC(0x39);// 下一操作为读数据寄存器2 

//***************************按照通道2读取****************************// 
void Read_ch2(void) 

  uint temp2=0; 
  if(DRDY==0)     //数据准备好 
          {                   
            
           temp2=Read_ADC16BitValue();//读取           
           LED_1;                 //进入AD,指示等灭 
           yellowled();           //黄灯闪烁 
          } 
    greenled();               //绿灯闪烁 
        value2=temp2; 
        WriteToReg_ADC(0x38);       //下一操作为读数据寄存器1 

//********************获取两个通道模拟量数值***************// 
void get_ad(void) 

  if(DRDY==0)     //数据准备好 
  { 
    ch_flag++; 
        if(ch_flag==0x03) 
        {ch_flag=0x00;} 
   
  if(ch_flag==0x01) 
  { Read_ch1();}   
  if(ch_flag==0x02) 
  { Read_ch2();}  
   
  } 
  

//***********************主程序*********************************// 
void main(void) 

        delay50us(100);   //延时等待外围器件稳定 
        IO_Init(); 
        spi_init(); 
        ADC_Init(); 

        while(1) 
        { 
   get_ad(); 
        greenled(); greenled(); greenled();               //绿灯闪烁  

    }         

关键字:MEGA16  读AD7705 引用地址:MEGA16读AD7705程序

上一篇:带SPI接口的16位AD7705驱动程序
下一篇:KS0108 128*64 LCD C语言驱动

推荐阅读最新更新时间:2024-03-16 15:18

基于AVR单片机Megal6的电子时钟设计
1 引言   数字钟能长期、连续、可靠、稳定地工作;同时还具有体积小,功耗低等特点,便于携带,使用方便。数字钟是采用数字电路实现对“时、分、秒”数字显示的计时装置,广泛应用于个人家庭、车站、码头、办公室等公共场所,已成为人们日常生活中不可缺少的必需品。由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。传统MCS51系列单片机的所有数据处理都基于一个累加器,因此累加器与程序存储器、数据存储器之间的数据转换就成了单片机的瓶颈;在AVR单片机中,寄存器由32个通用工作寄存器组成,并且任何一个寄存器都能充当累加器,从
[单片机]
基于AVR单片机Megal6的电子时钟设计
AVR笔记8:mega16再次锁死
今天尝试使用11.0592MHz外部晶振来设置USART的波特率,没想到理解错误,把熔丝位设置为外部RC振荡CKSEL=1000,下载完成后就知道出问题了,有了上次芯片锁死的经历,这次就也不慌了,知道问题出在哪儿,借来函数信号发射器,给13引脚的XTAL1加入1MHz的脉冲,成功的解锁了。然后再次上网查这方面的资料,发现因这样出错的还不少,使用外部晶振,得将熔丝位设置为CKSEL=1111,这样才是正确的。 虽然,在尝试的过程中出现了一些不大不小的错误,但是通过尝试进步了,学到东西了,还是比较兴奋地。不能因为害怕出现问题或者是犯错,而不敢去尝试,人总是在不断的尝试中成长起来的。 【转载】马潮老师 AVR芯片锁
[单片机]
MEGA16单片机_AD转换程序
AD转换,编程的寄存器有: ADMUX:多工选择寄存器。参考电压、对齐方式、模拟通道及增益选择位 ADCSR(A):使能、中断标志、中断使能、预分频值等 ADCL、ADCH:数据寄存器 SFI0R:特殊功能寄存器 //////////////////////////////////////////////////////////////////////////////////////////////////// #ifndef __AD_H__ #define __AD_H__ #include iom16v.h #include macros.h #define uchar unsigned char #d
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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