国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

DS18B20溫度測量程序文件(簡單通用)

這篇具有很好參考價值的文章主要介紹了DS18B20溫度測量程序文件(簡單通用)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

DS18B20是一個非常簡單的溫度傳感器,對于像我這樣單片機萌新是比較友好的。網(wǎng)上關于它的介紹非常多,包括原理、引腳、通信、以及51單片機、STM32的各種代碼等等。本人寫了一個簡單的ds18b20.c庫文件分享給大家,該文件內(nèi)的函數(shù)可以實現(xiàn)單個元件的單次測溫功能,溫度精確到整數(shù)。這個程序在STM32F103C8上進行了實際測試,但是稍加修改就可以移植到其他類型的單片機上。

DS18B20的引腳定義、線路連接、工作時序、指令含義等,在他人寫的文章中有詳細闡述,在這里不再介紹。值得注意的是,經(jīng)過我多次測試,發(fā)現(xiàn)在有VCC供電的情況下,VCC穩(wěn)定在3.1V以上,才能正常測溫;而如果使用數(shù)據(jù)線供電,在我單片機3.3V的VCC下沒法正常測溫(或許5V的VCC可以,但我沒試驗過)所以不推薦這種方法。

首先是頭文件ds18b20.h:


#ifndef INC_DS18B20_H_
#define INC_DS18B20_H_


#define DS18_GPIO_Port GPIOB
#define DS18_Pin GPIO_PIN_0


unsigned char ds18b20_Init(void);
char readtemp(void);
void ds18b20start(void);


#endif /* INC_DS18B20_H_ */

頭文件中#define 這兩行是對ds18b20數(shù)據(jù)線對應管腳的定義,用戶需要根據(jù)自己單片機上連接的管腳進行修改。需要注意的是,下面ds18b20_Init()中并沒有包含管腳的初始化。用戶需要在調(diào)用該函數(shù)之前先完成對GPIO管腳的初始化操作,將其配置成為開漏輸出模式并配置上拉電阻。(我用的STM32Cube,自動生成了對GPIO管腳的初始化函數(shù))

下面三個函數(shù)是main函數(shù)中需要調(diào)用的函數(shù)。具體調(diào)用方法如下:

  1. 在初始化時調(diào)用ds18b20_Init()函數(shù)。

  1. 每次測量溫度前,都要先調(diào)用ds18b20start()函數(shù)。

  1. 調(diào)用完ds18b20start()后,需要等至少500ms,其測量完溫度后再調(diào)用readtemp()函數(shù)進行讀?。▎挝皇菙z氏度)。

接下來是這些函數(shù)的具體實現(xiàn),即ds18b20.c:


/*
 * ds18b20.c
 *
 *  Created on: Dec 20, 2021
 *      Author: ASUS
 * 使用前必讀
 * 需要修改的部分包括:
 * 1.在DELAY_Us中,修改__NOP()的數(shù)量,CPU頻率是多少MHz,就用多少個NOP.
 * 2.添加或修改DS18_GPIO_Port,DS18_Pin的重定義內(nèi)容,使之匹配對應的端口。
 * 3.如HAL_GPIO_WritePin()和HAL_GPIO_ReadPin沒有定義,則自己寫一個。
 * 4.在主程序中,需要對響應的GPIO端口進行初始化,設置為開漏輸出和上拉電阻模式。
 * 本文件只有單次測量溫度的程序。調(diào)用函數(shù)的方法:
 * 開機先用ds18b20_Init(void)初始化。每次測量前先用ds18b20start()開始測溫,等大約0.5s后用readtemp()讀取結果。
 */

#include "ds18b20.h"
#include "main.h"


void DELAY_Us(unsigned int  count)
{
    while(count--)
    {
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
        __NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();__NOP();
    }
}

unsigned char ds18b20_Init(void)
{
    /*****初始化DS18B20*****/

      unsigned char x=0;
      HAL_GPIO_WritePin(DS18_GPIO_Port,DS18_Pin,1);    //DQ復位
      DELAY_Us(30);    //稍做延時
      HAL_GPIO_WritePin(DS18_GPIO_Port,DS18_Pin,0);      //單片機將DQ拉低
      DELAY_Us(500);   //精確延時,大于480us
      HAL_GPIO_WritePin(DS18_GPIO_Port,DS18_Pin,1);       //拉高總線
      DELAY_Us(100);
      x=HAL_GPIO_ReadPin(DS18_GPIO_Port,DS18_Pin);      //稍做延時后,如果x=0則初始化成功,x=1則初始化失敗
      DELAY_Us(500);
      return x;

}

