单片机
返回首页

MEGA16读AD7705程序

2016-10-28 来源:eefocus

#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();               //绿灯闪烁  

    }         

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 光控音效发生器电路

  • 非常简单的150W功放电路图

  • 一个简单的警笛电路图

  • 一个简单的立体声平衡指示器电路

  • 分享一个电网倾角计电路

  • 使用NE555和磁簧开关的橱柜照明电路

    相关电子头条文章