基于MSP430F5529单片机的ADS1115

基于MSP430F5529单片机的ADS1115

今天给大家带来还是TI公司出品的芯片——ads1115。
再看本篇之前最好先备好ads1115的datasheet。

(一)、芯片简介

ADS1115是具有内部基准、振荡器和可编程比较器且兼容 I2C 的ADS111x、超小型、低功耗 860SPS、16 位 ADC 。
在操作之前,你需要一块ads1115,一块单片机,CCS,还要会一点I2C协议的内容。

(二)、电路图

基于MSP430F5529单片机的ADS1115_第1张图片
在这里先说明一下,为什么要接三个上拉电阻,因为在datasheet里面有明确的要求。

(三)、核心代码

1、ads1115通讯

首先来说说ads1115与430单片机之间的通讯,该通讯是采用I2C协议。

/******************************
 * 2 start i2c 启动
 ****************************/
void start()
{
    SCL_H;
    SDA_H;
    delay();
    SDA_L;
    delay();
    SCL_L;
}
/********************************
 * 3  结束 I2c
 ********************************/
void stop()  //和例程不太一样!
{
    SCL_L;
    SDA_L;
    delay();
    SCL_H;
    delay();
    SDA_H;
}
/******************
 * 4 i2c主机应答操作
 *******************/
void mack(void)
{
    SDA_L;
    _NOP();
    _NOP();
    SCL_H;
    delay();
    SCL_L;
    _NOP();
    _NOP();
    SDA_H;
    delay();
}
/**********************
 * 5 i2c 主机无应答操作
 *******************/
void mnack()
{
    SDA_H;
    _NOP();
    _NOP();
    SCL_H;
    delay();
    SCL_L;
    _NOP();
    _NOP();
    SDA_L;
    delay();
}
/*************
 * 6
 */
void ack()
{
    uchar i=0;
    SDA_in;
    SCL_H;
    delay();
    while((P3IN&BIT5)&&(i<250))
        i++;
    SDA_out;
    SCL_L;
    delay();
}
/************************
 * 7  写1
 *************************/
void write1()
{
    SDA_H;
    delay();
    SCL_H;
    delay();
    SCL_L;
    delay();
}
/********************8
 * 8  写0
 */
void write0()
{
    SDA_L;
    delay();
    SCL_H;
    delay();
    SCL_L;
    delay();
}
/*************
 * 9  写字节
 */
void write1byte(uchar data)
{
    uchar i;
    for(i=8;i>0;i--)
    {
        if(data&0x80)
            write1();
        else
            write0();
        data<<=1;
    }
    SDA_H;
    _NOP();
}
/**************
 *   读字节
 */
uchar read1byte(void)
{
 uchar  rdata = 0x00,i;
    uchar flag;
     for(i = 0;i < 8;i++)
     {
      SDA_H;
      SCL_H;
      SDA_in;
      flag = SDA_val;
      rdata <<= 1;
      if(flag)
          rdata |= 0x01;
       SDA_out;
        SCL_L;
     }
return rdata;
}

2、ads1115写指令与得到数值

接下来我们介绍ads1115的核心代码。

/*
 * 1115写寄存器
 */

void Confige1115(uchar channel)
{
    uchar a_channel;
    switch(channel)
    {
    case 0:
        a_channel=0xC0;   //单通道输入
        break;
    case 1:
          a_channel=0xD0;
          break;
    case 2:
          a_channel=0xE0;
          break;
    case 3:
          a_channel=0xF0;
          break;
    case 4:
        a_channel=0x84;    //差分输入 的指令
    default :
          break;

    }
    start();
    write1byte(address);
    ack();
    write1byte(config);
    ack();
    write1byte(a_channel);
    ack();
    write1byte(Li);
    ack();
    stop();

}
/*
 * 读取数值
 */
uint read1115(void)

{
  uchar result_l,result_h;
  uint result;
  start();
  write1byte(address);
  ack();
   write1byte(conversion);
  ack();
  stop();
  start();
  write1byte(address+1);
   ack();
  result_h=read1byte();
   mack();
  result_l=read1byte();
  ack();
  stop();
  result=result_h*256+result_l;
  return result;
}

uint  Start_1115(uchar temp)
{
  uint result_gd;
  Confige1115(temp);
  //delay_ms(5);
  _NOP();
  result_gd=read1115();
  //delay_ms(5);
  _NOP();
  return result_gd;
}
/*
 * 1115初始化
 */

void ads1115_init()
{
    P1DIR|=BIT4;   //SCL
    P1DIR|=BIT5;   //SDA
    SCL_H;
    SDA_H;
}

3、main函数介绍

#include
#include"ads1115.h"
#include"LCD12864.h"
#include"stdio.h"
#include"math.h"

unsigned int valuex[];

unsigned int value_0;
unsigned long temp;
unsigned char result[6];

void float_to_result(int value_temp)
{
    temp = (float)value_temp*0.6250190741;           //将AD值转化为数组  6.144/32767*10000
    result[0] = (temp/10000)+'0';
    result[1] =  '.';
    result[1] = (temp/1000%10)+'0';
    result[2] = (temp/100%10)+'0';
    result[3] = (temp/10%10)+'0';
    result[4] = (temp%10)+'0';
}


void main()
{
    WDTCTL=WDTPW+WDTHOLD;
    LCD_Ioinit();      //12864显示初始化
    LCD_Init();
    LCD_Clean();
    LCD_Write(0,0,"电压:");
    ads1115_init();
    while(1)
    {

        value_0=Start_1115(0);               //得到数值
        float_to_result(value_0);                //数值转化为数组以便输出
        LCD_Setpos(1,0);
        LCD_Writestring(result,6);
    }
}

(四)、结语

以上就是本次给大家带来的内容,介于博主能力有限,如有错误,请及时指出。如有疑问,可以在评论区提出。
最后,如果有小伙伴想要完整的源代码,包含以上全部内容(main,ads1115c文件和头文件,12864c文件和头文件),可以下载。
https://download.csdn.net/download/qq_40890957/11584116

你可能感兴趣的:(基于MSP430F5529单片机的ADS1115)