从零开始学习单片机13

温湿度传感器连续转换模式

首先要通过IIC的指令去设置温湿度传感器的重复率和周期转换频率,重复率越高转换的精度越高,温湿度的精度也会越高,转换的耗时还有功耗也会更高。mps为周期转换频率,mps = 0.5就代表每两秒钟温湿度传感器转换一次

要想设置重复率和周期转换频率,先要发一个起始的信号,然后发7个byte的地址,设备地址为0x44(0b0100 0100)取后7位,再加上一个读写的标志位,如果是写标志的话即为0(读为1),所以发送完起始信号后因该发送1000 1000。

发送完要等待从机的应答,之后再发送MSB命令,从机应答后再发送LSB命令

复制代码
#define GXHT3L_ADDR_WRITE 0x44<<1     //0b0100 0100 -> 0b1000 1000定义写的地址
#define GXHT3L_ADDR_READ  (0x44<<1)+1 //0b0100 0101 -> 0b1000 1001定义读的地址

void gxht30_init()
{
	i2c_start();
	i2c_write_byte(GXHT3L_ADDR_WRITE);
	i2c_wait_ack();
	i2c_write_byte(0x21);
	i2c_wait_ack();
	i2c_write_byte(0x30);
	i2c_wait_ack();
}//高重复率,1mps的周期转换频率

读取温湿度传感器流程图:

起始信号加上7位的地址位和写的标志位(0),等待从机应答,然后发送MSB与LSB,分别是E0和00,应答完成就可以开始读取。发送起始信号和地址,还有读的标志位(1),就可以等待从机的应答,从而逐个字节地去读取温度和湿度的数据

复制代码
void gxht30_read_mode()//浸入连续读写的模式
{
	i2c_start();
	i2c_write_byte(GXHT3L_ADDR_WRITE);
	i2c_wait_ack();
	i2c_write_byte(0xE0);
	i2c_wait_ack();
	i2c_write_byte(0x00);
	i2c_wait_ack();
}

温度的数据由两个byte位组成,后面的CRC为降压位,确保数据在传输的过程中不会被外部的干扰所导致改变,湿度的数据也由两个byte组成,后面是湿度数据的CRC。所有的数据都读取完后,给一个NACK的应答,再由主机发送停止信号,完成一轮的转换。用下面的公式可以将读取到的数据转换为实际的温湿度

复制代码
void gxht30_read_data()//读取温湿度的数据
{
	unsigned char buffer[6];
	unsigned short tem,hum;
	int index = 0;
	float temperature,humidity;
	i2c_start();
	i2c_write_byte(GXHT3L_ADDR_WRITE);
	i2c_wait_ack();
	for(index = 0; index < 6;index ++){
		buffer[index] = i2c_read_byte();
		if(index ==5)
			i2c_nack();
		else
			i2c_ack();
	}
	i2c_stop();
	//合并两个8bit的数据为一个16bit的数据
	tem = (buffer[0] << 8) | buffer[1];
	hum = (buffer[3] << 8) | buffer[4];
	//进行温湿度转换
    temperature = (175.0*(float)tem/65535.0-45.0) ;// T = -45 + 175 * tem / (2^16-1)
    humidity = (100.0*(float)hum/65535.0);// RH = hum*100 / (2^16-1)    
	printf("temperature = %f humidity = %f\n",temperature,humidity);
}
void main()
{
	gxht30_init();
	while(1)
	{
		gxht30_read_mode();
		gxht30_read_data();

	}
}

还要加上printf的头文件和putchar函数。

相关推荐
智闲电子设计11 分钟前
STM32 硬件过流保护实战:比较器直连 BKIN,纳秒级关断不靠软件
stm32·单片机·嵌入式硬件
嵌入式阿蔡19 分钟前
存储_14:嵌入式存储测试岗面试——可靠性/兼容/车规面试题与项目话术
单片机·嵌入式硬件·面试·嵌入式·存储
tju新生代魔迷1 小时前
Verilog HDL 学习笔记(九)| 第 9 章 实用建模技术
笔记·学习
凯尔萨厮1 小时前
Java学习笔记十三(Stream与Lambda)
笔记·学习
爱三盖浇饭2 小时前
挑战从零开始学习Kafka2: Kafka 常见问题解决方案
学习·kafka
Brilliantwxx2 小时前
【PCB】(入门篇) 电子入门系列|从电路分析到 PCB 设计
stm32·单片机·嵌入式硬件
dtq04243 小时前
数据结构 - 线性表 - 双向链表
c语言·数据结构·学习
M78佐菲9 小时前
Linux学习笔记:TCP协议
linux·笔记·学习·tcp/ip·算法
俊基科技9 小时前
A-59U工业级多模语音处理模块在矿山矿井通信与呼叫报警系统中的应用
嵌入式硬件·嵌入式开发·硬件开发·ai降噪·回音消除·拾音降噪
yi.Ist10 小时前
数据定义语言-DDL操作
数据库·学习·mysql·oracle·大海豚