ds18b20溫度傳感器的使用
一、傳感器分類:
- 數字溫度傳感器,實現簡單,不需要額外轉換電路,采集過來的就是數字溫度值
- 模擬溫度傳感器->熱敏電阻->AD轉換電路->數字值
二、傳感器接口:
- GPIO接口:(ds18b20是特殊的單線GPIO接口)
- I2C接口:SCLSDAVCCGND
- SPI接口:SCLK、CS.MOSL、MISO
- ADC接口:板子ADC進行模數轉換
- UART接口:GPS
三、ds18b20的主從通信方式
ds18b20的封裝形式:
在51上,與dq數據請求線相連接的網絡接口是P37,P37通過上拉電阻與VCC相連,說明引腳在空閑狀態下處于高電平。
四、ds18b20的通信流程:
復位信號:51單片機復位,問ds18b20在不在
存在信號:“ds18b20"回復一個存在脈沖
每次和ds18b20通信前:必須要復位
1復位or存在、讀、寫時序圖
2(復位函數、讀函數、寫函數)
#include <reg51.h>
#include "delay.h"//51 單片機復位后 所有特殊功能寄存器都被硬件清 0#define DQ_HIGH (P3 |= (1 << 7))//將DQ引腳拉高
#define DQ_DOWN (P3 &= ~(1 << 7))//將DQ引腳拉低
#define DQ_CHECK ((P3 & (1 << 7)) != 0)//檢測DQ引腳電平 P37高電平輸出1 低電平輸出0//ds18b20復位函數
int de18b20_Reset(void)
{int t = 0;DQ_DOWN; //將引腳拉低Delay10us(70);// 延時70usDQ_HIGH; //將引腳拉高Delay10us(5);// 延時60us//在300us內檢測DQ引腳是否被拉低(跳出循環),如果被拉低代表ds18b20回復了一個存在脈沖信號while(DQ_CHECK && t < 30){Delay10us(1);t++;}if(t >= 30){return 0;}//在300us內檢測DQ引腳是否被拉高(跳出循環),如果被拉低代表ds18b20回復了一個存在脈沖信號while(!DQ_CHECK && t < 30){Delay10us(1);t++;}if(t >= 30){return 0;}return 1;
}//向ds18b20發送一個字節數據
void write_ds18b20(unsigned char dat)
{int i = 0;//判斷發送的數據的8bit是1還是0for(i = 0;i < 8;i++){if(dat & 1 == 1) //bit 1{DQ_DOWN;_nop_();_nop_();//空轉延遲1us左右DQ_HIGH;Delay10us(5);}else //bit 0{DQ_DOWN;Delay10us(5);DQ_HIGH;}dat = dat >> 1;//dat右移 始終把要發送的bit放置在最低位 和1比較}
}//從ds18b20讀取一個字節數據
unsigned char read_ds18b20(void)
{int i = 0;unsigned char ret = 0;for (i = 0; i < 8;i++){DQ_DOWN;_nop_();_nop_();DQ_HIGH; //拉高才能檢測到ds18b20發送了0 _nop_();_nop_();_nop_();if (DQ_CHECK) // 檢測到發送的電平為1 代表發送數字1{ret = ret|(1 << i); //把發過來的為1的數字放到指定位置} //發送了0不用管 ret初始化全為0;Delay10us(5);}return ret;
}
3 ds18b20獲取數據流程
- ??(1)復位
- (2)51單片機發送0xCC,代表跳過ROM
- (3)51單片機發送0x44,代表ds18b20開啟溫度轉換
- (4)延時等待(1s)
- (5)復位
- (6)51單片機發送0xCC,代表跳過ROM
- (7)51單片機發送0xBE,代表讀取ds18b20發送過來的溫度值
- (8)讀取溫度數據
//獲取ds18n20采集到的溫度 傳遞的是兩個字節的數據
float get_tempt(void)
{short ret = 0; //兩個字節unsigned char tl = 0;//一個字節unsigned char th = 0;//一個字節de18b20_Reset();write_ds18b20(0xCC);write_ds18b20(0x44);Delay1ms(1000);//延時1sde18b20_Reset();write_ds18b20(0xCC);write_ds18b20(0xBE);//先讀低位tl = read_ds18b20(); th = read_ds18b20();ret = th << 8; //先把高位放進來ret |= tl; //再把低位放到高位后面接著return ret * 0.0625;//分辨率 展示的是溫度
}
4分辨率:ds18b20:
- 9位分辨率:精度±0.5℃
- 10位分辨率:精度±0.25°℃
- 11位分辨率:精度±0.125℃
- 12位分辨率:精度±0.0625℃