ADS1115 模拟IIC

这篇具有很好参考价值的文章主要介绍了ADS1115 模拟IIC。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 ADS1115是16位ADC,基准源内部可选,PGA 可提供从 ±256mV 到 ±6.144V 的输入范围。

 ADS1115 模拟IIC,单片机,嵌入式硬件

 地址可由ADDR引脚决定,一般接地,地址为0x90

写寄存器地址为0x90,读寄存器地址为0x91

ADS1115 模拟IIC,单片机,嵌入式硬件

 ADS1115有4个控制寄存器,0x00,0x01,0x02

0x00

ADS1115 模拟IIC,单片机,嵌入式硬件

 0x01:配置通道、增益、基准源等

ADS1115 模拟IIC,单片机,嵌入式硬件

ADS1115 模拟IIC,单片机,嵌入式硬件

 ADS1115 模拟IIC,单片机,嵌入式硬件

 0x02

ADS1115 模拟IIC,单片机,嵌入式硬件

 ADS1115 模拟IIC,单片机,嵌入式硬件

 读数据流程:

(1)发送地址0x90

(2)发送0x01寄存器地址( 配置通道等)

(3)发送0x01地址中高位数据

(4)发送0x01地址中低位数据

(5)发送地址0x90

(6)发送0x00寄存器地址

(7)发送地址0x91(表示读数据)

(8)读该通道数据

模拟IIC代码

#include <STC15F2K60S2.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit SDA = P1^5; // I2C数据线
sbit SCL = P1^4; // I2C时钟线
sbit ADDR = P1^6; 
sbit ALRT = P1^7; 

//延时替换掉,我用的是12T	   IAP15F2K60S2是1T
void delay5us(uint x)   //延时5us
{
		uint y;
    uchar a;
		for(y=0;y<x;y++)
			for(a=1;a>0;a--);
}

void delay_ms(uint x)   //延时1ms
{
	uint y;
	unsigned char a,b;
	for(y=0;y<x;y++)
		for(b=199;b>0;b--)
				for(a=1;a>0;a--);
}
//延时替换掉,我用的是12T	   IAP15F2K60S2是1T


/**
  * 函数功能: CPU发起I2C总线启动信号
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明:无
  */
void I2C_Start(void)
{
	/* 当SCL高电平时,SDA出现一个下跳沿表示I2C总线启动信号 */
	SDA =	1;
	SCL = 1;
	delay5us(1);
	SDA =	0;
	delay5us(1);
	SCL = 0;
	delay5us(1);
}

/**
  * 函数功能: CPU发起I2C总线停止信号
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明:无
  */
void I2C_Stop(void)
{
	/* 当SCL高电平时,SDA出现一个上跳沿表示I2C总线停止信号 */
	SDA =	0;
	SCL = 1;
	delay5us(1);
	SDA =	1;
}
/**
  * 函数功能: CPU向I2C总线设备发送8bit数据
  * 输入参数: Byte : 等待发送的字节
  * 返 回 值: 无
  * 说    明:无
  */
void I2C_SendByte(uchar Byte)
{
	uchar i;
	/* 先发送字节的高位bit7 */
	for (i = 0; i < 8; i++)
	{		
		if (Byte & 0x80)
		{
			SDA =	1;
		}
		else
		{
			SDA =	0;
		}
		delay5us(1);
		SCL = 1;
		delay5us(1);	
		SCL = 0;
		if (i == 7)
		{
			SDA =	1; // 释放总线
		}
		Byte <<= 1;	/* 左移一个bit */
		delay5us(1);
	}
}


/**
  * 函数功能: CPU从I2C总线设备读取8bit数据
  * 输入参数: 无
  * 返 回 值: 读到的数据
  * 说    明:无
  */
uchar I2C_ReadByte(uchar ack)
{
	uchar i;
	uchar value;
	/* 读到第1个bit为数据的bit7 */
	value = 0;
	for (i = 0; i < 8; i++)
	{
		value <<= 1;
		SCL = 1;
		delay5us(1);
		if (SDA)
		{
			value++;
		}
		SCL = 0;
		delay5us(1);
	}
  if(ack==0)
		I2C_NAck();
	else
		I2C_Ack();
	return value;
}

/**
  * 函数功能: CPU产生一个时钟,并读取器件的ACK应答信号
  * 输入参数: 无
  * 返 回 值: 返回0表示正确应答,1表示无器件响应
  * 说    明:无
  */
uchar I2C_WaitAck(void)
{
	uchar re;
	SDA =	1;	/* CPU释放SDA总线 */
	delay5us(1);
	SCL = 1;	/* CPU驱动SCL = 1, 此时器件会返回ACK应答 */
	delay5us(1);
	if (SDA)	/* CPU读取SDA口线状态 */
	{
		re = 1;
	}
	else
	{
		re = 0;
	}
	SCL = 0;
	delay5us(1);
	return re;
}

/**
  * 函数功能: CPU产生一个ACK信号
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明:无
  */
void I2C_Ack(void)
{
	SDA =	0;	/* CPU驱动SDA = 0 */
	delay5us(1);
	SCL = 1;	/* CPU产生1个时钟 */
	delay5us(1);
	SCL = 0;
	delay5us(1);
	SDA =	1;	/* CPU释放SDA总线 */
}

