基於STM32,AHT20溫濕度採集

2021-10-12 16:29:17 字數 3256 閱讀 8586

總結學習i2c匯流排通訊協議,完成基於i2c硬體協議的aht20溫濕度感測器的資料採集,並將採集的溫度-濕度值通過串列埠輸出。

具體任務:

1)解釋什麼是「軟體i2c」和「硬體i2c」? (閱讀野火配套教材的第23章「i2c–讀寫eeprom」原理章節)

2)閱讀aht20資料手冊,程式設計實現:每隔2秒鐘採集一次溫濕度資料,並通過串列埠傳送到上位機(win10)。

軟體i2c一般是用gpio管腳,用軟體控制管腳狀態以模擬i2c通訊波形。

i2c bus(inter-integrated circuit bus) 最早是由philips半導體(現被nxp收購)開發的兩線時序列匯流排,常用於微控制器與外設之間的連線。i2c協議規定,匯流排上資料的傳輸必須以乙個起始訊號作為開始條件,以乙個結束訊號作為傳輸的停止條件。起始和結束訊號總是由主裝置產生。起始和結束訊號產生條件:匯流排在空閒狀態時,scl和sda都保持著高電平,當scl為高電平而sda由高到低的跳變,表示產生乙個起始條件;當scl為高而sda由低到高的跳變,表示產生乙個停止條件。

硬體i2c的效率要遠高於軟體的,而軟體i2c由於不受管腳限制,介面比較靈活。

如何判斷

可以看底層配置,比如io口配置,如果配置了io口的功能(iic功能)那就是韌體iic,否則就是模擬

可以看iic寫函式,看裡面有木有呼叫現成的函式或者給某個暫存器賦值,如果有,則肯定是韌體iic功能,沒有的話肯定是資料乙個bit乙個bit模擬發生送的,肯定用到了迴圈,則為模擬。

根據**量判斷,模擬的**量肯定比韌體的要大。

硬體iic用法比較複雜,模擬iic的流程更清楚一些。

硬體iic速度比模擬快,並且可以用dma

模擬iic可以在任何管腳上,而硬體只能在固定管腳上。

軟體i2c是程式設計師使用程式控制scl,sda線輸出高低電平,模擬i2c協議的時序。一般較硬體i2c穩定,但是程式較為繁瑣,但不難。

硬體i2c程式設計師只要呼叫i2c的控制函式即可,不用直接的去控制scl,sda高低電平的輸出。但是有些微控制器的硬體i2c不太穩定,除錯問題較多。

注:此次實驗用的軟體i2c此次實驗所用的程式資料為野火自帶資料報

改寫程式:

main.c程式**改寫如下:

#include

"sys.h"

#include

"delay.h"

#include

"usart.h"

#include

"bsp_i2c.h"

uint8_t t;

uint8_t len;

uint16_t times=0;

intmain

(void

)}

將bsp_i2c.c中的void reset_aht20(void)改為

void

reset_aht20

(void

)

將bsp_i2c.c中的void init_aht20(void)改為

void

init_aht10

(void

)

將bsp_i2c.c中的void read_aht20(void)改為

void

read_aht10

(void

)//-------------

i2c_start()

;i2c_writebyte

(0x71);

ack_status =

receive_ack()

;if(ack_status)

printf

(" ");

else

printf

("11-n-");

readbyte[0]

=i2c_readbyte()

;printf

(" "

,readbyte[0]

);send_ack()

; readbyte[1]

=i2c_readbyte()

;printf

(" "

,readbyte[1]

);send_ack()

; readbyte[2]

=i2c_readbyte()

;printf

(" "

,readbyte[2]

);send_ack()

; readbyte[3]

=i2c_readbyte()

;printf

(" "

,readbyte[3]

);send_ack()

; readbyte[4]

=i2c_readbyte()

;printf

(" "

,readbyte[4]

);send_ack()

; readbyte[5]

=i2c_readbyte()

;printf

(" "

,readbyte[5]

);sendnot_ack()

;//send_ack();

i2c_stop()

;//--------------if(

(readbyte[0]

&0x68)==

0x08

)else

printf

("\r\n");

printf

("îâ¶è:%d%d.%d\n"

,t1/

100,

(t1/10)

%10,t1%10)

;printf

("ꪶè:%d%d.%d"

,h1/

100,

(h1/10)

%10,h1%10)

;printf

("\r\n");

}

編譯程式,生成可執行檔案.hex

燒錄程式,執行結果如下:

通過這次實驗,我對stm32的操作更加流暢了,又是大有收穫的一天。

AHT10 溫濕度感測器

aht10 標頭檔案 ifndef i2c ath10 h define i2c ath10 h include c types.h void delayms u32 ms void aht10init void aht10 rst unsigned char aht10 status unsign...

STM32F405 標準庫 SHT20溫濕度感測器

sht20是個溫濕度感測器,使用i2c通訊 下面的i2c程式需要換成你們自己的i2c程式 softreset函式 硬體初始化 set resolution函式 設定解析度 readsht20函式 開始測量 在main.c主函式裡面這樣呼叫 if softreset 0 while 1 sht20.c...

基於IIC實現溫濕度採集

2 aht20溫濕度感測器 3 實現溫濕度採集 4 總結 iic inter integrated circuit 其實是iicbus簡稱,所以中文應該叫積體電路匯流排,它是一種序列通訊匯流排,使用多主從架構,速率較低。iic就是i2c正確讀法為 i平方c 其有兩個物理介面分別為scl和sda sc...