[协议]stm32读取AHT20程序示例

news/2024/7/14 21:14:42

AHT20温度传感器使用程序:

使用i2c读取温度传感器数据很简单,但市面上有至少两个手册,我这个对应的手册贴出来:

main:

#include "stm32f10x.h"                  // Device header
#include <stdint.h>
#include "delay.h"
#include "OLED.h"
#include "MPU6050.h"
#include "AHT20.h"
#include "serial.h"
#include "i2c.h"
#include "Delay.h"int16_t AX,AY,AZ,GX,GY,GZ;int count=0;
uint8_t ReceiveData=0,ReceiveData1=0;uint32_t arr[6]={0};uint32_t H1=0,T1=0;
int main (void)
{Serial_USART1_Init();printf("begin\r\n");I2C_GPIO_Init();OLED_Init();//AHT20Init();//AHT20_Begin_Measure();I2C_Start();I2C_Send_DataByte(0x71);I2C_Receive_Ack();ReceiveData=I2C_Read_DataByte();if((ReceiveData&0x08)==0x08){printf("success\r\n");}else{printf("failed\r\n");}/*开启测量*/I2C_Start();I2C_Send_DataByte(0x70);I2C_Receive_Ack();I2C_Send_DataByte(0xAC);I2C_Receive_Ack();I2C_Send_DataByte(0x33);I2C_Receive_Ack();I2C_Send_DataByte(0x00);I2C_Receive_Ack();I2C_Stop();Delay_ms(210);I2C_Start();I2C_Send_DataByte(0x71);I2C_Receive_Ack();ReceiveData1=I2C_Read_DataByte();if((ReceiveData1&0x80)==0x00){printf("completed\r\n");}else{printf("uncompleted\r\n");}I2C_Send_Ack(0);arr[0]=I2C_Read_DataByte();//humI2C_Send_Ack(0);arr[1]=I2C_Read_DataByte();//tempI2C_Send_Ack(0);arr[2]=I2C_Read_DataByte();//湿度+温度I2C_Send_Ack(0);arr[3]=I2C_Read_DataByte();//tempI2C_Send_Ack(1);I2C_Stop();H1=arr[0];H1=(H1<<8)|arr[1];H1=(H1<<8)|arr[2];H1=H1>>4;H1=H1*1000/1024/1024;printf("H1=%d\r\n",H1);printf("H1=%d%d.%d\r\n",H1/100,(H1/10)%10,H1%10);T1=arr[2];T1=T1&0x0000000F;T1=T1<<8;T1=T1|arr[3];T1=T1<<8;T1=T1|arr[4];T1=(T1*2000/1024/1024-500);//printf("T1=%d",T1);printf("T1=%d%d.%d",T1/100,T1/10%10,T1%10);OLED_ShowString(1,1,"str");while(1){MPU6050_Get_Data(&AX);//printf("%d\r\n",AX);OLED_ShowSignedNum(3,1,count,2);OLED_ShowSignedNum(2,1,AX,10);count++;}}

AHT20.c:

#include "stm32f10x.h"                  // Device header
#include "delay.h"
#include "i2c.h"
#include <stdint.h>
#include "AHT20.h"
#define Dev_Addr 0x70
#define Command1 0xAC
#define Command2 0x33
#define Command3 0x00//开启测量
void AHT20_Begin_Measure(){I2C_Start();I2C_Send_DataByte(Dev_Addr);//0x70I2C_Receive_Ack();I2C_Send_DataByte(Command1);//0xACI2C_Receive_Ack();I2C_Send_DataByte(Command2);//0x33I2C_Receive_Ack();I2C_Send_DataByte(Command3);//0x00I2C_Receive_Ack();I2C_Stop();Delay_ms(150);}void AHT20Init(){//AHT20Reset();I2C_Start();I2C_Send_DataByte(0x71);I2C_Receive_Ack();I2C_Send_DataByte(0xbe);I2C_Receive_Ack();I2C_Send_DataByte(0x08);I2C_Receive_Ack();I2C_Send_DataByte(0x00);I2C_Receive_Ack();I2C_Stop();}void AHT20Reset(){I2C_Start();I2C_Send_DataByte(0x70);I2C_Receive_Ack();I2C_Send_DataByte(0xBA);I2C_Receive_Ack();I2C_Stop();
}uint8_t AHT20_Read_State_Field(){uint8_t StateDataReceive=0;I2C_Start();I2C_Send_DataByte((Dev_Addr|0x01));I2C_Receive_Ack();StateDataReceive=I2C_Read_DataByte();return StateDataReceive;
}

i2c.c:

#include "stm32f10x.h"                  // Device header
#include "delay.h"void I2C_GPIO_Init(){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;//开漏输出GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10|GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);	 	GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11);//设置引脚为高电平
}void I2C_W_SCL(uint8_t BitValue){GPIO_WriteBit(GPIOB,GPIO_Pin_10,(BitAction)BitValue);        Delay_us(10);
}void I2C_W_SDA(uint8_t BitValue){GPIO_WriteBit(GPIOB,GPIO_Pin_11,(BitAction)BitValue);Delay_us(10);
}void I2C_Start(){I2C_W_SCL(1);I2C_W_SDA(1);Delay_us(10); //高电平保持20msI2C_W_SDA(0);Delay_us(10);I2C_W_SCL(0);Delay_us(10);        
}void I2C_Stop(){I2C_W_SCL(0);I2C_W_SDA(0);Delay_us(10);I2C_W_SCL(1);    Delay_us(10);I2C_W_SDA(1);}void I2C_Receive_Ack(){I2C_W_SCL(0);//进入置SCL=0Delay_us(10);I2C_W_SDA(1);I2C_W_SCL(1);Delay_us(10);I2C_W_SCL(0);Delay_us(10);    
}void I2C_Send_Ack(uint8_t SendAckValue){I2C_W_SCL(0);if(SendAckValue==0){I2C_W_SDA(0);}I2C_W_SCL(1);Delay_us(10);I2C_W_SCL(0);            
}void I2C_Send_DataByte(uint8_t DataSend){uint8_t finger=0x80;I2C_W_SCL(0);//进入置SCL=0;Delay_us(10);for(uint8_t k=0;k<8;k++){if(DataSend&finger){I2C_W_SDA(1);Delay_us(10);}else{I2C_W_SDA(0);Delay_us(10);}I2C_W_SCL(1);Delay_us(10);I2C_W_SCL(0);Delay_us(10);        finger=finger>>1;}
}   uint8_t I2C_Read_DataByte(){//读取8位数据uint8_t DataReceive=0x00;uint8_t finger=0x80;I2C_W_SCL(0);//进入置SCL=0;I2C_W_SDA(1);//考虑设置为浮空,详见AHT20收藏Delay_us(10);for(uint8_t k=0;k<8;k++){I2C_W_SCL(1);Delay_us(10);if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==1){DataReceive=DataReceive|(finger>>k);            }else{//不操作}I2C_W_SCL(0);Delay_us(10);}return DataReceive;    
}uint8_t I2C_R_SDA(){uint8_t BitValue=0;BitValue=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11);Delay_us(10);return BitValue;
}


