ADS1115 模拟IIC

news2024/11/28 16:35:23

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

 

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

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

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

0x00

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

 

 0x02

 

 读数据流程:

(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);
    }
}

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/992291.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

debian apt安装mysqlodbc

mysql的deb包下载地址 下载后上传到linux后&#xff0c; #安装deb包 apt install ./mysql-apt-config_0.8.26-1_all.deb #更新源 apt-get update #搜索包 apt search odbc #安装包 apt-get install mysql-connector-odbc

3. 自定义datasource

一、自定义DataSource ​ 自定义DataSource有两大类&#xff1a;单线程的DataSource和多线程的DataSource 单线程&#xff1a;继承 SourceFunction 多线程&#xff1a;继承 ParallelSourceFunction&#xff0c;继承 RichParallelSourceFunction&#xff08;可以有其他的很多操…

origin中optimal cluster安装报错解决

1.在安装之后程序运行出错&#xff0c;报错信息为缺少numpy包。解决办法&#xff1a;打开窗口-脚本窗口&#xff0c;用pip安装numpy&#xff0c;其他缺少的包可用同样方法解决。 2.有的包在外部python中才有&#xff0c;通过origin无法下载。解决办法&#xff1a;在连接-python…

WIFI版本云音响设置教程阿里云平台版本

文章目录 WIFI本云音响设置教程介绍一、申请设备三元素1.登录阿里云物联网平台2.创建产品3.设置产品参数4.添加设备5.获取三元素 二、设置设备三元素1.打开MQTTConfigTools2.计算MQTT参数3.使用windows电脑的WIFI连接到设备热点4.设置参数5.配置设备连接路由器 三、阿里云物联网…

有始有终!

作者 | 磊哥 来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09; 转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09; 开始是立秋之日&#xff08;8.8 号&#xff09;&#xff0c;结束是白露之时&#xff08;9.8 号&#xff09;。 为期一月&…

Day60|leetcode 84.柱状图中最大的矩形

leetcode 84.柱状图中最大的矩形 题目链接&#xff1a;84. 柱状图中最大的矩形 - 力扣&#xff08;LeetCode&#xff09; 视频链接&#xff1a;单调栈&#xff0c;又一次经典来袭&#xff01; LeetCode&#xff1a;84.柱状图中最大的矩形_哔哩哔哩_bilibili 题目概述 给定 n 个…

CSS3技巧36:backdrop-filter 背景滤镜

CSS3 有 filter 滤镜属性&#xff0c;能给内容&#xff0c;尤其是图片&#xff0c;添加各种滤镜效果。 filter 滤镜详见博文&#xff1a;CSS3中强大的filter(滤镜)属性_css3滤镜_stones4zd的博客-CSDN博客 后续&#xff0c;CSS3 又新增了 backdrop-filter 背景滤镜。 backdr…

卷积概念理解

卷积(convolution)最容易理解的解释_一点一点的进步的博客-CSDN博客 图像处理之卷积模式及C实现_利用卷积模型分类图片 c_扫地工的博客-CSDN博客 卷积的重要的物理意义是&#xff1a;一个函数&#xff08;如&#xff1a;单位响应&#xff09;在另一个函数&#xff08;如&…

进程

目录 进程定义 进程与程序对比 进程分类 系统进程 用户进程 交互进程 批处理进程 守护进程 进程状态 进程组成 ​编辑正文段&#xff08;text&#xff09;和用户数据段 用户数据段 正文段 PCB进程控制块 进程标识信息 处理机状态 进程调度信息 进程控制信息 …

通达信自定义副图行业指标K线指标 HYZS_QD

行业指数:HY_INDEXC,NODRAW; DRAWKLINE(HY_INDEXH,HY_INDEXO,HY_INDEXL,HY_INDEXC); MA5:MA(HY_INDEXC,5),COLORWHITE; {MA10:MA(HY_INDEXC,10),COLORYELLOW,LINETHICK2}; DRAWTEXT_FIX(1,1,1,1,STRCAT(STRCAT(CON2STR(HY_INDEXADV,0),/),STRCAT(CON2STR(HY_INDEXDEC,0), ))),…

