找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 11003|回复: 0
打印 上一主题 下一主题
收起左侧

DS18B20温度传感器实验

[复制链接]
跳转到指定楼层
楼主
ID:429575 发表于 2018-11-19 22:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

课程名称:机器人原理和应用实验类型:    设计型

实验项目名称:DS18B20温度传感器实验

实验地点: 实验日期:年 月日

成绩:


一、实验目的及要求

  • 复习掌握Keil软件的使用
  • 掌握DS18B20的工作原理
  • 能编写DS18B20的控制程序和编程方法

二、实验环境及要求

1.普中实验开发版一块, 杜邦线若干,端子线一个,温度传感器DS18B20一个

2.PC机一台

3.软件环境:OS:WIN7、Keil uVision4、普中科技自动下载软件

三、实验原理

   (一 )应用背景概述
  测量温度的关键是温度传感器。随着技术飞速发展,传感器已进入第三代数字传感器。本测温系统采用的DS18B20就是属于这种传感器。DS18B20是美国DALLAS半导体公司生产的单总线数字温度传感器,它可以实现数字化输出和测试,并且有控制功能强、传输距离远、抗干扰能力强、接口方便、微功耗等优点,因而被广泛应用在工业、农业、军事等领域的控制仪器、测控系统中。
(二) DS18B20的原理及特性介绍
  1.DS18B20的几个特点:
  a. DS18B20因为采用了单总线技术,可通过串行口线,也可通过其他I/O口线与微机直接接 传感器直接输出被测温度值(二进制数)。
  b.其测量温度范围为:-55℃————+125℃,
  c.测量分辨率为:0.0625℃,是其他传感器无法相比的。

图1 DS18B20外部形状及管脚
  d.内含64位只读存储器ROM,(内存出厂序列号,是对应每一个器件的唯一号),还又RAM 存有温度当前转换值及符号。
  e.用户可分别设定每个器件的温度上、下限。
  f.内含寄生电源。
  2. DS18b20的结构:
  a. 64位光刻ROM ,可以看作是DS18B20的地址序列号,如表一所示。

表1


 b.高速暂存器RAM共占0、1两个单元:

表2
  两个8位的RAM中,存放二进制的数,高五位是符号位,如果温度大于0℃,这五位数为0,将测到的数值乘以0.0625,即得到实际的温度值;如果温度小于0℃,高五位为1,测到的数值需要取反加1,再乘以0.0625 ,才得到实际的温度值。
  c. 九个寄存器的名称及作用:

表3
(三) DS18B20 的控制方法
        DS18B20的操作是通过执行操作命令实现的, 其控制程序是按照DS18B20的通讯协议编制的。单片机与DS18B20交换数据,CPU按照单总线协议在总线上产生复位时序和读写时序来实现的。其中包含复位脉冲、响应脉冲、读、写时序,只有响应脉冲是DS18B20发出的,其他都有单片机发出。时序的具体要求如下:
  (1) 复位脉冲:单片机发出一个宽为480—960μs的负脉冲之后再发出5—60μs的正脉冲,此时DS18B20会发出一个60—240μs的响应脉冲,复位时序结束。也就是呼应阶段。
  (2) 写时间片:写一位二进制的信息,周期至少为61μS,其中含1μS的恢复时间,单片机启动写程序后15—60μs期间DS18B20自动采样数据线,低电平为“0”,高电平为“1”。单片机写“0”时,要持续低电平60—120μs,写“1”时,要在启动后15μs之内使数据线变为高电平。
  (3) 读时间片:读一位二进制数据,周期及恢复时间要求与写时间片相同。单片机启动读时序之后,至少保持1μs低电平,然后在接近启动后15μs之前读入数据。低电平为“0”,高电平为“1”。

图2 初始化时序

图3 读/写时序
  (4) ROM 操作命令的执行:
  在 ROM 操作命令中,有两条命令专门用于获取传感器序列号:读ROM命令(33H)和搜索ROM命令(FOH)。读ROM命令只在总线上只有一个传感器的情况下使用。具体 的 搜 索过程为:(1)单片机发出复位脉冲进行初始化,连接在P3。5口上的传感器则发出存在脉冲做出响应。(2)单片机在单总线上发出搜索ROM命令。(3)单片机从单总线上读一位数据。ds18b20的工作时序分别有初始化时序、写时序、读时序、转换时序等,根据传感器的这些时序要求编写出子程序、主程序

表4

实验内容及步骤

1.DS18B20模块电路原理图

2.连线:

JP10端口连接JP12端口也就是STC89C51的P0端口连接74HC245, STC89C51的P2.2,P2.3,P2.4端口连接U12的A,B,C端口。温度传感器DS18B20出厂时就安装好了。

3.简述DS18B20温度转换规则

答:






  • 编写DS18B20的读取温度程序

该实验项目包括main.c,  temp.c,  temp.h三个文件。

以下为main.c文件内容:

#include "reg52.h"                                         
#include"temp.h"            
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;               

