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

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();//hum
    I2C_Send_Ack(0);
    arr[1]=I2C_Read_DataByte();//temp
    I2C_Send_Ack(0);
    arr[2]=I2C_Read_DataByte();//湿度+温度
    I2C_Send_Ack(0);
    arr[3]=I2C_Read_DataByte();//temp
    I2C_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);//0x70
    I2C_Receive_Ack();
    I2C_Send_DataByte(Command1);//0xAC
    I2C_Receive_Ack();
    I2C_Send_DataByte(Command2);//0x33
    I2C_Receive_Ack();
    I2C_Send_DataByte(Command3);//0x00
    I2C_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); //高电平保持20ms

    I2C_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=0
    Delay_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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【408精华知识】页、页面、页框、页帧、内存块、物理块、物理页面还傻傻分不清?

在做题过程中&#xff0c;我们经常能看到页、页框、块等概念&#xff0c;初接触时&#xff0c;常感觉傻傻分不清&#xff0c;这篇文章将简洁地介绍它们之间的联系与区别。 这些概念之间的根本区别&#xff0c;在于是物理上的概念还是逻辑上的概念&#xff0c;也即是虚地址还是实…

认知架构 cognitive architecture

Assistants API&#xff1a;以开发人员为中心。 有状态的API&#xff1a;允许存储以前的消息、上传文件、访问内置工具&#xff08;代码解释器&#xff09;、通过函数调用控制其他工具。 认知架构应用的两个组件&#xff1a;&#xff08;1&#xff09;如何提供上下文给应用 &…

Widows技术专题系列-系统装机教程

Windows技术专题系列 注&#xff1a; 本教程由羞涩梦整理同步发布&#xff0c;本人技术分享站点&#xff1a;blog.hukanfa.com转发本文请备注原文链接&#xff0c;本文内容整理日期&#xff1a;2024-05-20csdn 博客名称&#xff1a;五维空间-影子&#xff0c;欢迎关注 1 系统…

使用 Supabase 的 Realtime + Storage 非常方便呢

文章目录 &#xff08;一&#xff09;Supabase&#xff08;二&#xff09;Realtime&#xff08;消息&#xff09;&#xff08;2.1&#xff09;Python 消息订阅&#xff08;2.2&#xff09;JavaScript 消息订阅 &#xff08;三&#xff09;Storage&#xff08;存储&#xff09;&…

【Centos7+JDK1.8】Jenkins安装手册

一、安装环境 Centos7 JDK1.8 Jenkins-2.346.3 JDK1.8安装以及网络配置等 自行搜索资料解决。 二、卸载历史安装的Jenkins&#xff0c;直接全部复制粘贴下面的命令 service jenkins stop yum -y remove jenkins rpm -e jenkins rpm -ql jenkins rm -rf /etc/sysconfig/je…

探索Facebook:数字社交的新时代

Facebook&#xff0c;作为全球最大的社交网络平台之一&#xff0c;一直在引领着数字社交的发展潮流。随着科技的不断进步和社会的不断变迁&#xff0c;Facebook也在不断演进和创新&#xff0c;迎接着数字社交的新时代。本文将探索Facebook在数字社交领域的新发展&#xff0c;以…

一个开源的工具类轮子是怎么造出来的

心路历程 为什么要做 在22年9月的某一天&#xff0c;在公司开需求评审时&#xff0c;接到了一个给PDF、图片添加水印的需求。做为一个刚工作的CURD程序员&#xff0c;在遇到这些问题时&#xff0c;第一反应是去github上找找有没有类似的开源框架。但是&#xff0c;出乎我意料…

基于springboot实现旅游管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现旅游管理系统演示 摘要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本旅游管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助使用者在…

XSS---DOM破坏

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.什么是DOM破坏 DOM破坏总结为一句话就是&#xff1a;利用HTML元素来响应JS代码的执行结果。 举个例子&#xff1a; <body> <img id"x"> <img name"y"…

145.栈和队列:删除字符串中的所有相邻重复项(力扣)

题目描述 代码解决 class Solution { public:string removeDuplicates(string s) {// 定义一个栈来存储字符stack<char> st;// 遍历字符串中的每一个字符for(int i 0; i < s.size(); i){// 如果栈为空或栈顶字符与当前字符不相同&#xff0c;则将当前字符入栈if(st.e…

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…

【简单介绍下爬山算法】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…

java-查询字符串当中是否包含中文

文章目录 前言java-查询字符串当中是否包含中文 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话&#xff0c;那欢迎常来啊…

订餐系统总结、

应用层&#xff1a; SpringBoot:快速构建Spring项目&#xff0c;采用“约定大于配置”的思想&#xff0c;简化Spring项目的配置开发。 SpringMvc&#xff1a;Spring框架的一个模块&#xff0c;springmvc和spring无需通过中间整合层进行整合&#xff0c;可以无缝集成。 Sprin…

Predictable MDP Abstraction for Unsupervised Model-Based RL

ICML 2023 paper code Intro 文章提出了一种用于无监督基于模型强化学的方法&#xff0c;称为可预测MDP抽象&#xff08;Predictable MDP Abstraction, PMA&#xff09;。在MBRL中&#xff0c;一个关键部分是能够准确建模环境动力学动态模型。然而&#xff0c;这个预测模型误…

力扣652. 寻找重复的子树

Problem: 652. 寻找重复的子树 文章目录 题目描述思路复杂度Code 题目描述 思路 1.利用二叉树的后序遍历将原始的二叉树序列化&#xff08;之所以利用后序遍历是因为其在归的过程中是会携带左右子树的节点信息,而这些节点信息正是该解法要利用的东西&#xff09;&#xff1b; 2…

IDEA中一些常见操作【持续更新】

文章目录 前言善用debugidea中debug按钮不显示自动定位文件【始终选择打开的文件】idea注释不顶格【不在行首】快速定位类的位置【找文件非常快】创建文件添加作者及时间信息快速跳转到文件顶端 底端 前言 因为这些操作偶尔操作一次&#xff0c;不用刻意记忆&#xff0c;有个印…

中国主要城市房价指数数据集(2011-2024)

数据来源&#xff1a;东方财富网 时间跨度&#xff1a;2011年1月 - 2024年4月 数据范围&#xff1a;中国主要城市 包含指标&#xff1a; 日期、城市 新建商品住宅价格指数-同比 新建商品住宅价格指数-环比 新建商品住宅价格指数-定基 二手住宅价格指数-环比 二手住宅价格指…

K8s-yaml文件

一.Yaml文件详解&#xff1a; Kubernetes 支持 YAML 和 JSON 格式管理资源对象 JSON 格式&#xff1a;主要用于 api 接口之间消息的传递YAML 格式&#xff1a;用于配置和管理&#xff0c;YAML 是一种简洁的非标记性语言&#xff0c;内容格式人性化&#xff0c;较易读 YAML 语…

英语学习笔记20——Look at them!

Look at them! 看看他们&#xff01; 词汇 Vocabulary big a. 大的&#xff08;尺寸&#xff0c;年龄&#xff0c;音量……&#xff09; 搭配&#xff1a;big cheese 大人物    big mouth 大嘴巴&#xff08;传话的人&#xff09;    big talker 吹牛的人 例句&#xf…