void ds18b20_Write1byte(unsigned char data)
{
    unsigned char i=0;
    for(i=8;i>0;i--)
    {
        HAL_GPIO_WritePin(DS18_GPIO_Port,DS18_Pin,0);
        DELAY_Us(3);
        HAL_GPIO_WritePin(DS18_GPIO_Port,DS18_Pin,data&0x01);
        DELAY_Us(70);
        HAL_GPIO_WritePin(DS18_GPIO_Port,DS18_Pin,1);
        DELAY_Us(3);
        data>>=1;

    }
    DELAY_Us(30);
}

unsigned char ds18b20_Read1byte(void)
{
    unsigned char i,j,dat;
     dat=0;
    for (i=1;i<=8;i++)
    {
        HAL_GPIO_WritePin(DS18_GPIO_Port,DS18_Pin,0);
        DELAY_Us(3);
        HAL_GPIO_WritePin(DS18_GPIO_Port,DS18_Pin,1);
        DELAY_Us(18);
        j=HAL_GPIO_ReadPin(DS18_GPIO_Port,DS18_Pin);
        DELAY_Us(50);
        dat=(j<<7)|(dat>>1);
    }
    return dat;
}

void ds18b20start(void)
{
    ds18b20_Init();
    ds18b20_Write1byte(0xcc);

    ds18b20_Write1byte(0x44);
}

char readtemp(void)
{
    unsigned char TL=0x01,TH=0x07;
    char temp;
    ds18b20_Init();
    ds18b20_Write1byte(0xcc);
    ds18b20_Write1byte(0xbe);
    TL=ds18b20_Read1byte();
    DELAY_Us(1);
    TH=ds18b20_Read1byte();
    temp=(char)((TH<<4)|TL>>4);
    return temp;
}

這里首先一個函數(shù)是微秒級延時函數(shù)DELAY_Us()。這里使用了一個簡單的__NOP()做延時。這實際上對應著CPU的匯編指令,表示延時一個時鐘周期,什么都不做。所以用戶需要根據(jù)CPU時鐘頻率修改__NOP()的個數(shù),頻率是多少MHz就加多少個__NOP()。當然,不同單片機的指令名稱可能有所不同,用戶自行替換就行了。

用戶還需要修改的一部分是對GPIO端口的讀寫操作函數(shù)。我這里用的STM32HAL庫,所以用的是HAL_GPIO_WritePin()和HAL_GPIO_ReadPin()函數(shù)。如果大家沒有此庫函數(shù),就在本文件下面寫一個,重新定義一下。

用戶修改完上述部分后,就可以在主程序中調(diào)用ds18b20.h中的三個函數(shù),進行溫度的測量了。測量的結果就可以根據(jù)你喜歡的方式進行輸出~(不過這就不是本文件需要包含的內(nèi)容了)