/**
  * 函数功能: CPU产生1个NACK信号
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明:无
  */
void I2C_NAck(void)
{
	SDA =	1;	/* CPU驱动SDA = 1 */
	delay5us(1);
	SCL = 1;	/* CPU产生1个时钟 */
	delay5us(1);
	SCL = 0;
	delay5us(1);
}



uchar Read_Reg1(uchar dev_add,uchar RegIndex)
{
	uchar receive=0;

	I2C_Start();
	I2C_SendByte(dev_add);
	I2C_WaitAck();
	I2C_SendByte(RegIndex);
	I2C_WaitAck();
	
	I2C_Start();
	I2C_SendByte(dev_add+1);
	I2C_WaitAck();	
	receive=I2C_ReadByte(0);
	I2C_Stop();	 
	return receive;
}

void IIC_Write_Reg(uchar dev_add,uchar RegIndex,uchar data1)
{
	I2C_Start();
	I2C_SendByte(dev_add);
	I2C_WaitAck();
	I2C_SendByte(RegIndex);
	I2C_WaitAck();
	I2C_SendByte(data1);
	I2C_WaitAck();
	I2C_Stop();
}

ADS1115代码 

/*****************Pointer Register*************/
#define REG_Conversion 0x00
#define REG_config		 0x01
#define REG_L_thresh 	 0x02
#define REG_H_thresh 	 0x03

/*****************Conversion Register**********/
//存放着16位结果

/*****************Config Register**********/
#define OS 		1 		//Operational status or single-shot conversion start操作状态或单发转换启动
#define MUX 	0x04 	//[2:0]Input multiplexer configuration输入多路配置
#define PGA 	0x01	//Programmable gain amplifier configuration可编程增益放大器配置
#define MODE  0x00	//Device operating mode设备运行方式

 

#define DR				0x04//Data rate/数据速率
#define	COMP_MODE	0 	// Comparator mode比较器模式
#define COMP_POL 	0		//Comparator polarity/比较器极性
#define COMP_LAT	0 	//Latching comparator
#define COMP_QUE	0x3	//Comparator queue and disable

#define config_MSB (OS << 7)|(MUX << 4)|(PGA << 1)|(MODE)//0xC2
#define config_LSB (DR << 5)|(COMP_MODE << 4)|(COMP_POL << 3)|(COMP_LAT << 2)|(COMP_QUE)

/*****************Lo_thresh Register**********/
#define Lo_thresh	0x8000	// Low threshold value
#define Hi_thresh 0x7FFF	// High threshold value

void ADS1115_Write(uchar Reg , uchar reg_MSB , uchar reg_LSB)
{	
	I2C_Start();								// 起始信号
	I2C_SendByte(0x90+0);				// 0x90地址+0写位
	while(I2C_WaitAck());				// 等待应答信号,低电平有效
	I2C_SendByte(Reg);					// 发送0x01寄存器地址( 配置通道等)
	while(I2C_WaitAck());				// 等待应答信号,低电平有效
	I2C_SendByte(reg_MSB);			// 发送0x01地址中高位数据
	while(I2C_WaitAck());				// 等待应答信号,低电平有效
	I2C_SendByte(reg_LSB);			// 发送0x01地址中低位数据
	while(I2C_WaitAck());				// 等待应答信号,低电平有效
	I2C_Stop();									// 停止信号
}
float ADS1115_ReadAD()
{
	float ret;
	uint data1;
	I2C_Start();										// 起始信号
	I2C_SendByte(0x90+0);						// 0x90地址+0写位
	while(I2C_WaitAck());						// 等待应答信号,低电平有效
	I2C_SendByte(REG_Conversion);		// 发送0x00寄存器地址
	while(I2C_WaitAck());						// 等待应答信号,低电平有效
	I2C_Stop();											// 停止信号
	
	delay5us(1);
	I2C_Start();										// 起始信号
	I2C_SendByte(0x90+1);						// 0x90地址+1读位
	while(I2C_WaitAck());						// 等待应答信号,低电平有效
	data1 = I2C_ReadByte(1);				// 读前8位
	data1 = (data1 <<	8)&0xff00;		// 前8位
	data1+=	I2C_ReadByte(1);				// 读后8位
	I2C_Stop();											// 停止信号
	
	
	//数值计算取决于PGA配置  PGA:FSR = ±4.096 V(1)
	if(data1>0x8000)
		ret=((float)(0xffff-data1)/32768.0)*4.096;
	else
		ret=((float)data1/32768.0)*4.096;
	
	return ret;
	
}

void ADS115_config(uchar channel)//channel表示通道 0-3
{
	ADS1115_Write(REG_config, config_MSB|(channel<<4) ,config_LSB);
}

  串口代码