http://www.mrgr.cn/p/02380356

相关文章

人类交互2 听觉处理和语言中枢

人类听觉概述 人类听觉是指通过耳朵接收声音并将其转化为神经信号&#xff0c;从而使我们能够感知和理解声音信息的能力。听觉是人类五种感觉之一&#xff0c;对我们的日常生活和交流至关重要。 听觉是人类交流和沟通的重要工具。通过听觉&#xff0c;我们能够听到他人的语言…

php部分特性漏洞学习

php部分函数漏洞学习 简单总结一些我遇到的ctf中的php的一些函数或特性的漏洞&#xff0c;我刷题还是太少了&#xff0c;所以很多例子来自ctfshow&#xff0c;以后遇到相关赛题再更新 1.MD5和其他hash 弱类型比较 php中&#xff0c;有两中判断相等的符号&#xff0c;和&…

Convolutional Occupancy Networks【ECCV2020】

论文&#xff1a;https://arxiv.org/pdf/2003.04618 代码&#xff1a;GitHub - autonomousvision/convolutional_occupancy_networks: [ECCV20] Convolutional Occupancy Networks 图 1&#xff1a;卷积占据网络。传统的隐式模型 (a) 由于其全连接网络结构&#xff0c;表现能力…

JVM运行时内存:垃圾回收器(Serial ParNew Parallel )详解

文章目录 1. 查看默认GC2. Serial GC : 串行回收3. ParNew GC&#xff1a;并行回收4. Parallel GC&#xff1a;吞吐量优先 1. 查看默认GC -XX:PrintCommandLineFlags&#xff1a;查看命令行相关参数&#xff08;包含使用的垃圾收集器&#xff09;使用命令行指令&#xff1a;ji…

云和恩墨海外首秀在吉隆坡召开的2024中国智能科技与文化展览会

作为中马建交50周年官方重点推荐的活动之一&#xff0c;2024中国智能科技与文化展览会&#xff08;第四届&#xff09;于5月20至21日在毗邻吉隆坡双子塔的吉隆坡国际会展中心举办。本次展览会获得马来西亚科学技术创新部、马来西亚通讯部、中国驻马来西亚大使馆和马来西亚中华总…

【文心智能体】创建一个属于自己的生活情感类智能体

文章目录 前言一、创建智能体二、体验 前言 智能体技术的快速发展&#xff0c;进一步激发了各行业开发者对其实际应用及用户需求的深入探索。 创建一个属于自己的智能体。文心一言提供了一个很好的平台。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考…

自主创新助力科技强军,麒麟信安闪耀第九届军博会

