DS18B20
DS18B20驱动 |
[ 2012-5-14 12:01:00 | By: 吴师傅 ]
|
14
一.概述 DS18B20是一种单总线数字温度传感器。測试温度范围-55℃-125℃,温度数据位可配置为9、10、11、12位,相应的刻度值分别为0.5℃、0.25℃、0.125℃、0.0625℃,相应的最长转换时间分别为93.75ms、187.5ms、375ms、750ms。出厂默认配置为12位数据,刻度值为0.0625℃,最长转换时间为750ms。从以上数据能够看出,DS18B20数据位越低、转换时间越短、反应越快、精度越低。 单总线,意味着没有时钟线,仅仅有一根通信线。单总线读写数据是靠控制起始时间和採样时间来完毕,所以时序要求非常严格,这也是DS18B20驱动编程的难点。 须要注意的是,DS18B20和同一系列的DS18S20,在读写上,时序、命令一致,但因温度值存放的位置不一样,对温度数据的处理也不一样,所以程序不能直接套用。 二.电路设计 在WSF-51DB开发板上,利用AT89S52单片机的P1.1脚来驱动DS18B20,上拉电阻阻值为4.7K欧姆。DS18B20的上拉电阻的阻值是一个须要注意的參数,假设DS18B20放置的位置离电路板较远,须要用较长的电缆来连接时,上拉电阻要对应减小,以弥补线路损耗,并且连接电缆要选用优质的三芯带屏蔽层的电缆,否则不能正常读写数据。 三.软件设计 /***************************************************************** *程序名称:DS18B20驱动 *程序功能:读写DS18B20,数码管显示温度值,温度值精度为0.1度。 *开发工具:WSF-51DB开发板 * MCU型号:AT89S52-24PU *时钟频率:11.0592-12MHZ *程序作者:吴师傅 *版权说明:吴师傅版权全部,转载请注明来源和作者。 *****************************************************************/ #i nclude <reg52.h> #i nclude <intrins.h> unsigned char tempflag,fraction,tempr; unsigned char code segmcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴极数码管段码0-9 unsigned char code bitcode[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //8位共阴极数码管位码 unsigned char code fractioncode[]={0,0,1,2,2,3,4,4,5,6,6,7,8,8,9,9}; //将DS18B20的小数部分的0-f刻度转换为0-9刻度的查找表,将精度化为0.1度 sbit ser=P2^0;//74HC595串行数据输入 sbit oe=P2^1;//74HC595使能 sbit rclk=P2^2; //74HC595数据锁存 sbit srclk=P2^3;// 74HC595串行时钟 sbit DQ=P1^1; //温度总线 //延时函数(12MHZ晶振): void Delayus(unsigned char t) { //此函数精确计算:18+6*(t-1)=延时时间(us) while(t--); } //延时ms延时函数: void Delayms(unsigned int t) { unsigned int i,j; for(i=t;i>0;i--) for(j=0;j<120;j++); } //随意位数码管显示一个字符函数: void DTDisplayChar(unsigned char segmd,unsigned char bitd )//数码管段码和数码管位码 { unsigned char i; unsigned int dat; oe=1;//输出为高阻 dat=bitd; dat=dat<<8|segmd; //位码段码合并为一个int型数据 for(i=0;i<16;i++)//16位数据从高位依次移入74HC595 { ser=(dat&0x8000)?1:0; //推断最高位,为真取1,为假取0 srclk=1; //上升沿送数据 srclk=0; dat<<=1; //左移取下一位 } rclk=1;//74HC595锁存数据 rclk=0; oe=0;//输出数据 } //DS18B20复位函数: void Reset18B20(void) { DQ=0;//拉低,開始复位操作 Delayus(100);//延时至少480us DQ=1;//拉高,释放总线控制权 while(DQ);//等待器件应答(器件拉低),约15-60us后 while(!DQ);//应答脉冲出现后,等待器件拉高,约60-240us后 } //DS18B20写命令函数: void Write18B20(unsigned char com) { unsigned char i; for(i=0;i<8;i++) { DQ=0;//開始写操作 _nop_(); _nop_();//至少延时1us DQ=com&0x01;//写数据 Delayus(2);//延时,器件在45us内採样 DQ=1;//释放总线控制权 com>>=1; //右移1位,写下一位 } } //DS18B20读数据函数: unsigned char Read18B20() { unsigned char i,rdata=0; for(i=0;i<8;i++) { DQ=0;//開始读操作 _nop_();_nop_();//至少延时1us DQ=1;//释放总线控制权,15us内要读取数据 if(DQ==1) rdata|=0x01<<i; Delayus(10);//延时要大于45us.读0时,45us后器件才拉高总线 } return rdata; } //读出温度函数: void Read18B20Temperature() { unsigned char templ,temph,temp; unsigned int tempv; Reset18B20();//复位 Write18B20(0xcc);//写命令,跳过ROM编码命令 Write18B20(0x44);//转换命令 while(!DQ);//等待转换完毕 Reset18B20();//复位 Write18B20(0xcc);//写命令,跳过ROM编码命令 Write18B20(0xbe);//读取暂存器字节命令 templ=Read18B20();//读低字节 temph=Read18B20();//读高字节 Reset18B20();//复位 tempv=temph; tempv=tempv<<8|templ;//两个字节合并为一个int型数据 temp=(unsigned char)(tempv>>4);//去掉小数部分,化成char型数据 if((temph&0x80)==0x80)//假设是负温度 { tempflag=1; //负号显示 tempr=~temp+1; //实际温度值为读取值的补码 fraction=fractioncode[(~templ+1)&0x0f]; //取小数部分补码,将16刻度转换为10刻度,精度为0.1度 } else//假设是正温度 { tempflag=0;//正温度,负号不显示 tempr=temp;// fraction=fractioncode[templ&0x0f]; //取小数部分,将16刻度转换为10刻度,精度为0.1度 } } //主函数: int main(void) { tempflag=0; while(1) { Read18B20Temperature();//读取温度值 DTDisplayChar(segmcode[fraction],0x7f);//显示小数部分 Delayms(1); DTDisplayChar(segmcode[tempr%10]|0x80,0xbf);//显示个位和小数点 Delayms(1); DTDisplayChar(segmcode[tempr%100/10],0xdf);//显示十位 Delayms(1); if(tempflag==1) DTDisplayChar(0x40,0xef);//假设是负温度就显示“-” else DTDisplayChar(segmcode[tempr/100],0xef);//显示百位 Delayms(1); DTDisplayChar(0xff,0xff);//均衡数码管亮度 } return 0; } |
DS18B20的更多相关文章
- 基于FS4412的DS18B20温度采集编程实现(1-时序分析)
作者:秦老师,华清远见嵌入式学院讲师. 一.DS18B20简介 DS18B20是常用的数字温度计.DS18B20数字温度计提供9至12位(可配置)温度读数,表明该设备的温度. 信息通过单总线接口被发送 ...
- (原创)巩固理解基于DS18B20的1-wire协议(MCU,经验)
1.Abstract 如前篇随笔所写,将以前遇到最难懂的两个部分重拾一下.前一篇写的是I2C协议(http://www.cnblogs.com/hechengfei/p/4117840.htm ...
- DS18B20函数库建立实验
1.主代码: /* 温度传感器 */#include "DS18B20.h"#include"def.h"u16 get_temp (void){ fl ...
- 基于ARM-LINUX的温度传感器驱动-DS18B20
转载:http://blog.csdn.net/ayangke/article/details/6883244 作者:冯建,华清远见嵌入式学院讲师. DS18B20数字温度传感器接线方便,封装成后可应 ...
- DS18B20 for STM32 源代码 【worldsing笔记】
DS18B20是DALLAS公司生产的一线式数字温度传感器,具有3引脚TO-92小体积封装形式:温度测量范围为-55℃-+125℃,可编程为9位-12位A/D转换精度,测温分辨率可达0.0625℃.主 ...
- 使用DS18B20设计温控系统
datasheet真的是得看看啊,比如DS18B20,不然程序都不好写,美国DALLAS半导体公司推出的数字化温度传感器DS18B20采用单总线协议,即与单片机接口仅需要一个IO口,无需任何外部原件, ...
- 基于ARM-LINUX的温度传感器驱动(DS18B20) .
DS18B20数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式,型号多种多样,有LTM8877,LTM8874等等.主要根据应用场合的不同而改变其外观.封装 ...
- DS18B20测温
项目需要实现分布式大规模测温,需要52个测温点,采样DS18B20进行设计. 30cm一个点,一共8个点串联.采用国标单芯单股纯铜硬线BV0.5做导线,测试一会儿正常,一会儿不正常.后面换线了,测试正 ...
- 自制单片机之七……扩展:DS18B20温度测量
DS18B20数字温度测量传感器,网上介绍很多,我就不罗嗦了.见图 DS18B20与前产品DS1820的不同: DS18B20继承了DS1820的全部优点,并做了如下改进 1.供电范围扩大为3.0-- ...
随机推荐
- Visual Studio2015 Community一些必备插件
Visual Studio2015 Community一些必备插件 是不是感觉虽然VS2015的代码编辑能力已经很强大了,但是总感觉差了那么一些呢?不用担心,它有很多非常强大的插件,能够让你打代码事半 ...
- (转)解析php中die(),exit(),return的区别
本篇文章是对php中die(),exit(),return的区别进行了详细的分析介绍,需要的朋友参考下 die()停止程序运行,输出内容exit是停止程序运行,不输出内容return是返回值d ...
- C#方法的使用
static void Main(string[] arr) { , ); Console.WriteLine(max); Console.ReadKey(); } /// <summary&g ...
- 你好,C++(26)如何与函数内部进行数据交换?5.1.3 函数参数的传递
5.1.3 函数参数的传递 我们知道,函数是用来完成某个功能的相对独立的一段代码.函数在完成这个功能的时候,往往需要外部数据的支持,这时就需要在调用这个函数时向它传递所需要的数据它才能完成这个功能获 ...
- Netty 5 传送大文件的方法
Netty 5 提供了 一个ChunkedWriterHandler 来传送大文件,发送端如下: 添加chunedwriterhandler: ChannelPipeline p = ...; p.a ...
- Javascript的location对象
JavaScript window.location对象 示例 注意 方法 经常使用window.location,它的结构总是记不住,简单梳理下,方便以后查询. 示例 URL:http://b.a. ...
- c#播放声音文件
C#中声音的播放主要有三种方法: 1.使用API函数. 2.使用SoundPlayer类播放. 3.使用DirectX进行播放. 一.使用API函数进行播放. windows操作系统中的winmm.d ...
- 关于PHP伪静态Rewrite设置
Rewirte主要的功能就是实现URL的跳转和隐藏真实地址,基于Perl语言的正则 表达式规范.平时帮助我们实现拟静态,拟目录,域名跳转,防止盗链等 一.Apache配置: 1.支持httpd ...
- php 被抛弃使用的函数
call_user_method()(使用 call_user_func() 替代) call_user_method_array() (使用 call_user_func_array() 替 ...
- day03
1.set集合--无序的,不重复的序列,类似dict,但是只有key,没有value 创建一个集合: s1 = {11,22,33} s2 = set((22,33,44))必须传入一个可迭代对象(t ...