void UartInit()		// 9600bps@11.0592MHz
{
	PCON &= 0x7F;		// 波特率不倍速
	SCON = 0x40;		// 8位数据,仅用于发送
	TMOD &= 0x0F;		// 清除定时器1模式位
	TMOD |= 0x20;		// 设定定时器1为8位自动重装方式
	
	TL1 = 0xFD;		  // 设定定时初值
	TH1 = 0xFD;		  // 设定定时初值
	
	ET1 = 0;		    // 禁止定时器1中断
	TR1 = 1;		    // 启动定时器1
}


void UART_SendByte(unsigned char Byte)//串口发送一个字节数据
{
	SBUF=Byte;
	//检测是否完成
	while(TI==0);
	TI=0;//TI复位
}

void UART_String(unsigned char *str)//串口发送一个字符串
{
	while(*str!='\0')
	{
		UART_SendByte(*str++);
	}
}

主函数代码

void main()
{
		uint Vol;// 电压值
		uint x;  // 通道累加,0-3
		ADDR = 0; 
    ALRT = 0; 
		UartInit();//换成自己的串口	
    while(1)
    {
			x=3;
			ADS115_config(x);   //选通道,0-3
			Vol=ADS1115_ReadAD()*1000;
	
			UART_String("Vol");
			UART_SendByte(x+48);
			UART_String(":");
			UART_SendByte(Vol/1000+48);
			UART_SendByte(Vol%1000/100+48);
			UART_SendByte(Vol%1000%100/10+48);
			UART_SendByte(Vol%1000%100%10+48);
			UART_String("mv\r\n");
			
			delay_ms(1000);
    }
}

 ADS1115 模拟IIC,单片机,嵌入式硬件

ADS1115 模拟IIC,单片机,嵌入式硬件

ADS1115 模拟IIC,单片机,嵌入式硬件

 ADS1115 模拟IIC,单片机,嵌入式硬件

ADS1115 模拟IIC,单片机,嵌入式硬件 文章来源地址https://www.toymoban.com/news/detail-702279.html

到了这里,关于ADS1115 模拟IIC的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 51单片机(IIC协议OLED屏)

    1.1、概述:IIC全称Inter-Integrated Circuit (集成电路总线) 是由PHILIPS公司在80年代开发的两线式串行总线,用于连接微控制器及其外围设备。IIC属于半双 工同步通信方式 1.2、特点:简单性和有效性。 由于接口直接在组件之上,因此IIC总线占用的空间非常小,减少了电路板的空间和

    2024年01月22日
    浏览(38)
  • STM32单片机初学5-IIC通信驱动OLED屏幕

    在我上篇文章(STM32-软件模拟IIC通信)讲解了软件模拟IIC通信。这篇文章详将细讲解利用软件模拟IIC来控制0.96寸的OLED屏幕(如下图),使其显示字符串。本文将不再对IIC通信原理做详细讲解,所以对IIC通信原理不熟悉的话可以参考我上篇文章(点击上面的链接直接跳转)。

    2023年04月10日
    浏览(33)
  • 单片机/嵌入式小白教程—硬件(三)51单片机最小系统

    目录 简介 51单片机器件原理图 复位电路 供电电路 晶振电路 下载电路 最小系统原理图  更加方便的51单片机 传统51单片机最小系统包含:复位电路、供电电路、晶振电路、下载电路   其中, 第9脚(RST)为复位引脚, 第40脚(VCC)第20脚(GND)为供电引脚, 第19脚(XTAL1)第

    2024年02月08日
    浏览(57)
  • 【51单片机】EEPROM-IIC实验(按键控制数码管)

    目录   🎁I2C总线 ​编辑 🎁代码 🏳️‍🌈main.c 🏳️‍🌈i2.c 🎆代码分析   I2C总线是Philips公司在八十年代初推出的一种串行、半双工的总线,主要用于近距离、低速的芯片之间的通信;I2C总线有两根双向的信号线,一根 数据线SDA 用于收发数据,一根 时钟线SCL 用于通信

    2024年02月11日
    浏览(38)
  • 嵌入式(二)单片机基础 | 单片机特点 内部结构 最小系统 电源 晶振 复位

    上一篇文章我们介绍了嵌入式系统 嵌入式系统(Embedded System)是一种特定用途的计算机系统,它通常嵌入在更大的产品或系统中,用于控制、监测或执行特定的任务。这些系统通常由硬件和软件组成,旨在满足特定的需求,如嵌入在家电、汽车、医疗设备、工业自动化、消费

    2024年02月02日
    浏览(89)
  • 嵌入式和单片机

    凡是从事信息技术相关工作的,一定都听说过嵌入式和单片机。 大家都知道,这两个名词,和硬件系统有着非常密切的关系。 但是,如果要问具体什么是嵌入式,什么是单片机,它们之间究竟有什么区别,我相信大部分人并不能解释清楚。 今天,小编就给大家做一个入门科

    2024年02月07日
    浏览(43)
  • 【单片机毕设选题】stm32实现车牌识别系统 -物联网 嵌入式 单片机

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月20日
    浏览(44)
  • 单片机项目分享 stm32机器视觉的人脸识别系统 - 单片机 物联网 嵌入式

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年01月22日
    浏览(59)
  • 单片机项目分享 基于stm32的便携用电功率统计系统 -物联网 嵌入式 单片机

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月19日
    浏览(76)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包