DS18B20温度采集与控制

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

(3)发送 DS18B20 功能指令。
指令名称 温度转换
指令代码 44H
指令功能 启动 DS18B20 温度转换,最长 750ms,结果存于内部 9 字节 RAM
-1-
写暂存器
4EH
读暂存器 复制暂存器 重调 EEPROM 读供电模式
BEH 48H B8H B4H
发此命令后,可向内 RAM 发 3 个字节,1st 是 TH,2st 是 TL, 3st 配置寄存器 发此命令后,依次读出内 RAM 中 0~8 字节的内容,低位在前。 复制 2、3、4 字节的内容到 EEPROM 中 EEPROM 中的内容恢复到 2、3、4 字节 当 DS18B20 寄生供电时为“0”,外部电源供电为“1”
要想完成一次测温任务,首先需要主 MCU 指挥 DS18B20 进行一次温度转换,待转换完 成后,再让主 MCU 读取 DS18B20 内部 RAM 中的温度数据。具体操作如下:
(1)主 MCU 控制“1-Wire”总线进行复位初始化。参见“对 DS18B20 进行复位初始 化”操作。
(2)主 MCU 发送跳过 ROM 的操作(CCH)命令。 (3)主 MCU 发送转换温度的操作(44H)命令,后面释放总线至少 750 毫秒,让 DS18B20 完成转换的操作。 (4)主 MCU 发出复位操作并接收 DS18B20 的应答(存在)脉冲。 (5)主 MCU 发送跳过 ROM 的操作(CCH)命令。 (6)主 MCU 发送读取 RAM 的命令(BEH),随后主机依次读取 DS18B20 发出的从第 0 一第 8,共九个字节的数据。如果只想读取温度数据,那在读完第 0 和第 1 个数据后即丢 掉(不读)后续字节的内容。 上述操作中,涉及到主 MCU 对 DS18B20 的写(发送)操作和读(读取)操作,下文将 介绍如何完成这两种操作方法。 写操作:写操作周期最少为 60 微秒,最长不超过 120 微秒。写周期开始时,主机先把总 线拉低 1 微秒表示写周期开始。之后主机若想写 0,则继续拉低电平最少 60 微秒直至写周期 结束,然后释放总线为高电平。主机若想写 1,则拉低总线电平 1 微秒后就释放总线为高电 平,一直到写周期结束。 作为从机的 DS18B20 在检测到总线被拉低后等待 15 微秒然后从 15us 到 60us 开始对总 线采样,在采样期内总线为高电平则为 1,若采样期内总线为低电平则为 0。如下图所示。
//two byte compose a int variable
temp=temp|a;
//tt=temp*0.0625; //算出来的是测到的温度,数值可到小数点后两位
//temp=tt*10+0.5; //为了显示温度后的小数点后一位并作出四舍五入,因为取值运算不
能取小数点后的数
tt=temp*(0.0625*10)+0.5; temp=tt; return temp; }
void tmpwritebyte(uchar dat) //写 1 字节
{
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //write 1
{
DS=0; _nop_();
//延时 1us
_nop_(); //延时 1us
-4-
dat=DS; delay10us(1); //延时 10us return (dat); }
uchar tmpread(void) //读 1 字节 8 位 {
uchar i,j,dat; dat=0; for(i=1;i<=8;i++) {
j=tmpreadbit(); dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在 DAT 里 } return(dat); }
1.DS18B20 的测温时序
DS18B20 的温度采集
DS18B20 测温传感器通过“1-Wire”总线通信,其功能是分时完成的,他有严格的时序 概念,如果出现时序混乱,“1-Wire”器件将不响应主机,因此读写时序很重要。MCU 对 DS18B20 的各种操作必须按协议进行。根据 DS18B20 的协议规定,微控制器控制 DS18B20 完成温度的转换必须经过以下 3 个步骤:
-8-
-9-
wei1=1;
//显示百位
wei2=0;
wei3=0;
wei4=0;
wei5=0;
wei6=0;
P0=table[bai];
delay(2);
wei1=0;
//显示十位
wei2=1;
wei3=0;
wei4=0;
wei5=0;
wei6=0;
P0=table1[shi1];
delay(2);
wei1=0;
//百位 //十位 //个位
//define interface // variable of temperature
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //
void display(uint temp)
//显示程序
{
uchar bai,shi1,shi0,ge; bai=temp/100;//温度数值上为十位
-6-
shi0=temp%100;//温度数值上为几点几 shi1=shi0/10;//温度上为个位,并且显示时需要加小数点 ge=shi0%10;//温度上为小数位,并已经四舍五入
unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
0x87,0xff,0xef};
//
void delay10us(uint t){
-3-
TR1=1; while(t--) {
while(!TF1); TF1=0; }
TR1=0; }
读操作:对于读数据,操作时序也分为读“0”和读“1”两个过程。读时序时,主机先 把总线拉低,在 1 微秒之后释放单总线为高电平,DS18B20 在检测到总线被拉低 1 微秒后,
-2-
便开始送出数据(即 DS18B20 把数据传输到总线上)。若是要送出 0 就把总线拉为低电平直 到读周期结束。若要送出 1 则释放总线为高电平。
uint tmp()
//读取温度
{ uint tt; uchar a,b; dsreset(); delay10us(30); tmpwritebyte(0xcc); tmpwritebyte(0xbe); a=tmpread();//低八位
b=tmpread();//高八位
temp=b;
temp<<=8;
(1)对 DS18B20 进行复位初始化。复位要求主 MCU 将数据线下拉 480us~960us,本任 务下拉时间为 600us,然后释放,DS18B20 收到信号后等待 15us~60us 左右,然后发出 60us~240us 的低脉冲,主 MCU 收到此信号后表示复位成功。如下图所示。
(2)发送 ROM 指令。ROM 指令共 5 条,如下表所示。
void delay(uint count) {
uint i; while(count) {
i=200; while(i>0) i--; count--; } }
//delay
void dsreset(void) {
//初始化
DS=0; delay10us(60); DS=1; 后将总线拉低 delay10us(6); while(DS); }
指令名称 搜索 ROM 读 ROM 匹配 ROM 跳过 ROM 警报搜索
指令代码 F0H 33H 55H CCH ECH
指令功能 用于确定挂在同一总线上从机的个数和识别 64 位 ROM 地址 读从机的 64 位 ROM 编码 发此命令后,接着发 64 位 ROM 编码,访问与编码对应的从机 忽略 64 位 ROM 编码,直接向从机温度转换指令,适合单从机 发此指令,只有温度超过设定值上/下限的从机做出响应
do {
tmpchange();//让 18b20 开始转换温度 for(a=100;a>0;a--) {
display(tmp());
}
if(tmp()>410) {Tcon=0;} if(tmp()<390) {Tcon=1;} else {Tcon=0;} }while(1); }
// 大于 41 摄氏度,停止加热 // 小于 39 摄氏度,开始加热 //其他温度
DS=1;
delay10us(6); //延时 10us
}
else
{
DS=0;
//write 0
delay10us(6); //延时 10us
DS=1; _nop_();
//延时 1us
-5-
_nop_(); }
//延时 1us
} }
void tmpchange(void) //温度转换 {
dsreset(); delay10us(30); tmpwritebyte(0xcc); // address all drivers on bus tmpwritebyte(0x44); // initiates a single temperature conversion }
主机在开始拉低总线 1 微秒后释放总线,然后在包括前面的拉低总线电平 1 微秒在内的 15 微秒时间内完成对总线进行采样检测,采样期内总线为低电平则为 0。采样期内总线为高 电平则为 1。完成一个读时序过程,至少需要 60us 才能完成。如下图所示。
3.C 语言源代码 C51 程序设计如下 #include <reg52.h> #include<intrins.h>
//将总线拉低 480us~960us //然后拉高总线,若 DS18B20 做出反应会将在 15us~60us
//15us~60us 等待
bit tmpreadbit(void)
//读 1 位Biblioteka {bit dat;
DS=0; _nop_(); //延时 1us
DS=1; _nop_(); //延时 1us _nop_(); //延时 1us
//显示个位
wei2=0;
wei3=1;
wei4=0;
wei5=0;
wei6=0;
P0=table[ge];
delay(2);
}
void initimer1(){
TMOD=0x20;
TH1=TL1=0xF6;
}
void main()
//主函数
{ uchar a;
-7-
initimer1(); Tcon=1;
#define uchar unsigned char
#define uint unsigned int
#define dula P0
//段选信号的锁存器控制
sbit wei1=P1^2; sbit wei2=P1^1; sbit wei3=P1^0; sbit wei4=P1^3; sbit wei5=P1^4; sbit wei6=P1^5; sbit DS=P2^2; sbit Tcon=P2^1; uint temp;
相关文档
最新文档