日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

51单片机之DS18B20温度传感器实验

發布時間:2024/3/12 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 51单片机之DS18B20温度传感器实验 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、 DS18B20 介紹

1、溫范圍-55℃~+125℃,在-10~+85℃時精度為±0.5℃。
2、可編程的分辨率為 9~12 位,對應的可分辨溫度分別為 0.5℃、0.25℃、
0.125℃ 和 0.0625℃,可實現高精度測溫

比如我們要計算+85 度,數據輸出十六進制是 0X0550,因為高字節的高 5位為 0,表明檢測的溫度是正溫度,0X0550 對應的十進制為 1360,將這個值乘以 12 位精度 0.0625,所以可以得到+85 度。

二、時序
DS18B20 時序包括如下幾種:初始化時序、寫(0 和 1)時序、讀(0 和 1)時序。 DS18B20 發送所有的命令和數據都是字節的低位在前。
DS18B20 的典型溫度讀取過程為:復位→發 SKIP ROM 命令(0XCC)→發開始轉換命令(0X44)→延時→復位→發送 SKIP ROM 命令(0XCC)→發讀存儲器命令(0XBE)→連續讀出兩個字節數據(即溫度)→結束。

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();#endif

2、編寫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();} }

總結

以上是生活随笔為你收集整理的51单片机之DS18B20温度传感器实验的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。