[協議]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();//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.pswp.cn/web/14512.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/14512.shtml
英文地址,請注明出處:http://en.pswp.cn/web/14512.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數智賦能內澇治理,四信城市排水防澇解決方案保障城市安全運行

由強降雨、臺風造成城市低洼處出現大量積水、內澇的情況時有發生&#xff0c;給人們出行帶來了極大不便和安全隱患&#xff0c;甚至危及群眾生命財產安全。 為降低內澇造成的損失&#xff0c;一方面我們要大力加強城市排水基礎設施的建設&#xff1b;另一方面要全面掌握城市內澇…

U-Boot menu菜單分析

文章目錄 前言目標環境背景U-Boot如何自動調起菜單U-Boot添加自定義命令實踐 前言 在某個廠家的開發板中&#xff0c;在進入它的U-Boot后&#xff0c;會自動彈出一個菜單頁面&#xff0c;輸入對應的選項就會執行對應的功能。如SD卡鏡像更新、顯示設置等&#xff1a; 目標 本…

docker命令詳解大全

Docker是一種流行的容器化平臺&#xff0c;用于快速部署應用程序并管理容器的生命周期。以下是一些常用的Docker命令及其用途的概述&#xff1a; docker run&#xff1a;創建一個新容器并運行一個命令。docker ps&#xff1a;列出當前運行的容器。docker stop&#xff1a;停止…

Unity射擊游戲開發教程:(20)增加護盾強度

在本文中,我們將增強護盾,使其在受到超過 1 次攻擊后才會被禁用。 Player 腳本具有 Shield PowerUp 方法,我們需要調整盾牌在被摧毀之前可以承受的數量,因此我們將聲明一個 int 變量來設置盾牌可以承受的擊中數量。

微信小程序畫布顯示圖片繪制矩形選區

wxml <view class"page-body"><!-- 畫布 --><view class"page-body-wrapper"><canvas canvas-id"myCanvas" type"2d" id"myCanvas" classmyCanvas bindtouchstart"touchStart" bindtouchmo…

OpenFeign快速入門 替代RestTemplate

1.引入依賴 <!--openFeign--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!--負載均衡器--><dependency><groupId>org.spr…

【全網最全】2024電工杯數學建模B題問題一14頁論文+19建模過程代碼+py代碼+2種保獎思路+數據等(后續會更新成品論文等)

您的點贊收藏是我繼續更新的最大動力&#xff01; 一定要點擊如下的卡片鏈接&#xff0c;那是獲取資料的入口&#xff01; 【全網最全】2024電工杯數學建模B題問一論文19建模過程代碼py代碼2種保獎思路數據等&#xff08;后續會更新成品論文等&#xff09;「首先來看看目前已…

C++中的四種類型轉換運算符

隱式類型轉換是安全的&#xff0c;顯式類型轉換是有風險的&#xff0c;C語言之所以增加強制類型轉換的語法&#xff0c;就是為了強調風險&#xff0c;讓程序員意識到自己在做什么。但是&#xff0c;這種強調風險的方式還是比較粗放&#xff0c;粒度比較大&#xff0c;它并沒有表…

MySQL中如何知道數據庫表中所有表的字段的排序規則是什么?

查看所有表的字段及其排序規則&#xff1a; 你可以查詢 information_schema 數據庫中的 COLUMNS 表&#xff0c;來獲取所有表的字段及其排序規則。以下是一個示例查詢&#xff1a; SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, COLLATION_NAME FROM information_schema.COL…

【設計模式深度剖析】【5】【創建型】【原型模式】| 類比群發郵件,加深理解

&#x1f448;?上一篇:建造者模式 | 下一篇:創建型設計模式對比&#x1f449;? 目錄 原型模式(Prototype Pattern)概覽定義英文原話直譯 3個角色類圖1. 抽象原型&#xff08;Prototype&#xff09;角色2. 具體原型&#xff08;Concrete Prototype&#xff09;角色3. 客戶…

必示科技參與智能運維國家標準預研線下編寫會議并做主題分享

近日&#xff0c;《信息技術服務 智能運維 第3部分&#xff1a;算法治理》&#xff08;擬定名&#xff09;國家標準預研階段第一次編寫工作會議在杭州舉行。本次會議由浙商證券承辦。 此次編寫有來自銀行、證券、保險、通信、高校研究機構、互聯網以及技術方等29家單位&#xf…

