历史上的今天
返回首页

历史上的今天

今天是:2025年02月04日(星期二)

2020年02月04日 | PIC单片机之温度采集

2020-02-04 来源:eefocus

大家好, 通过前一期的学习, 我们已经对ICD2 仿真烧写器和增强型PIC 实验板的使用方法及学习方式有所了解与熟悉,学会了如何用单片机来控制发光管、继电器、蜂鸣器、按键、数码管、RS232 串口、步进电机等资源,体会到了学习板的易用性与易学性,看了前几期实例,当你实验成功后一定很兴奋,很有成就感吧!现在我们就趁热打铁,再向上跨一步,一起来学习一下DS18B20 数字温度传感器的工作原理及使用方法,这样我们用单片机来读取温度数值,可以做出很多温控方面的小产品来,如温度计,温度控制继电器的应用系统。


一、 单总线温度传感器DS18B20简介


DS18B20 是DALLAS 公司生产的单总线式数字温度传感器,它具有微型化、低功耗、高性能、搞干扰能力强、易配处理器等优点,特别适用于构成多点温度测控系统,可直接将温度转化成串行数字信号(提供9 位二进制数字)给单片机处理,且在同一总线上可以挂接多个传感器芯片。它具有3 引脚TO - 92 小体积封装形式,温度测量范围为- 55℃~+ 125℃,其工作电源既可在远端引入,也可采用寄生电源方式产生,多个DS18B20 可以并联到3 根或2 根线上,CPU只需一根端口线就能与多个DS18B20 通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。以上特点使DS18B20 非常适用于远距离多点温度检测系统。


二、 DS18B20外形、引脚及时序


外形及引脚如图1 所示。


图1 管脚排列图


图1 管脚排列图


在TO-92 和SO-8 的封装中引脚有所不同,具体差别请查阅有关手册,在TO-92 封装中引脚分配如下:


1(GND):地


2(DQ):单总线数据输入输出引脚


3(VDD):可选的电源引脚(在某些应用场合可以不接)


单总线有一个主机,能够控制一个或多个从机设备。主机可以是微处理器,从机可以是单总线器件,它们之间的数据交换只通过一条信号线。


当只有一个从机设备时,系统可按单节点系统操作;当有多个从设备时,系统则按多节点系统操作。主机或从机通过一个漏极开路或三态端口连接到这个数据线,以允许设备在不发送数据时能够释放总线,而让其它设备使用总线,其内部等效电路图如图2 所示。单总线通常要求接一个约为4.7K 左右的上拉电阻,这样,当总线空闲时,其状态为高电平。主机和从机之间的通信可以通过三个步骤完成,分别是初始化单总线器件、识别单总线器件、数据交换。由于它们是主从结构,只有主机呼号从机时,从机才能应答,因此主机访问单总线器件时都必须严格遵循单总线命令序列。如果出现序列混乱,单总线器件将不响应主机。


图2 内部等效电路图


图2 内部等效电路图


所有单总线器件的读、写时序至少需要60μS,且每两个独立的时序间至少需要1μS的恢复时间。在写时序中,主机将在拉低总线15μS 之内释放总线,并向单总线器件写“1”;如果主机拉低总线后能保持至少60μS 的低电平,则向总线器件写“0”。单总线器件仅在主机发出读时序时才向主机传输数据,所以,当主机向单总线器件发出读数据命令后,必须马上产生读时序,以便单总线器件能传输数据。


三、DS18B20工作过程


DS18B20 内部的“低温度系数振荡器”频率随温度变小,振荡信号送计数器1,“高温度系数振荡器”振荡频率随温度变化,振荡信号送计数器2。两者的计数差与温度成正比。DS18B20内部的温度寄存器中的温度值以9 位数据格式表示,最高位为符号位,其余8 位以二进制补码形式表示温度值。测温结束时,这9 位数据转存到暂存存储器的前两个字节中,符号位占用第一字节,8 位温度数据占据第二字节。但因符号位扩展成高8 位,所以最后以16 位补码形式读出。


DS18B20 内部的比较器以四舍五入的量化方式确定温度寄存器的最低有效位。四舍五入最大量化误差为±1/2LSB,即0.25℃。


而一般模拟量输出的温度传感器我们还需要加上一个AD 模数转换电路才可以将数据传给单片机,但是DS18B20 的输出口可以直接和单片机I/O 口相连,我们只需要操作单片机的一个I/O 口,就可以获得温度值了,使用更加简单、方便。


现在,我们来一起看一个数字温度通过数码管显示的例子,通过一个实例,相信会给大家带来一个感性的认识。


四、温度采集应用实例


