51单片机之DS18B20温度传感器实验
生活随笔
收集整理的這篇文章主要介紹了
51单片机之DS18B20温度传感器实验
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
一、 DS18B20 介紹
1、溫范圍-55℃~+125℃,在-10~+85℃時精度為±0.5℃。
2、可編程的分辨率為 9~12 位,對應(yīng)的可分辨溫度分別為 0.5℃、0.25℃、
0.125℃ 和 0.0625℃,可實現(xiàn)高精度測溫
比如我們要計算+85 度,數(shù)據(jù)輸出十六進制是 0X0550,因為高字節(jié)的高 5位為 0,表明檢測的溫度是正溫度,0X0550 對應(yīng)的十進制為 1360,將這個值乘以 12 位精度 0.0625,所以可以得到+85 度。
二、時序
DS18B20 時序包括如下幾種:初始化時序、寫(0 和 1)時序、讀(0 和 1)時序。 DS18B20 發(fā)送所有的命令和數(shù)據(jù)都是字節(jié)的低位在前。
DS18B20 的典型溫度讀取過程為:復(fù)位→發(fā) SKIP ROM 命令(0XCC)→發(fā)開始轉(zhuǎn)換命令(0X44)→延時→復(fù)位→發(fā)送 SKIP ROM 命令(0XCC)→發(fā)讀存儲器命令(0XBE)→連續(xù)讀出兩個字節(jié)數(shù)據(jù)(即溫度)→結(jié)束。
1、編寫temp.h文件
#ifndef _temp_H_ #define _temp_H_#include <reg52.h>#ifndef uchar #define uchar unsigned char #endif#ifndef uint #define uint unsigned char #endifsbit DSPORT=P3^7;void Delay1ms(unsigned int ); unsigned char Ds18b20Init(); void Ds18b20WriteByte(unsigned char com); unsigned char Ds18b20ReadByte(); void Ds18b20ChangTemp(); void Ds18b20ReadTempCom(); short Ds18b20ReadTemp();#endif2、編寫temp.c文件
#include "temp.h"void Delay1ms(uint y) {uint x;for(y;y>0;y--)for(x=110;x>0;x--); }unsigned char Ds18b20Init() {uint i;DSPORT=0; i=70; while(i--);//??642usDSPORT=1; i=0;while(DSPORT){i++;if(i>5000)return 0;}return 1; }void Ds18b20WriteByte(uchar dat) {uint i,j;for(j=0;j<8;j++){DSPORT=0; i++;DSPORT=dat&0x01; i=6;while(i--);DSPORT=1; dat>>=1;} }unsigned char Ds18b20ReadByte() {uchar byte,bi;uint i,j; for(j=8;j>0;j--){DSPORT=0;i++;DSPORT=1;i++;i++;bi=DSPORT; byte=(byte>>1)|(bi<<7); i=4;while(i--);} return byte; }void Ds18b20ChangTemp() {Ds18b20Init();Delay1ms(1);Ds18b20WriteByte(0xcc); Ds18b20WriteByte(0x44); // Delay1ms(100);}void Ds18b20ReadTempCom() { Ds18b20Init();Delay1ms(1);Ds18b20WriteByte(0xcc); Ds18b20WriteByte(0xbe); }short Ds18b20ReadTemp() {uchar temp=0;uchar tmh,tml;short tem;Ds18b20ChangTemp(); Ds18b20ReadTempCom(); tml=Ds18b20ReadByte();tmh=Ds18b20ReadByte();if(tmh>7){tmh=~tmh;tml=~tml; temp=0;}else{temp=1;} tem=tmh; tem<<=8; tem|=tml;tem=(double)tem*0.625;if(temp)return tem; else return -tem; }3、編寫main.c文件
#include "reg52.h" #include "i2c.h" #include "intrins.h"typedef unsigned int ui; typedef unsigned char uc; //#define led P2 //×¢òa£?£?2??ó";" //sbit beep=P1^5; //sbit led=P2^0; //sbit moto=P1^0; //sbit k1=P3^1; //sbit k2=P3^0; //sbit k3=P3^2; //sbit k4=P3^3;sbit LSA=P2^2;//×?μí?? sbit LSB=P2^3;//′?μí?? sbit LSC=P2^4;//???? char num=0; uc disp[8]; uc code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; uc code smgduan1[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; void delay(ui i) {while(i--); }void Datapros(int temp) {float tp;if(temp<0){disp[0] = 0x40;temp-=1;temp=~temp;tp=temp;temp=tp*0.0625*100+0.5;}else{disp[0] = 0x00;tp=temp;temp=tp*0.0625*100+0.5;}disp[1]=smgduan[temp%10000/1000];//?§??disp[2]=smgduan1[temp%1000/100];//°ù??disp[3]=smgduan[temp%100/10];//ê???disp[4]=smgduan[temp%10];//???? } void DigDisplay() {ui i;for(i=0;i<6;i++){switch(i){case(0):LSA=1;LSB=1;LSC=1; break;//led-8case(1):LSA=0;LSB=1;LSC=1; break;//led-7case(2):LSA=1;LSB=0;LSC=1; break;//led-6case(3):LSA=0;LSB=0;LSC=1; break;//led-5case(4):LSA=1;LSB=1;LSC=0; break;//led-4case(5):LSA=0;LSB=1;LSC=0; break;//led-3}P0=disp[i];delay(100);P0=0x00;} } void main() {while(1){Datapros(Ds18b20ReadTemp());DigDisplay();} }總結(jié)
以上是生活随笔為你收集整理的51单片机之DS18B20温度传感器实验的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用C#调用德卡 T10读卡器获取医保卡
- 下一篇: Leetcode.1718 构建字典序