當(dāng)前位置:
首頁 >
51单片机驱动DS18B20温度传感器测量温度
發(fā)布時(shí)間:2024/3/12
40
豆豆
生活随笔
收集整理的這篇文章主要介紹了
51单片机驱动DS18B20温度传感器测量温度
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
51單片機(jī)驅(qū)動(dòng)DS18B20溫度傳感器測量溫度
- 1.DS18B20溫度傳感器介紹;
- 2.51單片機(jī)驅(qū)動(dòng)DS18B20測量溫度
1.DS18B20溫度傳感器介紹;
①引腳定義
| 1 | GND | 地 |
| 2 | DQ | 單總線的數(shù)據(jù)輸入/輸出引腳(需接5KΩ上拉電阻) |
| 3 | V DD | 電源正 |
②測量范圍從-55 至+125 增量值為 0.5 等效的華氏溫度范圍是-67 F至257 F
增量值為 0.9 F;
③在設(shè)計(jì)電路中數(shù)據(jù)線需接5KΩ電阻;
④單線接口訪問 DS1820 的協(xié)議:
·初始化
·ROM 操作命令
·存貯器操作命令
·處理/數(shù)據(jù)
2.51單片機(jī)驅(qū)動(dòng)DS18B20測量溫度
① ds18b20.c 文件▼
#include"ds18b20.h" /******************************************************************************* * 函 數(shù) 名 : Delay1ms 12Mhz * 函數(shù)功能 : 延時(shí)函數(shù) * 輸 入 : 無 * 輸 出 : 無 *******************************************************************************/void Delay1ms(uint y) {uint x;for( ; y>0; y--){for(x=110; x>0; x--);} } /******************************************************************************* * 函 數(shù) 名 : Ds18b20Init * 函數(shù)功能 : 初始化 * 輸 入 : 無 * 輸 出 : 初始化成功返回1,失敗返回0 *******************************************************************************/uchar Ds18b20Init() {uchar i;DSPORT = 0; //將總線拉低480us~960usi = 70; while(i--);//延時(shí)642usDSPORT = 1; //然后拉高總線,如果DS18B20做出反應(yīng)會(huì)將在15us~60us后總線拉低i = 0;while(DSPORT) //等待DS18B20拉低總線{Delay1ms(1);i++;if(i>5)//等待>5MS{return 0;//初始化失敗}}return 1;//初始化成功 }/******************************************************************************* * 函 數(shù) 名 : Ds18b20WriteByte * 函數(shù)功能 : 向18B20寫入一個(gè)字節(jié) * 輸 入 : 無 * 輸 出 : 無 *******************************************************************************/void Ds18b20WriteByte(uchar dat) {uint i, j;for(j=0; j<8; j++){DSPORT = 0; //每寫入一位數(shù)據(jù)之前先把總線拉低1usi++;DSPORT = dat & 0x01; //然后寫入一個(gè)數(shù)據(jù),從最低位開始i=6;while(i--); //延時(shí)68us,持續(xù)時(shí)間最少60usDSPORT = 1; //然后釋放總線,至少1us給總線恢復(fù)時(shí)間才能接著寫入第二個(gè)數(shù)值dat >>= 1;} } /******************************************************************************* * 函 數(shù) 名 : Ds18b20ReadByte * 函數(shù)功能 : 讀取一個(gè)字節(jié) * 輸 入 : 無 * 輸 出 : 無 *******************************************************************************/uchar Ds18b20ReadByte() {uchar byte, bi;uint i, j; for(j=8; j>0; j--){DSPORT = 0;//先將總線拉低1usi++;DSPORT = 1;//然后釋放總線i++;i++;//延時(shí)6us等待數(shù)據(jù)穩(wěn)定bi = DSPORT; //讀取數(shù)據(jù),從最低位開始讀取/*將byte左移一位,然后與上右移7位后的bi,注意移動(dòng)之后移掉那位補(bǔ)0。*/byte = (byte >> 1) | (bi << 7); i = 4; //讀取完之后等待48us再接著讀取下一個(gè)數(shù)while(i--);} return byte; } /******************************************************************************* * 函 數(shù) 名 : Ds18b20ChangTemp * 函數(shù)功能 : 讓18b20開始轉(zhuǎn)換溫度 * 輸 入 : 無 * 輸 出 : 無 *******************************************************************************/void Ds18b20ChangTemp() {Ds18b20Init();Delay1ms(1);Ds18b20WriteByte(0xcc); //跳過ROM操作命令 Ds18b20WriteByte(0x44); //溫度轉(zhuǎn)換命令//Delay1ms(100); //等待轉(zhuǎn)換成功,而如果你是一直刷著的話,就不用這個(gè)延時(shí)了} /******************************************************************************* * 函 數(shù) 名 : Ds18b20ReadTempCom * 函數(shù)功能 : 發(fā)送讀取溫度命令 * 輸 入 : 無 * 輸 出 : 無 *******************************************************************************/void Ds18b20ReadTempCom() { Ds18b20Init();Delay1ms(1);Ds18b20WriteByte(0xcc); //跳過ROM操作命令Ds18b20WriteByte(0xbe); //發(fā)送讀取溫度命令 } /******************************************************************************* * 函 數(shù) 名 : Ds18b20ReadTemp * 函數(shù)功能 : 讀取溫度 * 輸 入 : 無 * 輸 出 : 無 *******************************************************************************/int Ds18b20ReadTemp() {int temp = 0;uchar tmh, tml;Ds18b20ChangTemp(); //先寫入轉(zhuǎn)換命令Ds18b20ReadTempCom(); //然后等待轉(zhuǎn)換完后發(fā)送讀取溫度命令tml = Ds18b20ReadByte(); //讀取溫度值共16位,先讀低字節(jié)tmh = Ds18b20ReadByte(); //再讀高字節(jié)temp = tmh;temp <<= 8;temp |= tml;return temp; }② ds18b20.h 文件▼
#ifndef __DS18B20_H_ #define __DS18B20_H_#include<reg52.h> //---重定義關(guān)鍵詞---// #ifndef uchar #define uchar unsigned char #endif#ifndef uint #define uint unsigned int #endif//--定義使用的IO口--// sbit DSPORT=P3^7;//--聲明全局函數(shù)--// void Delay1ms(uint ); uchar Ds18b20Init(); void Ds18b20WriteByte(uchar com); uchar Ds18b20ReadByte(); void Ds18b20ChangTemp(); void Ds18b20ReadTempCom(); int Ds18b20ReadTemp();#endif總結(jié)
以上是生活随笔為你收集整理的51单片机驱动DS18B20温度传感器测量温度的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何用matlab测a相相电流,基于MA
- 下一篇: 基于有源钳位三电平的有源电力滤波器(AN