首先,我们来看一下增强型PIC 实验板上的DS18B20 温度传感器的接口电路,因为我们需要将软件和硬件相结合进行考虑如何来编程,完成该实验的硬件原理图如图3 所示,J5 为实验板上温度传感器的接口,传感器输出的数据与单片机的RD5 口相连,七段数码管D5、D7、D8组成了显示单元,字形码的数据通过RC 口送入,各数码管的显示片选信号分别不同的RA 口进行控制。


图3 硬件原理图


图3 硬件原理图


对于单片机软件的编程,我们使用MPLabIDE 软件来进行C 语言编程,它是我们的编程环境,同时我们可以通过使用ICD2 仿真烧写器和增强型PIC 实验板连接进行程序的仿真调试和烧写步骤,具体的操作步骤,我们已经在前几期做了详细的说明和介绍,在此就不再重复说明,读者朋友可以参阅以前的文章或直接登陆我们的网站查看资料。现在我们可以输入程序代码进行调试了,我们在MPLab IDE 软件中新建工程,加入源程序代码,同时进行芯片型号的选择和配置位的设置,我们实验所用的芯片型号为PIC16F877A。编写的程序代码如下:


#include // 包含头文件


#define uch unsigned char // 宏定义


# define DQ RD5 // 端口定义


# define DQ_DIR TRISD5 // 端口定义


# define DQ_HIGH() DQ_DIR =1


# define DQ_LOW() DQ = 0; DQ_DIR = 0


// 设置数据口为输出


// 变量定义


unsigned char TLV=0; // 采集到的温度高8 位


unsigned char THV=0; // 采集到的温度低8 位


unsigned char TZ=0;


// 转换后的温度值整数部分


unsigned char TX=0; // 转换后的温度值小数部分


unsigned int wd; // 转换后的温度值BCD 码形式


unsigned char shi; // 整数十位


unsigned char ge; // 整数个位


unsigned char shifen; // 十分位


unsigned char baifen; // 百分位


unsigned char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};


// 共阴LED 段码表 0-9 的显示代码


void delay(char x,char y)


// 函数功能: 数码管延时子程序


{


char z;


do{


z=y;


do{;}while(--z);


}while(--x);


}


void display() // 函数功能: 数码管显示子程序


{


TRISA=0X00; // 设置A 口全为输出


PORTC=table[shi]; // 显示整数十位


PORTA=0xEF;


delay(10,70);


PORTC=table[ge]&0x7F; // 显示整数个位,并


点亮小数点


PORTA=0xDF;


delay(10,70);


PORTC=table[shifen]; // 显示小数十分位


PORTA=0xFB;


delay(10,70);


PORTC=table[baifen]; // 显示小数百分位


}


void init() // 函数功能: 系统初始化函数


{


ADCON1=0x07; // 设置A 口为普通数字口


TRISA=0x00; // 设置A 口方向为输出


TRISD=0x00; // 设置D 口方向为输出


TRISC=0x00;


PORTD=0xff;


}


reset(void) // 复位DS18B20 函数函数


{


char presence=1;


while(presence)


{


DQ_LOW() ; // 主机拉至低电平


delay(2,70); // 延时503us


DQ_HIGH(); // 释放总线等电阻拉高总线,


并保持15~60us


delay(2,8); // 延时70us


if(DQ==1)


presence=1;


// 没有接收到应答信号,继续复位


else


presence=0; // 接收到应答信号


delay(2,60); // 延时430us


}


}


void write_byte(uch val)


// 写18b20 写字节函数函数


{


uch i;


uch temp;


for(i=8;i>0;i--)


{


temp=val&0x01; // 最低位移出


DQ_LOW();


NOP();


NOP();


NOP();


NOP();


NOP();


// 从高拉至低电平, 产生写时间隙


if(temp==1)


DQ_HIGH(); // 如果写1, 拉高电平


delay(2,7); // 延时63us


DQ_HIGH();


NOP();


NOP();


val=val》1; // 右移一位


}


}


uch read_byte(void)


// 函数功能:18b20 读字节函数函数


{


uch i;


uch value=0; // 读出温度


static bit j;


for(i=8;i>0;i--)


{


value》=1;


DQ_LOW();


NOP();


NOP();


NOP();


NOP();


NOP();


NOP(); //6us


DQ_HIGH(); // 拉至高电平


NOP();


NOP();


NOP();


NOP();


NOP(); //4us


j=DQ;


if(j) value|=0x80;


delay(2,7); //63us


}


return(value);


}


void get_temp()


// 函数功能: 启动温度转换函数函数