由中国指挥与控制学会主办的中国指挥控制大会暨第九届北京军博会于5月17日-19日在北京国家会议中心盛大开展&#xff0c;政府、军队、武警、公安、交通、人防、航天、航空、兵器、船舶、电科集团等从事国防军工技术与产业领域的30000多名代表到场参加。 麒麟信安作为国产化方案…

【因果推断从入门到精通二】随机实验3

目录 检验无因果效应假说 硬币投掷的特殊性何在&#xff1f; 检验无因果效应假说 无因果效应假说认为&#xff0c;有些人存活&#xff0c;有些人死亡&#xff0c;但接受mAb114治疗而不是ZMapp与此无关。在174例接受mAb14治疗的患者中&#xff0c;113/17464.9%存活了28天&…

开源博客项目Blog .NET Core源码学习(25:App.Hosting项目结构分析-13)

本文学习并分析App.Hosting项目中后台管理页面的文章管理页面。   文章管理页面用于显示、检索、新建、编辑、删除文章数据&#xff0c;以便在前台页面的首页、文章专栏、文章详情页面显示文章数据。文章管理页面附带一新建及编辑页面&#xff0c;以支撑新建和编辑文章数据。…

【vue/uniapp】ucharts 可以横向拖动查看数据(当图表数据过多时),避免叠加

效果参考&#xff1a; 实现&#xff1a; 需要在 opts 中配置&#xff1a;enableScroll: true 和 ontouch:true&#xff1b;在 opts 的 xAxis 中配置&#xff1a;itemCount: 5&#xff08;值可以自定义&#xff0c;如图&#xff0c;为默认展示几个&#xff09;&#xff1b; …

翻转列表-力扣

题目 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]示例 3&#xff1a; …

寻找峰值 ---- 二分查找

题目链接 题目: 分析: 因为题目中要找的是任意一个峰值即可, 所以和<山脉数组的峰值索引>这道题差不多因为峰值左右都小于峰值, 所以具有"二段性", 可以使用二分查找算法如果nums[mid] < nums[mid 1], mid一定不是峰值, 所以left mid 1如果nums[mid] &…

WXML模板语法-事件绑定

一、 1.事件 事件是渲染层到逻辑层的通讯方式&#xff0c;通过事件可以将用户在渲染层产生的行为&#xff0c;反馈到逻辑层进行业务的处理 2.小程序中常用的事件 3.事件对象的属性列表 当事件回调触发的时候&#xff0c;会收到一个事件对象event&#xff0c;其属性为&#x…

Java设计模式 _行为型模式_迭代器模式

一、迭代器模式 1、迭代器模式 迭代器模式&#xff08;Iterator Pattern&#xff09;是一种行为型设计模式&#xff0c;用于顺序访问集合对象的元素&#xff0c;不需要关心集合对象的底层表示。如&#xff1a;java中的Iterator接口就是这个工作原理。 2、实现思路 &#xff0…

基于SSM的大学生兼职管理系统

基于SSM的大学生兼职管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 登录界面 企业界面 前台学生界面 管理员界面 摘要 随着大学生兼职市场的日益繁…

AI大模型如何赋能智能座舱

AI 大模型如何赋能智能座舱 从上海车展上&#xff0c;我们看到由于智能座舱配置性价比较高&#xff0c;已经成为车企的核心竞争点之一&#xff0c;随着座舱硬件规模化装车&#xff0c;蔚小理、岚图、极狐等新势力开始注重座舱多模态交互&#xff0c;通过集成语音/手势/触控打造…

初识C语言——第二十八天

代码练习1&#xff1a; 用函数的方式实现9*9乘法表 void print_table(int n) {int i 0;int j 0;for (i 1; i< n; i){for (j 1; j< i; j){printf("%d*%d%-3d ", i, j, i * j);}printf("\n");}}int main() {int n 0;scanf("%d", &a…

弱监督语义分割-对CAM的生成过程进行改进3

三、擦除图像高响应部分以获取更多的分割领域 ECS-Net: Improving Weakly Supervised Semantic Segmentation by Using Connections Between Class Activation Maps&#xff08;ICCV,2021&#xff09; 1.引言 我们首先从图像中擦除高响应区域&#xff0c;并生成这些擦除图像…

Java类和对象(五)—— 抽象类、接口、Object类和内部类

抽象类 在继承体系下&#xff0c;父类有些方法可能是要被重写的&#xff0c;如果我们事先就知道某些方法需要重写的话&#xff0c;我们可以不用在父类里面具体实现这个方法&#xff0c;这时候我们会用到抽象方法&#xff0c;这时候我们会用到关键字abstract关键字来修饰 publ…

求第 N 个泰波那契数 | 动态规划

1.第 N 个泰波那契数 题目连接&#xff1a;1137. 第 N 个泰波那契数 泰波那契序列 Tn 定义如下&#xff1a; T0 0, T1 1, T2 1, 且在 n > 0 的条件下 Tn3 Tn Tn1 Tn2给你整数 n&#xff0c;请返回第 n 个泰波那契数 Tn 的值。 2.什么是动态规划 在解决这道问题之前…