【STM32学习】(30)STM32实现18B20温度采集(标准库和HAL库实现)
單片機型號:STM32F103
源碼下載鏈接:(2條消息) STM32實現18B20溫度采集(標準庫和HAL庫實現)-電信文檔類資源-CSDN下載
?
現要求完成溫度采集并在串口或液晶屏上顯示。我們這里使用DS18B20實現,它的一些特性大家可以網上搜搜,資料很多。
18B20的兩個時序圖很重要,程序的完成就是按照時序圖完成的。
復位的時序圖:
讀寫0/1的時序圖:
ROM命令
總線上可以掛多個器件,通過不同的器件地址來訪問不同的器件。同樣, 1-Wire 總線也可以掛多個器件,但是它只有一條線,如何區(qū)分不同的器件呢?
在每個 DS18B20 內部都有一個唯一的 64 位長的序列號,這個序列號值就存在 DS18B20內部的 ROM 中。開始的 8 位是產品類型編碼(DS18B20 是 0x10),接著的 48 位是每個器件唯一的序號,最后的 8 位是 CRC 校驗碼。 DS18B20 可以引出去很長的線,最長可以到幾十米,測不同位置的溫度。單片機可以通過和 DS18B20 之間的通信,獲取每個傳感器所采集到的溫度信息,也可以同時給所有的 DS18B20 發(fā)送一些指令。這些指令相對來說比較復雜,而且應用很少。
我們這里只講一條總線上只接一個器件的指令和程序。
? ? ? ? ? ? ? Skip ROM(跳過 ROM): 0xCC。當總線上只有一個器件的時候,可以跳過 ROM,不進行 ROM 檢測。
RAM 存儲器操作指令
? ? ? ? ? ? ? Read Scratchpad(讀暫存寄存器): 0xBE
? ? ? ? ? ? ? DS18B20 的溫度數據是 2 個字節(jié),我們讀取數據的時候,先讀取到的是低字節(jié)的低位,讀完了第一個字節(jié)后,再讀高字節(jié)的低位,直到兩個字節(jié)全部讀取完畢。
? ? ? ? ? ? ? Convert Temperature(啟動溫度轉換): 0x44
? ? ? ? ? ? ? 當我們發(fā)送一個啟動溫度轉換的指令后, DS18B20 開始進行轉換。從轉換開始到獲取溫度, DS18B20 是需要時間的,而這個時間長短取決于 DS18B20 的精度。
?
電路圖設計:
接線表設計:
| 模塊(18B20) | STM32的IO口 | 功能設置 |
| GND | GND | - |
| VCC | 3.3V | - |
| TDQ | PA6 | 輸入輸出模式需要來回切換 |
| - | PA9 | TX PA9 |
| - | PA10 | RX PA10 |
標準庫實現溫度采集:
代碼:
/**************************************** 函數名稱:void mode_output(void) 函數參數:無參 函數返回值:無 函數功能:輸出模式 創(chuàng)建作者:王艇 創(chuàng)建時間:2021.5.21 聯系方式: 修改作者: 修改時間: 修改說明: ****************************************/ void mode_output(void) {GPIO_InitTypeDef GPIO_InitStructure;/* Configure Ports */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;GPIO_Init(GPIOA, &GPIO_InitStructure); }/**************************************** 函數名稱:void mode_input(void) 函數參數:無參 函數返回值:無 函數功能:輸入模式 創(chuàng)建作者:王艇 創(chuàng)建時間:2021.5.21 聯系方式: 修改作者: 修改時間: 修改說明: ****************************************/ void mode_input(void) {GPIO_InitTypeDef GPIO_InitStructure;/* Configure Ports */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOA, &GPIO_InitStructure); }/**************************************** 函數名稱:void ds18b20_rst(void) 函數參數:無參 函數返回值:無 函數功能:復位 創(chuàng)建作者:王艇 創(chuàng)建時間:2021.5.21 聯系方式: 修改作者: 修改時間: 修改說明: ****************************************/ void ds18b20_rst(void) {mode_output(); //輸出模式GPIO_ResetBits(GPIOA,GPIO_Pin_6); //拉低DQ引腳delay_us(600); //延時480-960usGPIO_SetBits(GPIOA,GPIO_Pin_6); //拉高DQ引腳 mode_input();while(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6)); //等待器件應答(器件拉低),約15-60us后while(!GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6)); //應答脈沖出現后,等待器件拉高,約60-240us后 }/**************************************** 函數名稱:void ds18b20_write_zero(void) 函數參數:無參 函數返回值:無 函數功能:寫0位 創(chuàng)建作者:王艇 創(chuàng)建時間:2021.5.21 聯系方式: 修改作者: 修改時間: 修改說明: ****************************************/ void ds18b20_write_zero(void) {mode_output(); //輸出模式GPIO_ResetBits(GPIOA,GPIO_Pin_6); //拉低引腳 delay_us(80); //延時60-120usGPIO_SetBits(GPIOA,GPIO_Pin_6); //拉高引腳delay_us(2); } /**************************************** 函數名稱:void ds18b20_write_one(void) 函數參數:無參 函數返回值:無 函數功能:寫1位 創(chuàng)建作者:王艇 創(chuàng)建時間:2021.5.21 聯系方式: 修改作者: 修改時間: 修改說明: ****************************************/ void ds18b20_write_one(void) {mode_output(); //輸出模式GPIO_ResetBits(GPIOA,GPIO_Pin_6);delay_us(2);GPIO_SetBits(GPIOA,GPIO_Pin_6);delay_us(80); } /**************************************** 函數名稱:void ds18b20_read_bit(void) 函數參數:無參 函數返回值:無 函數功能:讀1位數據 創(chuàng)建作者:王艇 創(chuàng)建時間:2021.5.21 聯系方式: 修改作者: 修改時間: 修改說明: ****************************************/ unsigned char ds18b20_read_bit(void) {unsigned char data;mode_output();GPIO_ResetBits(GPIOA,GPIO_Pin_6);delay_us(2);GPIO_SetBits(GPIOA,GPIO_Pin_6);;mode_input();delay_us(5);if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6))data=1;elsedata=0;delay_us(500); return data; }/**************************************** 函數名稱:void ds18b20_write_byte(void) 函數參數:無參 函數返回值:無 函數功能:寫一個字節(jié) 創(chuàng)建作者:王艇 創(chuàng)建時間:2021.5.21 聯系方式: 修改作者: 修改時間: 修改說明: ****************************************/ void ds18b20_write_byte(unsigned char data) {unsigned char i,testb;mode_output();for(i=0;i<8;i++){testb=data&0x01; //從低位開始寫data>>=1;if(testb)ds18b20_write_one();elseds18b20_write_zero();} }/**************************************** 函數名稱:unsigned char ds18b20_read_byte(void) 函數參數:無參 函數返回值:無 函數功能:讀一個字節(jié) 創(chuàng)建作者:王艇 創(chuàng)建時間:2021.5.21 聯系方式: 修改作者: 修改時間: 修改說明: ****************************************/ unsigned char ds18b20_read_byte(void) {unsigned char i,j,data=0;for(i=0;i<8;i++){j=ds18b20_read_bit();data=(j<<7)|(data>>1); //從低位開始讀}return data; }/**************************************** 函數名稱:void ds18b20_start(void) 函數參數:無參 函數返回值:無 函數功能:開始轉換 創(chuàng)建作者:王艇 創(chuàng)建時間:2021.5.21 聯系方式: 修改作者: 修改時間: 修改說明: ****************************************/ void ds18b20_start(void) { ds18b20_rst(); ds18b20_write_byte(0xcc); // 跳過ROMds18b20_write_byte(0x44); //溫度轉換 }/**************************************** 函數名稱:void ds18b20_init(void) 函數參數:無參 函數返回值:無 函數功能:初始化 創(chuàng)建作者:王艇 創(chuàng)建時間:2021.5.21 聯系方式: 修改作者: 修改時間: 修改說明: ****************************************/ void ds18b20_init(void) {gpio_init(); //此引腳需根據相應的單片機進行配置ds18b20_rst(); } /**************************************** 函數名稱:short get_tempetature(void) 函數參數:無參 函數返回值:無 函數功能:獲取溫度 創(chuàng)建作者:王艇 創(chuàng)建時間:2021.5.21 聯系方式: 修改作者: 修改時間: 修改說明: ****************************************/ short get_tempetature(void) {unsigned char TL,TH;short tem;ds18b20_start(); //開始轉換delay_ms(700); //等待轉換完成ds18b20_init(); ds18b20_write_byte(0xcc); //跳過ROMds18b20_write_byte(0xbe); //讀取暫存寄存器 TL=ds18b20_read_byte(); //低八位 TH=ds18b20_read_byte(); //高八位,注意前五位為符號位只有全為0的時候溫度是正的 tem=TH; //獲得高八位tem<<=8; tem+=TL; //獲得底八位return tem; }?
?
實現效果:
?
HAL庫實現溫度采集:
實現效果:
?
需要的可以給我留言,我發(fā)給大家。
源碼下載鏈接:(2條消息) STM32實現18B20溫度采集(標準庫和HAL庫實現)-電信文檔類資源-CSDN下載
?
總結
以上是生活随笔為你收集整理的【STM32学习】(30)STM32实现18B20温度采集(标准库和HAL库实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计网考点——扩展的以太网
- 下一篇: APP跟网址最常见的攻击和防守