在云計算環境中,如何實現資源的高效分配和調度?

在云計算環境中&#xff0c;可以通過以下幾種方法實現資源的高效分配和調度&#xff1a; 負載均衡&#xff1a;通過負載均衡算法&#xff0c;將云計算集群的負載均勻地分配到各個節點上。常見的負載均衡算法有輪詢、最小連接數、最短響應時間等。 資源調度算法&#xff1a;為了…

Linux基礎(四):Linux系統文件類型與文件權限

各位看官&#xff0c;好久不見&#xff0c;在正式介紹Linux的基本命令之前&#xff0c;我們首先了解一下&#xff0c;關于文件的知識。 目錄 一、文件類型 二、文件權限 2.1 文件訪問者的分類 2.2 文件權限 2.2.1 文件的基本權限 2.2.2 文件權限值的表示方法 三、修改文…

CSS3 新增背景屬性 + 新增邊框屬性(如果想知道CSS3新增背景屬性和新增邊框屬性的知識點,那么只看這一篇就夠了!)

前言&#xff1a;CSS3在CSS2的基礎上&#xff0c;新增了很多強大的新功能&#xff0c;從而解決一些實際面臨的問題&#xff0c;本篇文章主要講解的為CSS3新增背景屬性和新增邊框屬性。 ???這里是秋刀魚不做夢的BLOG ???想要了解更多內容可以訪問我的主頁秋刀魚不做夢-CSD…

視覺SLAM十四講:從理論到實踐(Chapter5:相機與圖像)

前言 學習筆記&#xff0c;僅供學習&#xff0c;不做商用&#xff0c;如有侵權&#xff0c;聯系我刪除即可 目標 理解針孔相機的模型、內參與徑向畸變參數。理解一個空間點是如何投影到相機成像平面的。掌握OpenCV的圖像存儲與表達方式。學會基本的攝像頭標定方法。 一、相…

機器學習第四十周周報 WDN GGNN

文章目錄 week40 WDN GGNN摘要Abstract一、文獻閱讀1. 題目2. abstract3. 網絡架構3.1 問題提出3.2 GNN3.3 CSI GGNN 4. 文獻解讀4.1 Introduction4.2 創新點4.3 實驗過程4.3.1 數據獲取4.3.2 參數設置4.3.3 實驗結果 5. 結論二、GGNN1. 代碼解釋2. 網絡結構小結參考文獻參考文…

Vue 2 和 Vue 3 中同步和異步

Vue 2 和 Vue 3 中同步和異步 Vue 2 同步和異步 同步更新 (Synchronous Updates) Vue 2 在數據更新后會進行同步渲染更新,但為了性能優化,Vue 會在內部隊列中異步地進行 DOM 更新。這意味著數據變化會立即被捕捉到,但實際的 DOM 更新會被推遲到下一個事件循環隊列中。new V…

基礎3 探索JAVA圖形編程桌面:邏輯圖形組件實現

在一個寬敞明亮的培訓教室里&#xff0c;陽光透過窗戶柔和地灑在地上&#xff0c;教室里擺放著整齊的桌椅。臥龍站在講臺上&#xff0c;面帶微笑&#xff0c;手里拿著激光筆&#xff0c;他的眼神中充滿了熱情和期待。他的聲音清晰而洪亮&#xff0c;傳遍了整個教室&#xff1a;…

Linux模擬考試

注意&#xff0c;以下答案僅供參考 1、某CentOS系統空間不夠&#xff0c;現加一塊100G的硬盤(是系統的第二塊硬盤&#xff09;&#xff0c;分為一個區99G&#xff0c;掛載點是/data&#xff0c;請寫出從分區到掛載并使用的整個步驟及相關命令。 1.創建分區&#xff1a; sudo f…

HTML5 通信方式及應用

目錄 postMessage APIWebSocketsServer-Sent Events (SSE)Fetch API / XMLHttpRequest (XHR)Web Workers & Service WorkersHTML5 提供了多種通信方式,使得瀏覽器中的Web應用能夠實現頁面間、窗口間、甚至與外部服務的有效通信。這些通信方式大大提升了Web應用的交互性和復…