在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何利用DS18B20傳感器通過PIC微控制器獲得溫度

科技觀察員 ? 來源:circuitdigest ? 作者:蘇拉夫·古普塔 ? 2022-11-16 16:06 ? 次閱讀

通常,LM35溫度傳感器微控制器一起使用以測量溫度,因為它便宜且易于獲得。但是 LM35 給出了模擬值,我們需要使用 ADC模數轉換器)將它們轉換為數字值。但今天我們使用DS18B20溫度傳感器,不需要ADC轉換即可獲得溫度。在這里,我們將使用帶有DS18B20的PIC微控制器來測量溫度。

因此,在這里,我們使用微芯片的PIC16F877A微控制器單元構建具有以下規格的溫度計。

它將顯示從 -55 度到 +125 度的全溫度范圍。

僅當溫度變化 + / - .2 度時,它才會顯示溫度。

所需組件:-

Pic16F877A – PDIP40 封裝

面包板

皮基特-3

5V 適配器

液晶顯示器 JHD162A

DS18b20 溫度傳感器

用于連接外圍設備的電線。

4.7k 電阻器 – 2 個

10k鍋

20mHz 晶體

2 個 33pF 陶瓷電容器

DS18B20溫度傳感器:

DS18B20是一款出色的傳感器,可準確檢測溫度。該傳感器提供 9 位至 12 位的溫度檢測分辨率。該傳感器僅與一根導線通信,不需要任何ADC即可獲取模擬溫度并將其轉換為數字溫度。

傳感器的規格是:-

測量溫度范圍為 -55°C 至 +125°C(-67°F 至 +257°F)

-10°C 至 +85°C 范圍內精度為 ±0.5°C

編程分辨率從 9 位到 12 位

無需外部組件

傳感器采用1-Wire?接口

poYBAGN0mfeAZLWkAAA6uFPLWtY999.png

如果我們查看數據表中的上述引腳排列圖像,我們可以看到傳感器看起來與 BC547 或 BC557 封裝 TO-92 完全相同。第一個引腳是接地,第二個引腳是DQ或數據,第三個引腳是VCC。

以下是數據表中的電氣規格,這是我們設計所需的。傳感器的額定電源電壓為+3.0V至+5.5V。它還需要上拉電源電壓,該電壓與上述電源電壓相同。

pYYBAGN0mfqAJUPqAABrNfcc0ys308.png

此外,對于 -10 攝氏度到 +10 攝氏度的范圍,精度裕度為 +-0.5 攝氏度,全范圍裕度的精度會發生變化,對于 -55 度到 +125 度范圍,精度裕度為 +-2 度。

如果我們再次查看數據表,我們將看到傳感器的連接規格。我們可以在需要兩根電線(DATA 和 GND)的寄生電源模式下連接傳感器,或者可以使用外部電源連接傳感器,其中需要三根單獨的電線。我們將使用第二種配置。

pYYBAGN0mfyAABPaAAAl5taa1-c939.png

由于我們現在熟悉傳感器和連接相關區域的額定功率,我們現在可以專注于制作原理圖。

電路圖:-

poYBAGN0mkaANw-4AAEdEFLrgHQ712.png

如果我們看到電路圖,我們將看到:-

16x2字符LCD通過PIC16F877A微控制器連接,其中RB0,RB1,RB2連接到LCD引腳RS,R/W和E。RB4、RB5、RB6 和 RB7 通過 LCD 的 4 針 D4、D5、D6、D7 連接。液晶屏以4位模式或半字節模式連接。

一個 20MHz 晶體振蕩器和兩個 33pF 陶瓷電容器連接在 OSC1 和 OSC2 引腳上。它將為微控制器提供恒定的20Mhz時鐘頻率。

DS18B20也按照引腳配置連接,如前所述,采用4.7k上拉電阻連接。我已經在面包板上連接了所有這些。

如果您不熟悉 PIC 微控制器,請按照我們的 PIC 微控制器教程進行操作,說明 PIC 微控制器入門。

步驟或代碼流:-

設置微控制器的配置,包括振蕩器配置。

設置LCD的所需端口,包括TRIS寄存器

使用ds18b20傳感器的每個周期都以復位開始,因此我們將復位ds18b20并等待存在脈沖。

編寫暫存器并將傳感器的分辨率設置為 12 位。

跳過ROM讀取,然后跳過復位脈沖。