{


int i;


DQ_HIGH();


reset(); // 复位等待从机应答


write_byte(0xCC); // 忽略ROM 匹配


write_byte(0x44); // 发送温度转化命令


for(i=20;i>0;i--)


{


display();


// 调用多次显示函数,确保温度转换完成所需要的时间


}


reset(); // 再次复位,等待从机应答


write_byte(0xCC); // 忽略ROM 匹配


write_byte(0xBE); // 发送读温度命令


TLV=read_byte(); // 读出温度低8 位


THV=read_byte(); // 读出温度高8 位


DQ_HIGH(); // 释放总线


TZ=(TLV》4)|(THV《4)&0x3f;


// 温度整数部分


TX=TLV《4; // 温度小数部分


if(TZ>100)


TZ/100; // 不显示百位


ge=TZ%10; // 整数部分个位


shi=TZ/10; // 整数十位


wd=0;


if (TX & 0x80)


wd=wd+5000;


if (TX & 0x40)


wd=wd+2500;


if (TX & 0x20)


wd=wd+1250;


if (TX & 0x10)


wd=wd+625;


// 以上4 条指令把小数部分转换为BCD 码形式


shifen=wd/1000; // 十分位


baifen=(wd%1000)/100; // 百分位


NOP();


}


void main() // 主函数


{


init(); // 调用系统初始化函数


while(1)


{


get_temp(); // 调用温度转换函数


display(); // 调用结果显示函数


}


}


编好程序后,读者朋友可以先将DS18B20温度传感器插上实验板,如图4 所示,然后将编译好的HEX 通过ICD2 仿真烧写器烧入单片机芯片,上电运行。


图4 DS18B20 插在增强型PIC 实验板上的样子


图4 DS18B20 插在增强型PIC 实验板上的样子


前面,我们输入了这么长一段程序后,作为初学者的读者一定对有些语句会有点疑问,程序中的关键语句和函数,请看程序中的注释部份,相信很多常用的函数,在前几期的教程中大家已经见过,不再陌生,这次的实例中,最主要的是温度转换函数,读者朋友可以将DS18B20 的数据手册和源程序相结合来进行分析,由于文章篇幅有限,我们在此不再延伸,如果在学习中碰到问题也可以登陆我们的网站进行交流。

推荐阅读

史海拾趣

Ampire Co Ltd公司的发展小趣事

Ampire Co., Ltd. 是一家总部位于中国深圳的汽车电子产品制造商,专注于汽车安全、娱乐和舒适性电子产品的研发、生产和销售。以下是关于 Ampire 公司发展的五个相关故事:

  1. 成立与初创阶段:Ampire 公司成立于 2002 年,起初主要从事汽车电子产品的贸易业务。公司的创始人致力于在汽车行业提供高品质的电子产品,以提升驾驶体验和车辆安全性。在公司初期,他们主要进口和销售一些汽车音响和影音产品。

  2. 技术创新与产品升级:随着市场需求的不断变化和技术的进步,Ampire 公司开始注重技术创新和产品升级。公司加大了对汽车安全和行车辅助系统的研发投入,推出了一系列高品质的后视摄像头、倒车雷达、行车记录仪等产品,以提高车辆的安全性和驾驶便利性。

  3. 品牌建设与市场拓展:Ampire 公司通过不断提升产品质量和服务水平,逐渐树立起了良好的品牌形象,并在国内外市场上获得了良好的口碑和知名度。公司积极参加国内外汽车电子展会和行业活动,拓展了国际市场,产品出口至欧美、东南亚等多个国家和地区。

  4. 生产基地建设与产能提升:为满足不断增长的市场需求,Ampire 公司逐步扩大了生产基地,并引进了先进的生产设备和技术。公司建立了完善的生产制造体系,实现了规模化生产和产能提升,保障了产品质量和交货期。

  5. 持续发展与未来规划:Ampire 公司持续致力于技术创新和产品升级,不断推出符合市场需求的新品。未来,公司计划进一步加大在汽车安全、智能驾驶和车载娱乐等领域的研发投入,积极探索人工智能、互联网车联网等新技术的应用,为客户提供更加智能、安全和便捷的汽车电子产品。

这些故事展示了 Ampire 公司从创立初期到如今在技术创新、产品升级、品牌建设、生产基地建设以及未来规划等方面取得的重要进展。

Devar Inc公司的发展小趣事

智能家居是电子行业的一个重要发展方向,Devar Inc公司也积极拓展这一领域。公司推出了一系列智能家居产品,如智能音箱、智能照明、智能安防等。这些产品不仅具备远程控制、语音控制等便捷功能,还通过Devar的AI技术实现了智能学习和智能联动。例如,智能音箱可以根据用户的习惯和喜好,为用户推荐音乐、新闻等内容;智能照明则可以根据环境光线和用户需求自动调节亮度和色温。

C.K TOOLS公司的发展小趣事