char num=0;
uchar DisplayData[8];
uchar code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void datapros(int temp)               //此函数功能是                          
{
                 float tp;
              if(temp< 0)                                                        //添加注释:                     
                {
                            DisplayData[0] = 0x40;               
                            temp=temp-1;
                            temp=~temp;                //添加注释:                     
                            tp=temp;
                            temp=tp*0.0625*100+0.5;                 //添加注释:                     
                }
              else                        //添加注释:                     
                {                                         
                            DisplayData[0] = 0x00;
                            tp=temp;
                            temp=tp*0.0625*100+0.5;            
              }
              DisplayData[1] = smgduan[temp / 10000];
              DisplayData[2] = smgduan[temp % 10000 / 1000];
              DisplayData[3] = smgduan[temp % 1000 / 100] | 0x80;
              DisplayData[4] = smgduan[temp % 100 / 10];
              DisplayData[5] = smgduan[temp % 10];
}

void DigDisplay()    //此函数功能是                          
{
              uchar i;
              for(i=0;i<6;i++)
              {
                            switch(i)              //位选,选择点亮的数码管,
                            {
                                          case(0):
                                                        LSA=0;LSB=0;LSC=0; break;//显示第    位
                                          case(1):
                                                        LSA=1;LSB=0;LSC=0; break;//显示第    位
                                          case(2):
                                                        LSA=0;LSB=1;LSC=0; break;//显示第    位
                                          case(3):
                                                        LSA=1;LSB=1;LSC=0; break;//显示第    位
                                          case(4):
                                                        LSA=0;LSB=0;LSC=1; break;//显示第    位
                                          case(5):
                                                        LSA=1;LSB=0;LSC=1; break;//显示第    位            
                            }
                            P0=DisplayData;
                            delayms(1);                              
                            P0=0x00;                   //添加注释:                     
              }                           
}

void main()
{            
              while(1)
              {
                            datapros(Ds18b20ReadTemp());              //添加注释:                     
                            DigDisplay();                 //添加注释:                     
              }                           
}

以下为temp.c文件内容
#include"temp.h"
void delayms(uint xms)
{
uint i,j;
                for(i=xms;i>0;i--)
  for(j=110;j>0;j--);
}


uchar Ds18b20Init()
{
              uchar i;
              DSPORT = 0;                                          //将总线拉低480us~960us
              i = 70;            
              while(i--);        //延时642us
              DSPORT = 1;//然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低
              i = 0;
              while(DSPORT)              //等待DS18B20拉低总线
              {
                            delayms(1);
                            i++;
                            if(i>5)//等待>5MS
                            {
                                          return 0;//初始化失败
                            }
            
              }
              return 1;//初始化成功
}

void Ds18b20WriteByte(uchar dat)
{
              uint i, j;

              for(j=0; j<8; j++)
              {
                            DSPORT = 0;                                   //每写入一位数据之前先把总线拉低1us
                            i++;
                            DSPORT = dat & 0x01;  //然后写入一个数据,从最低位开始
                            i=6;
                            while(i--); //延时68us,持续时间最少60us
                            DSPORT = 1;              //然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值
                            dat >>= 1;
              }
}

uchar Ds18b20ReadByte()
{
              uchar byte, bi;
              uint i, j;            
              for(j=8; j>0; j--)
              {
                            DSPORT = 0;//先将总线拉低1us
                            i++;
                            DSPORT = 1;//然后释放总线
                            i++;
                            i++;//延时6us等待数据稳定
                            bi = DSPORT;              //读取数据,从最低位开始读取
                            /*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/
                            byte = (byte >> 1) | (bi << 7);                                                                                    
                            i = 4;                            //读取完之后等待48us再接着读取下一个数
                            while(i--);
              }                                                      
              return byte;
}
void  Ds18b20ChangTemp()
{
              Ds18b20Init();
              delayms(1);
              Ds18b20WriteByte(0xcc);                            //添加注释:                                                     
              Ds18b20WriteByte(0x44);                  //添加注释:                        
}

void  Ds18b20ReadTempCom()
{            
              Ds18b20Init();
              delayms(1);
              Ds18b20WriteByte(0xcc);            
              Ds18b20WriteByte(0xbe);              //添加注释:                        
}

int Ds18b20ReadTemp()
{
              int temp = 0;
              uchar tmh, tml;
              Ds18b20ChangTemp();                                          //添加注释:                        
              Ds18b20ReadTempCom();                            //添加注释:                        
              tml = Ds18b20ReadByte();              //添加注释:                        
              tmh = Ds18b20ReadByte();   //添加注释:                        
              temp = tmh;
              temp <<= 8;
              temp |= tml;
              return temp;
}


以下为temp.h文件内容:
#ifndef __TEMP_H_
#define __TEMP_H_
#include<reg52.h>
#ifndef uchar
#define uchar unsigned char
#endif

#ifndef uint
#define uint unsigned int
#endif

//--定义使用的IO口--//
sbit DSPORT=P3^7;

//--声明全局函数--//
void delayms(uint );
uchar Ds18b20Init();
void Ds18b20WriteByte(uchar com);
uchar Ds18b20ReadByte();
void  Ds18b20ChangTemp();
void  Ds18b20ReadTempCom();
int   Ds18b20ReadTemp();

#endif
5. 要求添加上面代码的注释。
6. 调试程序、并下载到普中实验板,观察实验现象。实验效果要求演示给指导教师。
实验现象是:                                                                                                      
                                                               
7. 回答DS18B20的单总线编程需要注意事项。
答:


四、提高实验
1.   请指出温度显示的最小刻度是多少?

2.   请画出该实验的datapros()函数的软件流程图?

3.   修改程序,实现温度显示能显示出小数后3位,整数保留3位。



完整的Word格式文档51黑下载地址:

机器人原理实验报告二20181029.doc (1.18 MB, 下载次数: 26)



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表