如果有錯誤,還請在評論區(qū)指正。如果想看多點測溫,歡迎在評論區(qū)留言,想看的人多我就寫一寫(嘿嘿文章來源地址http://www.zghlxwxcb.cn/news/detail-452494.html

到了這里,關于DS18B20溫度測量程序文件(簡單通用)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 53、基于STC15W單片機的溫度計(DS18B20)(Proteus仿真+程序)

    53、基于STC15W單片機的溫度計(DS18B20)(Proteus仿真+程序)

    ? ? ? 本設計由STC15W4K32S4單片機+DS18B20溫度傳感器+1602液晶顯示模塊+串口模塊組成。 1、主控制器是STC15W4K32S4單片機 2、DS18B20溫度傳感器采集溫度,精度0.1攝氏度 3、1602液晶顯示溫度。 4、測溫范圍-55~110攝氏度,誤差±0.1℃ 5、溫度值發(fā)送至串口助手顯示。 Proteus軟件: Proteus

    2024年02月03日
    瀏覽(30)
  • DS18B20溫度傳感器工作原理

    DS18B20溫度傳感器工作原理

    目錄 管腳描述 綜述 訪問DS18B20的事件序列 通信時序 VDD:電源引腳,當采用寄生電源的時候,VDD必須連接到地 DQ:單總線運用的數(shù)據(jù)輸入/輸出,當采用寄生電源供電時,同時向設備提供電源 GND:地 ①DS18B20片內(nèi)的ROM中都存在獨一無二的64位編碼,在后期通信時,是用此編碼進

    2024年02月09日
    瀏覽(21)
  • 【mcuclub】溫度傳感器DS18B20

    【mcuclub】溫度傳感器DS18B20

    ? ? VCC:外接供電電源輸入端。 DQ: 數(shù)字信號輸入/輸出端。 GND:電源地線 為什么接上拉電阻: 因為DS18B20的數(shù)據(jù)口是漏極開路,如果不接上拉電阻,則只能輸出低電平和高阻態(tài),不能輸出高電平,因此需要外接上拉電阻,否則無法輸出1。DS18B20的工作電流約為1mA,VCC一般為

    2023年04月22日
    瀏覽(17)
  • DS18B20溫度傳感器——測試環(huán)境溫度及代碼

    DS18B20溫度傳感器——測試環(huán)境溫度及代碼

    醒醒!,還在睡呢,開始干代碼了! 單片機通過OneWire協(xié)議與DS18B20通信,最終測出環(huán)境溫度 OneWire 總線的硬件接口很簡單,只需要把 DS18B20 的數(shù)據(jù)引腳和單片機的一個 IO 口接上 ? ? ?說明:GND接地,DQ單引線用于數(shù)據(jù)的輸入,VDD接電源正極(注意正負極不能接反) 通過編程,

    2024年02月09日
    瀏覽(22)
  • STM32——DS18B20溫度傳感器

    STM32——DS18B20溫度傳感器

    一、DS18B20介紹 (一)DS18B20技術性能特征 1、獨特的單總線接口方式,DS18B20在與微處理器連接時僅需要一條口線即可實現(xiàn)微處理器與DS18B20的雙向通訊,大大提高了系統(tǒng)的抗干擾性。 2、測溫范圍? -55°C~+125°C 3、支持多點組網(wǎng)功能,多個DS18B20可以并聯(lián)在唯一的三線上,最多只

    2024年01月19日
    瀏覽(14)
  • Linux下ds18b20驅(qū)動開發(fā)獲取溫度

    Linux下ds18b20驅(qū)動開發(fā)獲取溫度

    對ds18b20不了解的可以查看這篇文章,講解的比較詳細的:STM32一線協(xié)議-DS18B20溫度傳感器采樣實現(xiàn) 源碼是根據(jù)上一屆學長的,想要參考的可以去拜訪一下gitee:代碼鏈接 (1)修改設備樹 在路徑 linux-imx/arch/arm/boot/dts/ 下修改設備樹 igkboard.dts : 主節(jié)點: 從節(jié)點: 在源碼路徑下

    2023年04月22日
    瀏覽(25)
  • 基于51單片機的DS18B20溫度顯示

    基于51單片機的DS18B20溫度顯示

    本講內(nèi)容: ? ? ? 了解溫度傳感器DS18B20的使用,并通過一個例程展示溫度傳感器DS18B20測溫過程。 DS18B20簡介: ? ? ? DS18B20 是單線數(shù)字溫度傳感器,即“一線器件”,其具有獨特的優(yōu)點: ? ? (1)采用單總線的接口方式 與微處理器連接時 僅需要一條口線即可實現(xiàn)微處理器

    2024年02月12日
    瀏覽(29)
  • 溫度傳感器DS18B20【單總線時序結構】

    溫度傳感器DS18B20【單總線時序結構】

    DS18B20是一種常見的 數(shù)字溫度傳感器 ,其控制命令和數(shù)據(jù)都是以數(shù)字信號的方式輸入輸出,相比較于模擬溫度傳感器,具有功能強大、硬件簡單、易擴展、抗干擾性強等特點 測溫范圍:-55°C 到 +125°C 通信接口: 1-Wire(單總線) 其它特征:可形成 總線結構 、內(nèi)置溫度報警功

    2024年02月04日
    瀏覽(24)
  • 【單片機】17-溫度傳感器DS18B20

    【單片機】17-溫度傳感器DS18B20

    (1)測溫度的方式:物理(汞柱,氣壓),電子(金屬電性能隨溫度變化) (2)早期:熱敏電阻(模擬接口---》 A/D轉(zhuǎn)換 ) (3)現(xiàn)代:專用sensor(數(shù)字接口,如I2C,DS18B20單總線接口等) DS18B20 可編程分辨率單總線 溫度傳感器 (1)內(nèi)置集成ADC,外部數(shù)字接口 (2) 單總線

    2024年02月04日
    瀏覽(22)
  • 51單片機溫度傳感器DS18B20

    51單片機溫度傳感器DS18B20

    實現(xiàn)功能 插上DS18B20溫度傳感器,數(shù)碼管顯示檢測的溫度值 單片機型號:STC89C52 DS18B20介紹 1、DS18B20簡介 DS18B20 是由 DALLAS 半導體公司推出的一種的“一線總線(單總線)”接口的溫度傳感器。與傳統(tǒng)的熱敏電阻等測溫元件相比,它是一種新型的體積小、 適用電壓寬、與微處理

    2024年02月01日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包