基于MSP430F5529单片机的ADS1115
[复制链接]
给大家带来还是TI公司出品的芯片——ads1115。
再看本篇之前最好先备好ads1115的datasheet。
(一)、芯片简介
ADS1115是具有内部基准、振荡器和可编程比较器且兼容 I2C 的ADS111x、超小型、低功耗 860SPS、16 位 ADC 。
在操作之前,你需要一块ads1115,一块单片机,CCS,还要会一点I2C协议的内容。
(二)、电路图
在这里先说明一下,为什么要接三个上拉电阻,因为在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;
}
3、main函数介绍
#include<msp430f5529.h>
#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);
}
}
|