当前位置: 首页>編程日記>正文

51单片机驱动——DS18B20

51单片机驱动——DS18B20

51单片机驱动——DS18B20

1.描述

DS18B20是常用的环境温度测量的传感器,但其对通信时序要求较高,而51单片机资源有限,大部分人在使用时也不会严格对照数据手册的时序图操作,所以经常会有人遇到,网上下载的代码无法正常驱动DS18B20读取环境温度,有的代码在Proteus等仿真软件里是可以正常使用的(时钟频率设定等因素),但在实物中就不能实现对应功能。下面的这个代码是在实物系统中验证过的,我也简单封装了一下,大家可以直接复制使用。

2.子文件

DS18B20.c

#include "DS18B20.h"sbit DS18B20=P1^0;  //定义数据线void delay_ms(unsigned int x)//延时1ms
{unsigned int y,z;for(y=x;y>0;y--)for(z=110;z>0;z--);
}uchar DS18B20_Init()       //初始化。成功返回1,不成功返回0.{uchar i;DS18B20 = 0;		     //将总线拉低480微秒~960微秒i = 70;	 while(i--);			 //延时642微秒DS18B20 = 1;			 //拉高总线,等待后续反馈i = 0;while(DS18B20)	    //等待DS18B20拉低总线{ delay_ms(1);      //定义的延迟1ms的延迟函数i++;if(i>5)           //等待5ms以上{return 0;      //初始化失败}}return 1;             //初始化成功
}uchar DS18B20_ReadByte() //通过读取8次状态位达到读取字节的目的
{uchar byte, bi;uint i, j;	for(j=8; j>0; j--){DS18B20 = 0;		//先将总线拉低i++;DS18B20 = 1;		//然后释放总线i++;i++;				//延时6微秒等待数据稳定bi = DS18B20;	   //读取数据,从最低位开始读取byte = (byte >> 1) | (bi << 7);	//从最低位开始记录,将byte依次右移					  i = 4;				//读取完之后等待48微秒再接着读取下一个数while(i--);}				return byte;         //将读取完的字节保存
}void DS18B20_WriteByte(uchar dat)//函数通过循环写8个位实现写一个字节
{uint i, j;for(j=0; j<8; j++){DS18B20 = 0;	     	//每写入一位数据之前先把总线拉低i++;DS18B20 = dat & 0x01;   //然后写入一个数据,从最低位开始i=6; while(i--);             //延时68微秒DS18B20 = 1; //释放总线,给总线1微秒恢复时间才能接着写入下一位			dat >>= 1;}
}int DS18B20_ReadTemp()  //读取的温度有两个字节,分别用tml和tmh存储两个字节
{int temp = 0;uchar tmh, tml;DS18B20_Init();						//传感器初始化delay_ms(1);						//延时1微秒DS18B20_WriteByte(0xcc);			//跳过读取序列号操作		 DS18B20_WriteByte(0x44);			//温度转换指令		//完成温度转换功能DS18B20_Init();						//传感器初始化delay_ms(1);						DS18B20_WriteByte(0xcc);	 		//跳过读取序列号操作DS18B20_WriteByte(0xbe);			//发送读取温度指令//然后等待转换完后发送读取温度命令tml = DS18B20_ReadByte();		//读取温度值共16位,先读低字节tmh = DS18B20_ReadByte();		//再读高字节temp = tmh;			//先存高字节,后面通过移位存储低字节temp <<= 8;temp |= tml;return temp;
}uint Temper_change()
{uint temper;float tp;//temper=read_temper();temper=DS18B20_ReadTemp();if(temper<0)    //考虑负温度的情况{temper=temper-1;temper=~temper;tp=temper*0.0625;  //16位温度转换成10进制的温度temper=tp*100+0.5;   //留两个小数点,并四舍五入}else{tp=temper*0.0625;  //16位温度转换成10进制的温度temper=tp*100+0.5;  //留两个小数点,并四舍五入}return temper;
}

DS18B20.h

#ifndef __DS18B20_H__
#define __DS18B20_H__
#include<reg52.h>#define uchar unsigned char
#define uint unsigned intuint Temper_change();void delay_ms(unsigned int x);//延时1ms
#endif

3.调用举例

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<intrins.h>
#include "ds18b20.h"unsigned int temper_value;//用于存储温度数据void main(void) 
{
while (1) { temper_value = Temper_change();//temper_value,后续可以用来显示、或者判断等。}
}


https://www.fengoutiyan.com/post/15386.html

相关文章:

  • 鏡像模式如何設置在哪,圖片鏡像操作
  • 什么軟件可以把圖片鏡像翻轉,C#圖片處理 解決左右鏡像相反(旋轉圖片)
  • 手機照片鏡像翻轉,C#圖像鏡像
  • 視頻鏡像翻轉軟件,python圖片鏡像翻轉_python中鏡像實現方法
  • 什么軟件可以把圖片鏡像翻轉,利用PS實現圖片的鏡像處理
  • 照片鏡像翻轉app,java實現圖片鏡像翻轉
  • 什么軟件可以把圖片鏡像翻轉,python圖片鏡像翻轉_python圖像處理之鏡像實現方法
  • matlab下載,matlab如何鏡像處理圖片,matlab實現圖像鏡像
  • 圖片鏡像翻轉,MATLAB:鏡像圖片
  • 鏡像翻轉圖片的軟件,圖像處理:實現圖片鏡像(基于python)
  • canvas可畫,JavaScript - canvas - 鏡像圖片
  • 圖片鏡像翻轉,UGUI優化:使用鏡像圖片
  • Codeforces,CodeForces 1253C
  • MySQL下載安裝,Mysql ERROR: 1253 解決方法
  • 勝利大逃亡英雄逃亡方案,HDU - 1253 勝利大逃亡 BFS
  • 大一c語言期末考試試題及答案匯總,電大計算機C語言1253,1253《C語言程序設計》電大期末精彩試題及其問題詳解
  • lu求解線性方程組,P1253 [yLOI2018] 扶蘇的問題 (線段樹)
  • c語言程序設計基礎題庫,1253號C語言程序設計試題,2016年1月試卷號1253C語言程序設計A.pdf
  • 信奧賽一本通官網,【信奧賽一本通】1253:抓住那頭牛(詳細代碼)
  • c語言程序設計1253,1253c語言程序設計a(2010年1月)
  • 勝利大逃亡英雄逃亡方案,BFS——1253 勝利大逃亡
  • 直流電壓測量模塊,IM1253B交直流電能計量模塊(艾銳達光電)
  • c語言程序設計第三版課后答案,【渝粵題庫】國家開放大學2021春1253C語言程序設計答案
  • 18轉換為二進制,1253. 將數字轉換為16進制
  • light-emitting diode,LightOJ-1253 Misere Nim
  • masterroyale魔改版,1253 Dungeon Master
  • codeformer官網中文版,codeforces.1253 B
  • c語言程序設計考研真題及答案,2020C語言程序設計1253,1253計算機科學與技術專業C語言程序設計A科目2020年09月國家開 放大學(中央廣播電視大學)
  • c語言程序設計基礎題庫,1253本科2016c語言程序設計試題,1253電大《C語言程序設計A》試題和答案200901
  • 肇事逃逸車輛無法聯系到車主怎么辦,1253尋找肇事司機