随着全球电子产业的蓬勃发展,C.K TOOLS开始将目光投向国际市场。他们通过加强在英国、爱尔兰、法国和德国等欧洲国家的销售团队建设,以及扩大在全球其他国家的分销商网络,将产品推向了世界各地。在国际市场上,C.K TOOLS凭借其高品质的产品和专业的服务,赢得了众多电子制造企业的信赖和好评。

Akros[台湾超硕股份有限公司]公司的发展小趣事

Akros公司成立于XXXX年,由一群怀揣梦想的电子工程师创立。创业初期,公司面临着资金短缺、市场竞争激烈等诸多困难。然而,创始团队凭借着对技术的热爱和对市场的敏锐洞察,坚持自主研发,不断推出具有创新性的电子产品。通过不懈的努力,Akros逐渐在市场中站稳脚跟,为后续的发展奠定了坚实的基础。

Fagor Electrónica公司的发展小趣事

然而,随着市场竞争的加剧和技术的快速变革,Fagor Electrónica也面临着前所未有的挑战。为了应对这些挑战,公司不断加大研发投入,积极引进先进技术和管理经验。同时,Fagor Electrónica还加强了与供应商和客户的合作,以共同应对市场变化。这些努力使得公司在激烈的市场竞争中保持了领先地位。

FILTRONIC公司的发展小趣事

随着全球对可持续发展的重视日益增强,FILTRONIC也开始关注自身的环保和社会责任问题。公司积极采取措施减少生产过程中的环境污染和资源浪费,推广绿色生产和循环经济理念。同时,FILTRONIC还积极参与社会公益事业和慈善活动,为社区的发展和进步贡献自己的力量。这些努力不仅展现了FILTRONIC作为一家负责任企业的形象,也为公司的长远发展奠定了坚实的基础。

问答坊 | AI 解惑

运算放大器应用注意事项

看到一篇关于运算放大器应用的文章, 感觉写得还不错 ,分析得比较深入,在这里分享一下…

查看全部问答>

EP9305

谁用过EP9305??多串口如何通讯…

查看全部问答>

用单片机显示4个子的文字怎么弄啊!!?跪求

我急需高手解决这个问题!本人大二!想做这个东西送给女朋友!跪求啊!最好是有源代码和电路图啊!跪求哦!跪求哦!我急需高手解决这个问题!本人大二!想做这个东西送给女朋友!跪求啊!最好是有源代码和电路图啊!跪求哦!跪求哦!…

查看全部问答>

AXD 如何统计栈空间的峰值

-ADS编译的Image文件,用AXD运行。 我记得是可以统计出栈空间消耗的峰值的。 请DX们赐教,具体的统计方法是什么?…

查看全部问答>

高手快进啊,DM9000网口芯片的内部物理层回环测试没有调通是什么原因啊?网口驱动方面的

目前在做DM9000网口芯片的驱动,该芯片集成了MAC层和PHY层,它一端连接DSP,一端由网线联入PC机的终端,现已完成了芯片的初始化,和MAC层的回环接收(数据的自发自收),但是在调内部物理层的回环测设时,却怎么也调不通,我已经通过DSP给网口芯片 ...…

查看全部问答>

急求:北京 C++/C# 日文项目 (日语能读,英语能写) 月给8K (高分帮顶)

日文项目:C++/C#均可   2年以上开发经验 外语要求:能读懂式样书,读懂日文技术文章。 英文要求:日常email通信 月薪给予:6K~8K,亦可面谈 工作地点:微软 联系方式:dexin.yang@hisoft.com …

查看全部问答>

菜鸟提问:如何用应用程序修改WINCE的DEFAULT LANGUAGE

如何用应用程序修改WINCE的DEFAULT LANGUAGE呢? 我写了程序如下:         unsigned short SLANGID = MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED);         wprintf(L\"langid = %d,slangid = ...…

查看全部问答>

IAR WorkBench怎么生成可烧的.hex文件?[求助]

IAR WorkBench怎么生成可烧的.hex文件? 我用 XELTEX的3000U 烧片子,在IAR WorkBench里找不到可以烧录的选择?那位告知一下, 万分感谢! 是不是需要用其他软件来做?IAR WorkBench只能来调试 或者用jatg口来输入编译完的程序???…

查看全部问答>

C64x+网络培训(三)—— 硬件系统的特性

1.     C64x+网络培训(三)   简介:TMS320C64x+网络课程3——硬件系统的特性,其中包括:硬件中断和异常, 低功耗, 内存保护,安全性。此网络培训针对C64x+,每次一个专题,由DSP高性能部门技术支持工程师为您全程指导 ...…

查看全部问答>

LED 驱动电源的拓扑结构

replyreload += \',\' + 1335446;Timson,如果您要查看本帖隐藏内容请回复…

查看全部问答>