提交轉換溫度命令。

從暫存器讀取溫度。

檢查溫度值是負值還是正值。

在 16x2 LCD 上打印溫度。

等待溫度變化 +/-.20 攝氏度。

pYYBAGN0mgKAC973AAEFi64GyM4994.jpg

代碼說明:

本教程末尾提供了此數字溫度計的完整代碼,并附有演示視頻。您將需要一些頭文件來運行該程序,可以從此處下載

首先,我們需要在 pic 微控制器中設置配置位,然后從 void main 函數開始。

然后下面四行用于包括庫頭文件,lcd.h和ds18b20.h。 xc.h 用于微控制器頭文件。

#include
#include
#include "supporting c files/ds18b20.h"
#include "supporting c files/lcd.h"
這些定義用于向溫度傳感器發送命令。這些命令列在傳感器的數據表中。

#define skip_rom 0xCC
#define convert_temp 0x44
#define write_scratchpad 0x4E
#define resolution_12bit 0x7F
#define read_scratchpad 0xBE

poYBAGN0mgSATwpKAAB9IC2Q42k470.png

傳感器數據表中的表 3 顯示了使用宏發送相應命令的所有命令。

僅當溫度變化 +/- .20 度時,溫度才會顯示在屏幕上。我們可以從這個temp_gap宏觀上改變這個溫差。通過更改此宏中的值,規范將更改。

另外兩個浮點變量用于存儲顯示的溫度數據,并用溫差區分它們

#define temp_gap 20
float pre_val=0, aft_val=0;
.

在void main()函數中,lcd_init();是一個初始化LCD的函數。此 lcd_init() 函數是從 lcd.h 庫中調用的。

TRIS 寄存器用于選擇 I/O 引腳作為輸入或輸出。兩個無符號短變量 TempL 和 TempH 用于存儲來自溫度傳感器的 12 位分辨率數據。

