分享

PIC单片机之温度采集

 共同成长888 2020-06-24

大家好, 通过前一期的学习, 我们已经对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 所

[1] [2]
关键字:PIC单片机  温度采集 编辑:什么鱼 引用地址:http://news./mcu/ic487157.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:PIC单片机之步进电机
下一篇:PIC单片机之数码管

  • 关注eeworld公众号
    快捷获取更多信息

  • 关注eeworld服务号
    享受更多官方福利

0

推荐阅读

PIC单片机之I2C通信(主模式)
(ACK)    当接收方接收完一个字节的数据就要告诉对方我收到了。接收方如果接收到数据则控制数据线输出低电平。否则为高电平。    5,停止     没有下一个字节要发送,最后时钟线变为高电平后,数据线从低电平变为高电平。代表数据发送停止。    实例讲解: 使用单片机使用 RSM2257 电子音量控制芯片来控制音量。一个按键按下,声音变大,一个按键按下,声音变小。在加上一个按键,控制一个LED亮灭的程序。而且音量掉电保存。    介绍RSM2257.    子地址 
发表于 2020-04-25
PIC单片机之I2C通信(主模式)
PIC单片机学习遇到的一些问题
1、中断优先级中断优先级的设置虽然能够比较合理的管理资源,但是如果在中断里写太多内容会导致另一个中断可能永远进不去的现象。比如在定时器中断里定20ms,但是中断里面处理的代码量太多超过20ms,则会出现另一个中断优先级低的刚等待定时器执行完要开始执行时,定时时间到了又进定时中断。如此循环低优先级的中断永远也进不去。(给低优先级中断IE位重新复位可以在短时间无视优先级执行,不过过一段时间也会出现上述情况。作者亲身试过的bug)2、AD采样出现波动大的问题有时程序出现AD采样的数值波动大往往是因为可能这时候的供电情况不同,可能你跟原先状态比关闭了什么开启了什么。如开关GPS、开关功放导致的。3、XC编译器与系统不兼容问题由于系统与编译器
发表于 2020-03-23
PIC单片机的学习——时钟的配置
一、概念Fcy是CPU时钟,Fosc晶振频率。Fcy = Fosc/2,也就是CPU时钟是晶振频率的1/2。二、寄存器的配置例子如下:    //系统时钟初始化 产生55.296M //11.0592M晶振    // Fosc= Fin*M/(N1*N2), Fcy=Fosc/2    // Fosc= 11.0592M*60/(2*3)=110.592Mhz for 11.0592M input clock    // Fcy= Fosc/2 = 55.296MHZ     PLLFBD = 58;  &nbs
发表于 2020-03-23
PIC单片机软件平台----MPLAB IDE和MPLAB X IDE
这里主要是针对PIC18单片机开发平台,当然对于16位或32位单片机的开发平台是一样的,只是编译器不一样。PIC18单片机有两个开发平台,一个是MPLAB IDE,对应的编译器为MPLAB C Compiler for PIC18 MCUs.exe;一个是MPLAB X IDE,对应的编译器为xc8-v2.00-full-install-windows-installer.exe。下载链接如下:https://download.csdn.net/download/euxnijuoh/10889265
发表于 2020-03-17
PIC单片机输出比较(PWM)模块介绍
在Android红外遥控器项目中使用了输出比较OC1(PWM)模块来产生38KHz PWM脉冲,脉冲占空比与红外信号发射距离以及产品功耗有关。其中占空比越大,发射距离越远,功耗越大。红外载波的占空比一般在1/3左右。将输出比较模块配置为PWM 操作,需要以下步骤:1.将OCx输出配置为可用的外设引脚选择引脚之一。2.计算所需的占空比并将计算结果装入 OCxR 寄存器。3.计算所需的周期并将计算结果装入 OCxRS 寄存器。4.选择当前的 OCx 作为同步源,方法是把 0x1F写入SYNCSEL<4:0>(OCxCON2<4:0>),把 0 写入OCTRIG (OCxCON2<7>)。5.通过写 O
发表于 2020-03-17
PIC单片机驱动LCD模块的设计
(Thevenin)等效电路进行模拟。对于VLCD3和VLCD0,戴维南电阻为0;如它不为0的两种情况,即对于VLCD2和VLCD1。电路可以简化为如下图所示的电路。RSW是段多路开关的电阻;RCOM是公共多路开关的电阻。对于戴维南电阻不为0的情况,戴维南电压等于2/3 VDD或1/3 VDD。戴维南电阻等于梯形电阻网络上部和下部的串联电阻,其估算电阻的等效电路见右图所示。例如.可以用RC电路来模拟单个像素的驱动器,在该电路中电压在0V~VLCD2之间切换。对于LCD和PIC单片机,可以估算段和公共开关电路的电阻分别大约为4.7kΩ和0.4kΩ。可以看到,经过像素的电压从0变为VTH的时间将取决于像素的电容和总电阻,而梯形电阻网络戴维南电阻
发表于 2020-03-11
PIC单片机驱动LCD模块的设计   

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多