06_瑞萨GUI(LVGL)移植实战教程之驱动EC11旋转编码器(GPIO)

本系列教程配套出有视频教程&#xff0c;观看地址&#xff1a;https://www.bilibili.com/video/BV1gV4y1e7Sg 6. 驱动EC11旋转编码器(GPIO) 本次实验我们驱动EC11旋转编码器。 6.1 复制工程 上次实验得出的工程我们可以通过复制在原有的基础上得到一个新的工程。 如果你不清…

XCE18T4K1P40-FJJP40、F4Z1P40规格书(泰兴创航)

关于XCE18T4K1P40-FJJP40、F4Z1P40电连接器规格书 主要性能指标 工作温度&#xff1a;-55℃~200℃相对湿度&#xff1a;温度40℃2℃时达98%振动&#xff1a;频率10-2000Hz&#xff0c;加速度196m/s2冲击&#xff1a;加速度980m/s2机械寿命&#xff1a;5000次壳体材料&#xff1…

05_瑞萨GUI(LVGL)移植实战教程之添加LVGL库,对接显示和触摸驱动

本系列教程配套出有视频教程&#xff0c;观看地址&#xff1a;https://www.bilibili.com/video/BV1gV4y1e7Sg 5. 添加LVGL库&#xff0c;对接显示和触摸驱动 本次实验我们会融合前面实验的成果&#xff0c;添加LVGL库&#xff0c;对接显示和触摸驱动&#xff0c;让屏幕能显示…

金蝶云星空与泛微OA集成的方案落地与实践

打破信息孤岛&#xff0c;泛微OA集成的方案落地与实践 在现代企业内部&#xff0c;不同类型的业务系统和泛微OA平台层出不穷。企业需要找到一种高效的方法来整合和协同这些多样化的系统&#xff0c;同时将它们与泛微OA平台融合&#xff0c;以实现资源整合和高度协同的办公环境…

Win10下python的命令行启动和调用问题

Win10下python的命令行启动和调用问题 Win10下Python的启动问题解决办法 Win10下Python的启动问题 Win10下安装了python&#xff0c;但是命令行启动仍然显示Windows商店界面 同时在C:\Users\用户名\AppData\Local\Microsoft\WindowsApps目录下发现空的python3.exe文件 即便在…

【Java】基于SSM的单位人事管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

向量数据库,能让AI再次起飞吗?

9月7-8日&#xff0c;深圳国际会展中心18号馆 来了&#xff0c;来了&#xff0c;腾讯面向产业互联网领域规格最高、规模最大、覆盖最广的年度科技盛会 -——- 腾讯全球数字生态大会。 9 月 7 日&#xff0c;我们将聚焦产业未来发展新趋势&#xff0c;针对云计算、大数据、人工…

Kafka3.0.0版本——消费者(分区的分配以及再平衡)

目录 一、分区的分配以及再平衡1.1、消费者分区及消费者组的概述1.2、如何确定哪个consumer来消费哪个partition的数据1.3、消费者分区分配策略 一、分区的分配以及再平衡 1.1、消费者分区及消费者组的概述 一个consumer group中有多个consumer组成&#xff0c;一个 topic有多…

单片机代码不变,hex却变了?

关注星标公众号&#xff0c;不错过精彩内容 作者 | strongerHuang 微信公众号 | strongerHuang 今天在技术交流群看到这么一个问题&#xff0c;大概意思就是&#xff1a;同一个代码工程&#xff08;源码不变&#xff09;&#xff0c;因Keil版本不同&#xff0c;程序&#xff08…

更快更强更稳定:腾讯向量数据库测评

向量数据库&#xff1a;AI时代的新基座 人工智能在无处不在影响着我们的生活&#xff0c;而人工智能飞速发展的背后是需要对越来越多的海量数据处理&#xff0c;传统数据库已经难以支撑大规模的复杂数据处理。特别是大模型的出现&#xff0c;向量数据库横空出世。NVIDIA CEO黄…