void main(void) {
TRISD = 0xFF;
TRISA = 0x00;
TRISB = 0x00;
//TRISDbits_t.TRISD6 = 1;
unsigned short TempL, TempH;
unsigned int t, t2;
float difference1=0, difference2=0;
lcd_init();
讓我們看看 while 循環,這里我們將 while(1) 循環分解成小塊。

這些線用于檢測溫度傳感器是否連接。

while(ow_reset()){
lcd_com(0x80);
lcd_puts ("Please Connect ");
lcd_com (0xC0);
lcd_puts("Temp-Sense Probe");
}
通過使用這段代碼,我們初始化傳感器并發送命令來轉換溫度。

lcd_puts (" ");
ow_reset();
write_byte(write_scratchpad);
write_byte(0);
write_byte(0);
write_byte(resolution_12bit); // 12bit resolution
ow_reset();
write_byte(skip_rom);
write_byte(convert_temp);
此代碼用于將 12 位溫度數據存儲在兩個無符號短變量中。

while (read_byte()==0xff);
__delay_ms(500);
ow_reset();
write_byte(skip_rom);
write_byte(read_scratchpad);
TempL = read_byte();
TempH = read_byte();
然后,如果您檢查下面的完整代碼,我們將創建if-else條件來找出溫度符號是正數還是負數。

通過使用 If 語句代碼,我們操作數據并查看溫度是否為負,并確定溫度變化是否在 +/- .20 度范圍內。在其他地方,我們檢查溫度是否為正和溫度變化檢測。

從DS18B20溫度傳感器獲取數據:

讓我們看看1-Wire?接口的時差。我們正在使用20Mhz晶體。如果我們查看 ds18b20.c 文件,我們會看到

#define _XTAL_FREQ 20000000

此定義用于 XC8 編譯器延遲例程。20Mhz設置為晶體頻率。

我們制作了五個功能

ow_reset

read_bit

read_byte

write_bit

write_byte

1-Wire協議需要嚴格的時序相關插槽進行通信。在數據表中,我們將獲得完美的時隙相關信息。?

pYYBAGN0mgWAauHGAABBgpiNS1Y726.png

在下面的函數中,我們創建了確切的時間段。為保持和釋放創建確切的延遲并控制相應傳感器端口的TRIS位非常重要。

unsigned char ow_reset(void)
{
DQ_TRIS = 0; // Tris = 0 (output)
DQ = 0; // set pin# to low (0)
__delay_us(480); // 1 wire require time delay
DQ_TRIS = 1; // Tris = 1 (input)
__delay_us(60); // 1 wire require time delay

if (DQ == 0) // if there is a presence pluse
{
__delay_us(480);
return 0; // return 0 ( 1-wire is presence)
}
else
{
__delay_us(480);
return 1; // return 1 ( 1-wire is NOT presence)
}
} // 0=presence, 1 = no part

現在,根據以下讀取和寫入中使用的時隙描述,我們分別創建了讀取和寫入函數。

poYBAGN0mgmATbbjAAB6Ph233Uc517.png

unsigned char read_bit(void)
{
unsigned char i;
DQ_TRIS = 1;
DQ = 0; // pull DQ low to start timeslot
DQ_TRIS = 1;
DQ = 1; // then return high
for (i=0; i<3; i++); // delay 15us from start of timeslot
return(DQ); // return value of DQ line
}

void write_bit(char bitval)
{
DQ_TRIS = 0;
DQ = 0; // pull DQ low to start timeslot
if(bitval==1) DQ =1; // return DQ high if write 1
__delay_us(5); // hold value for remainder of timeslot
DQ_TRIS = 1;
DQ = 1;
}// Delay provides 16us per loop, plus 24us. Therefore delay(5) = 104us

這就是我們如何利用DS18B20傳感器通過PIC微控制器獲得溫度。

/*

* File: main.c

* Author: Sourav Gupta

*

* Created on 11 April 2018, 17:57

*/



/*

* Configuration Related settings. Specific for microcontroller unit.

*/

#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)

#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)

#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)

#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)

#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3/PGM pin has PGM function; low-voltage programming enabled)

#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)

#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)

#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)

#define _XTAL_FREQ 20000000

/*

* System Header files inclusions

*/



#include

#include

#include "supporting c files/ds18b20.h"

#include "supporting c files/lcd.h"



/*

* Ds18b20 related definition

*/



#define skip_rom 0xCC

#define convert_temp 0x44

#define write_scratchpad 0x4E

#define resolution_12bit 0x7F

#define read_scratchpad 0xBE



/*

* User interface related definitions

*/



#define temp_gap 20



float pre_val=0, aft_val=0;



/*

* Program flow related functions

*/



void sw_delayms(unsigned int d);



/* Main function / single Thread*/

void main(void) {

TRISD = 0xFF;

TRISA = 0x00;

TRISB = 0x00;

//TRISDbits_t.TRISD6 = 1;

unsigned short TempL, TempH;

unsigned int t, t2;

float difference1=0, difference2=0;

lcd_init();

while(1){

float i=0;

/* This is for presence detection of temp-sensing probe*/

while(ow_reset()){

lcd_com(0x80);

lcd_puts ("Please Connect ");

lcd_com (0xC0);

lcd_puts("Temp-Sense Probe");

}

/*------------------------------------------------------*/



lcd_puts (" ");

ow_reset();

write_byte(write_scratchpad);

write_byte(0);

write_byte(0);

write_byte(resolution_12bit); // 12bit resolution

ow_reset();

write_byte(skip_rom);

write_byte(convert_temp);



while (read_byte()==0xff);

__delay_ms(500);

ow_reset();



write_byte(skip_rom);

write_byte(read_scratchpad);



TempL = read_byte();

TempH = read_byte();



/*This is for Negative temperature*/



/*If result (TempH [Bitwise and] 1000 0000) = not 0

*then this condition get true.

case1. -0.5 degree value = 1111 1111. [1111 1111 & 1000 0000 = 1000 0000 which is not 0.]

case2. -55 degree value = 1111 1100. [1111 1100 & 1000 0000 = 1000 0000 which is not 0]

0x80 = 1000 0000

Test Case -10.125 output 1111 1111 0101 1110*/



if((TempH & 0x80)!=0){ // If condition will execute as TempH = 1111 1111 & 1000 0000 = 1000 0000.

t=TempH;// Store tempH value in t = 1111 1111 .

t<<=8;//after bitwise left shift 8 times value in t will be 1111 1111 0000 0000. ??

t=t|TempL;// t = 1111 1111 0000 0000 | 0101 1110 [ result t = 1111 1111 0101 1110]

t=t-1;//t = t-1 in this case t = 1111 1111 0101 1101.

t=~t;// t = 0000 0000 1010 0010.

t>>=4;// t = 0000 0000 0000 1010.

t=t*100;// t = 10 * 100 = 1000.

t2=TempL; //Store tempL value = 0101 1110.

t2=t2-1;// t2= 0101 1101

t2=~t2;//t2 = 1010 0010

t2=t2&0x0f;// t2 = 1010 0010 | 0000 1111 = 0000 0010

t2=t2 * 6.25; // 0000 00010 = 2 x 6.25 = 12.50

i=((unsigned int)t ) + (unsigned int)t2; //put both value in one variable 1000 + 12.5 = 1012.5



/*This if-else condition done because LCD would not refresh till temperature change -.20 or +.20 degree*/



pre_val=aft_val;



difference1 = pre_val - i;

difference2 = i - pre_val;



if(difference1 > temp_gap || difference2 > temp_gap){

aft_val = i;

lcd_com (0x80);

lcd_puts ("Circuit Digest");

lcd_com (0xc0);

lcd_puts("-");

lcd_bcd (5,aft_val);

lcd_data(223);

lcd_puts("C ");

}

else{

lcd_com (0x80);

lcd_puts ("Circuit Digest");

lcd_com (0xc0);

lcd_puts("-");

lcd_bcd (5,pre_val);

lcd_data(223);

lcd_puts("C ");





}

}

/*This is for positive Temperature*/

else {

i=((unsigned int)TempH << 8 ) + (unsigned int)TempL; //put both value in one variable?

i = i * 6.25; //calculations used from the table provided in the data sheet of ds18b20



/*This if-else condition done because LCD would not refresh till temperature change -.20 or +.20 degree*/

pre_val=aft_val;



difference1 = pre_val - i;

difference2 = i - pre_val;



if(difference1 > temp_gap || difference2 > temp_gap){

aft_val = i;

lcd_com (0x80);

lcd_puts ("Circuit Digest");

lcd_com (0xc0);

lcd_bcd (5,aft_val);

lcd_data(223);

lcd_puts("C ");



}

else{

lcd_com (0x80);

lcd_puts ("Circuit Digest");

lcd_com (0xc0);

lcd_bcd (5,pre_val);

lcd_data(223);

lcd_puts("C ");

}

}

}

return;

}



void sw_delayms(unsigned int d){

int x, y;

for(x=0;x

for(y=0;y<=1275;y++);?

}

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 溫度傳感器
    +關注

    關注

    48

    文章

    2967

    瀏覽量

    156266
  • adc
    adc
    +關注

    關注

    99

    文章

    6528

    瀏覽量

    545341
  • PIC
    PIC
    +關注

    關注

    8

    文章

    507

    瀏覽量

    87696
  • DS18B20
    +關注

    關注

    10

    文章

    780

    瀏覽量

    80999
收藏 人收藏

    評論

    相關推薦

    基于STM32的DS18B20溫度傳感器設計

    DS18B20內置了64位產品序列號,方便識別身份,在一根線上可以掛接多個DS18B20傳感器通過64位身份驗證,可以分別讀取來至不同傳感器
    的頭像 發表于 03-07 11:44 ?1.3w次閱讀
    基于STM32的<b class='flag-5'>DS18B20</b><b class='flag-5'>溫度</b><b class='flag-5'>傳感器</b>設計

    DS18B20溫度傳感器是什么

    的EEPROM,精度降低為±2°C,適用于對性能要求不高,成本控制嚴格的應用,是經濟型產品。 繼“一線總線”的早期產品后,DS1820開辟了溫度傳感器技術的新概念。
    發表于 04-27 08:14

    DS18B20數字溫度傳感器概述

    的1-Wire即單總線通信方式,即僅采用一個數據線與微控制器進行通信。該傳感器溫度監測范圍為-55℃至+125℃,并且在溫度超過-10℃至85℃之外時還具有+-0.5℃的精度。此外,
    發表于 12-08 06:34

    利用數字溫度傳感器DS18B20測量溫度信號

    DS18B20一、實驗目的二、實驗內容三、實驗步驟四、C代碼如下五、實驗結果六、實驗體會一、實驗目的本次的設計主要是利用了數字溫度傳感器DS18B2
    發表于 12-13 07:37

    數字溫度傳感器DS18B20的設計及應用

    數字溫度傳感器DS18B20的設計及應用 1引言 DS18B20是DALLAS公司生產的一線式數字溫度
    發表于 04-02 18:00 ?2846次閱讀
    數字<b class='flag-5'>溫度</b><b class='flag-5'>傳感器</b><b class='flag-5'>DS18B20</b>的設計及應用

    DS18B20數字溫度傳感器

    本設計基于單片機STM32開發板,對DS18B20數字溫度傳感器進行控制,有源代碼
    發表于 05-11 14:54 ?42次下載

    溫度傳感器DS18B20

    溫度傳感器DS18B20 51例程,親測可用
    發表于 06-14 15:36 ?20次下載

    智能溫度傳感器DS18B20的原理與應用

    DS18B20是DALLAS公司生產的單線數字溫度傳感器,他具有獨特的單線總線接口方式。文章詳細的介紹了單線數字溫度傳感器
    發表于 10-11 18:19 ?49次下載

    ds18b20的特性_ds18b20溫度傳感器應用

    本文首先介紹了ds18b20的特性,其次介紹了DS18B20工作原理,最后介紹了ds18b20溫度傳感器應用。
    發表于 04-24 09:10 ?1.1w次閱讀
    <b class='flag-5'>ds18b20</b>的特性_<b class='flag-5'>ds18b20</b><b class='flag-5'>溫度</b><b class='flag-5'>傳感器</b>應用

    DS18B20數字溫度傳感器概述及控制時序

    DS18B20數字溫度傳感器提供9-Bit到12-Bit的攝氏溫度測量精度和一個用戶可編程的非易失性且具有過溫和低溫觸發報警的報警功能。DS18B2
    的頭像 發表于 03-07 15:08 ?1.1w次閱讀

    ds18b20溫度傳感器和dht11的區別

    進行通信。這種傳感器可以提供9位到12位的數字溫度讀數,精度非常高。DS18B20的工作原理是通過測量其內部溫度
    的頭像 發表于 09-03 16:44 ?1958次閱讀

    ds18b20溫度傳感器如何使用

    DS18B20是一款廣泛使用的數字溫度傳感器,它具有高精度、低功耗和易于使用的特點。 DS18B20溫度
    的頭像 發表于 09-03 16:51 ?780次閱讀

    ds18b20溫度傳感器怎么接線

    DS18B20是一種廣泛使用的數字溫度傳感器,它基于1-Wire(一線)通信協議工作。這種傳感器因其高精度、易用性和低成本而受到歡迎。 DS18B2
    的頭像 發表于 10-18 14:50 ?1755次閱讀

    ds18b20傳感器的使用方法

    Integrated開發的一種數字溫度傳感器,它能夠提供9位到12位的溫度測量精度,測量范圍從-55°C到+125°C。這種傳感器非常適合用于需要精確
    的頭像 發表于 10-18 14:52 ?1061次閱讀

    DS18B20溫度傳感器的工作原理和硬件設計

    通過本文可以了解DS18B20溫度傳感器工作原理、硬件設計、DS18B20單總線接口驅動編寫。
    的頭像 發表于 10-24 14:38 ?3130次閱讀
    <b class='flag-5'>DS18B20</b><b class='flag-5'>溫度</b><b class='flag-5'>傳感器</b>的工作原理和硬件設計
    主站蜘蛛池模板: 四虎永久免费网站入口2020| 特级黄视频| 国产黄色在线看| 中文字幕一区二区三区精彩视频| 中文字幕亚洲一区二区三区| 特黄aa级毛片免费视频播放| 免费男女| 亚洲免费影视| 色狠狠色综合久久8狠狠色| 欧美一区a| 国产一级特黄| 永久看片| 乱操视频| 免费啪啪小视频| 亚州三级视频| 一级做a爰片久久免费| 色操网| 老司机51精品视频在线观看| 丁香婷婷影院| 清纯漂亮小美女准备啪啪| 99草在线视频| 欧美aⅴ| 色婷婷综合久久久中文字幕| 看日本黄色大片| 中国理论片| 国产日日干| 欧美视频一区二区三区在线观看| 亚洲国产精品久久久久婷婷老年 | 色中色在线视频| 91精品福利视频| 久99热| 日韩毛片在线视频| 国产福利你懂的| 免费观看黄a一级视频| 4438x全国免费| 亚洲xx网| 激情五月综合婷婷| 日日夜夜精品| 在线观看日本免费视频大片一区| 亚洲国产婷婷香蕉久久久久久 | 男男h啪肉np文总受|