51单片机DS18B20测量温度实验

发布者:WhisperingRain最新更新时间:2011-05-22 关键字:51单片机  DS18B20  测量温度 手机看文章 扫描二维码
随时随地手机看文章

实验任务

 用一片DS18B20构成测温系统,测量的温度精度达到0.1度,测量的温度的范围在-20度到+50度之间,用4位数码管显示出来。
    
DPY-1实验板连接
用排线把JP-CODE连到JP8是,注意:a接P0.0;b接P0.1;c接P0.3…… 把JP-CS连到JP14上,注意:4H接P2.4;3H接P2.5;2H接P2.6;1H接P2.7;
 
连接好DS18B20注意极性不要弄反,否则可能烧坏。DS18B20的外型与常用的三极管一模一样,上图是它的管脚分布。用导线将JK—DS的DA端连到P3.1上。

硬件电路图

实验原理
   DS18B20数字温度计是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单,体积小的特点。因此用它来组成一个测温系统,具有线路简单,在一根通信线,可以挂很多这样的数字温度计。DS18B20产品的特点
(1)、只要求一个I/O口即可实现通信。
(2)、在DS18B20中的每个器件上都有独一无二的序列号。
(3)、实际应用中不需要外部任何元器件即可实现测温。
(4)、测量温度范围在-55。C到+125。C之间。
(5)、数字温度计的分辨率用户可以从9位到12位选择。
(6)、内部有温度上、下限告警设置。
   DS18B20详细引脚功能描述1 GND地信号;2 DQ数据输入/输出引脚。开漏单总线接口引脚。当被用着在寄生电源下,也可以向器件提供电源;3 VDD可选择的VDD引脚。当工作于寄生电源时,此引脚必须接地。
DS18B20的使用方法。由于DS18B20采用的是1-Wire总线协议方式,即在一根数据线实现数据的双向传输,而对AT89S51单片机来说,我们必须采用软件的方法来模拟单总线的协议时序来完成对DS18B20芯片的访问。由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求。DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。

C语言源程序
 
#include
code unsigned char seg7code[11]={0x3f,0x06,0x5b,0x4f,0x66,
                                 0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //显示段码
void Delay(unsigned int tc)     //显示延时程序
{while( tc != 0 ) 
 {unsigned int i; 
  for(i=0; i<100; i++);
  tc--;}
}
sbit TMDAT =P3^1; //DS18B20的数据输入/输出脚DQ,根据情况设定
unsigned int sdata;//测量到的温度的整数部分
unsigned char xiaoshu1;//小数第一位
unsigned char xiaoshu2;//小数第二位
unsigned char xiaoshu;//两位小数
bit  fg=1;        //温度正负标志
void dmsec (unsigned int count)       //延时部分
 {   
 unsigned char i;
 while(count--)
 {for(i=0;i<115;i++);} 
 }         
void tmreset (void)       //发送复位
{                               
 unsigned char i;
 TMDAT=0;   for(i=0;i<103;i++);   
 TMDAT = 1; for(i=0;i<4;i++);       
}         
bit tmrbit (void)       //读一位//
 {                           
  unsigned int i;       
  bit dat;      
  TMDAT = 0;
  i++;       
  TMDAT = 1; 
  i++; i++;  //微量延时   //
  dat = TMDAT;     
 for(i=0;i<8;i++); 
  return (dat);      
 }         [page]


unsigned char tmrbyte (void)        //读一个字节
  {                 
  unsigned char i,j,dat;      
  dat = 0;       
  for (i=1;i<=8;i++)      
  { j = tmrbit();  dat = (j << 7) | (dat >> 1); }         
   return (dat);   
}         
void tmwbyte (unsigned char dat)     //写一个字节
{                       
  unsigned char j,i;      
  bit testb;       
  for (j=1;j<=8;j++)      
  { testb = dat & 0x01;     
   dat = dat >> 1;      
   if (testb)     
   {   TMDAT = 0;         //写0  
     i++; i++;                              
    TMDAT = 1;    
    for(i=0;i<8;i++); }
          
   else       
  {  TMDAT = 0;         //写0 
     for(i=0;i<8;i++); 
  TMDAT = 1;     
     i++; i++;}                               
}        
}  
void tmstart (void)       //发送ds1820 开始转换
  {  tmreset();  //复位     
  dmsec(1);  //延时    
  tmwbyte(0xcc);  //跳过序列号命令   
  tmwbyte(0x44);  //发转换命令 44H,
  }         
void tmrtemp (void)       //读取温度
    {                          
  unsigned char a,b; 
  tmreset ();  //复位     
  dmsec (1);  //延时     
  tmwbyte (0xcc);  //跳过序列号命令   
  tmwbyte (0xbe);  //发送读取命令     
  a = tmrbyte ();  //读取低位温度    
  b = tmrbyte ();   //读取高位温度           
  if(b>0x7f)      //最高位为1时温度是负
  {a=~a;   b=~b+1;       //补码转换,取反加一
   fg=0;      //读取温度为负时fg=0
       }
  sdata = a/16+b*16;      //整数部分
  xiaoshu1 = (a&0x0f)*10/16; //小数第一位
  xiaoshu2 = (a&0x0f)*100/16%10;//小数第二位
  xiaoshu=xiaoshu1*10+xiaoshu2; //小数两位
}  
void DS18B20PRO(void)         
{  tmstart();      
  //dmsec(5);  //如果是不断地读取的话可以不延时 //
  tmrtemp();  //读取温度,执行完毕温度将存于TMP中 //
}           
void Led()

   if(fg==1)   //温度为正时显示的数据
   {   P2=P2&0xef; 
    P0=seg7code[sdata/10];           //输出十位数
    Delay(8); P2=P2|0xf0; P2=P2&0xdf;  
    P0=seg7code[sdata%10]|0x80; //输出个位和小数点
    Delay(8); P2=P2|0xf0; P2=P2&0xbf; 
    P0=seg7code[xiaoshu1];   //输出小数点后第一位
    Delay(8); P2=P2|0xf0; P2=P2&0x7f; 
    P0=seg7code[xiaoshu2];       //输出小数点后第二位
    Delay(4); P2=P2|0xf0;
   }
   if(fg==0)  //温度为负时显示的数据
   {   P2=P2&0xef; 
    P0=seg7code[11];           //负号
    Delay(8); P2=P2|0xf0; P2=P2&0xdf;  
    P0=seg7code[sdata/10]|0x80; //输出十位数
    Delay(8); P2=P2|0xf0; P2=P2&0xbf; 
    P0=seg7code[sdata%10];   //输出个位和小数点
    Delay(8); P2=P2|0xf0; P2=P2&0x7f; 
    P0=seg7code[xiaoshu1];       //输出小数点后第一位
    Delay(4); P2=P2|0xf0;
   }
}
main()
{fg=1;
 while(1)
 {
  DS18B20PRO();
  Led();
 }
}

 

 

关键字:51单片机  DS18B20  测量温度 引用地址:51单片机DS18B20测量温度实验

上一篇:彩色STN模块VP2188与51单片机接口
下一篇:51单片机串口检测程序

推荐阅读最新更新时间:2024-03-16 12:36

AT89S51单片机开发板的设计
1 引言 单片机系统传统的编程方式是将单片机先从电路板上取下,放入专用的编程器进行编程,再放人电路板进行调试。其缺点是频繁的拔插器件容易损坏器件的引脚;如果频繁的调试程序,必须重复拔插,大大降低了开发效率。ISP技术是未来发展的方向,其优势是无需编程器就可进行单片机的实验和开发,单片机器件可直接焊接到电路板上,调试结束即为成品,免去调试时由于频繁插入取出对器件和电路板造成的损坏和带来的不便。 ISP可降低研发成本;缩短从设计、制造到现场调试的时间,简化生产流程,大大提高工作效率;在试验新品或学生试验等常需用不同的程序调试器件的场合中,在线编程技术尤为重要。 设计AT89S51单片机开发板,采用ISP下载线实现在Keil C
[单片机]
AT89S<font color='red'>51单片机</font>开发板的设计
51单片机精确延迟程序
51单片机精确延时程序(晶振12MHz,一个机器周期1us.) 几个精确延时程序:在精确延时的计算当中,最容易让人忽略的是计算循环外的那部分延时,在对时间要求不高的场合,这部分对程序不会造成影响. 一. 500ms延时子程序:(晶振12MHz,一个机器周期1us.)   void delay500ms(void)   {   unsigned char i,j,k;   for(i=15;i 0;i--)   for(j=202;j 0;j--)   for(k=81;k 0;k--);   }   计算分析:   程序共有三层循环   一层循环n:R5*2 = 81*2 = 162us DJNZ 2us   二层循环m:R6
[单片机]
温度传感器: TDK 推出用于测量激光二极管温度、可选配金丝键合的新型NTC 热敏电阻
可选配金丝键合 电阻和B值容差均在±1%范围内,确保温度传感高度准确 用于测量光通信收发器和LiDAR中的激光二极管的温度 温度传感器: TDK 推出用于测量激光二极管温度、可选配金丝键合的新型NTC 热敏电阻 TDK株式会社推出全新的NTCWS系列NTC热敏电阻,可选配金丝键合。此产品系列将于2023年9月开始投入量产。这些可键合的NTC热敏电阻可通过金丝键合安装于封装内部,从而对光通信用激光二极管(LD)进行高度准确的温度检测。 在光通信收发器中,LD设备的使用正在不断增加,5G 以及用于测量车辆间距的LiDAR便是典型代表。由于LD的波长会随着温度变化而变,因此对LD的温度进行控制是提高其性能的关键所
[传感器]
<font color='red'>温度</font>传感器: TDK 推出用于<font color='red'>测量</font>激光二极管<font color='red'>温度</font>、可选配金丝键合的新型NTC 热敏电阻
C51单片机中常用的头文件
通常有reg51.h,reg52.h,math.h, ctype.h, stdio.h, stdlib.h, absacc.h, intrins.h 。 但常用的却只有reg51.h或reg52.h,math.h 。 reg51.h和reg52.h是定义51单片机或52单片机特殊功能寄存器和位寄存器的,着两个头文件中大部分内容是一样的,52单片机比51单片机多一个定时器T2,因此,reg52.h中也就比reg51.h中多几行定义T2寄存器的内容。 math.h是定义常用数学运算的,比如求绝对值、求方根、求正弦和余弦等,该头文件中包含有各种数学运算函数,当我们需要使用时可以直接调用它的内部函数。 学习单片机应该掌握的主要内
[单片机]
51单片机封装库HML_FwLib_STC89/STC11
HML_FwLib_STC89/11 项目地址 https://github.com/MCU-ZHISHAN-IoT/HML_FwLib_STC89 https://github.com/MCU-ZHISHAN-IoT/HML_FwLib_STC11 这些项目主要是封装了8051和STC89, STC11的寄存器配置信息, 提供接口方法给上层调用. 因为传统的代码都是直接用八进制值给寄存器赋值进行操作, 不便于记忆, 用这个封装库就可以使用类似于STM的高级语言方式进行开发, 解决了开发过程极度依赖手册的问题. 如果使用STC12C5A60S2系列, 可以用STC11封装库. 目录结构 HML_FwLib_STC89 ├─
[单片机]
基于51单片机实现LED模拟交通灯
具体功能实现: 南北红灯亮,东西绿灯亮;南北绿灯亮,东西红灯亮;在红绿灯转换过程中,黄灯闪烁5次。 使用器件: 若干电阻、4只LED红灯、4只LED绿灯、4只LED黄灯、AT89C51芯片 Proteus仿真原理图: 仿真测试: 知识介绍: Proteus布线 为了让整个原理图看上去简洁明了,我们对元器件的导线进行标号,而不是直接和芯片相连。 LED低电平有效 LED的特性是单向导通,只有当阳极的电压大于阴极的电压才能导通。在仿真图中LED的阳极接了电源,因此阴极我们置0方可导通。 主要代码(C语言)KEIL5实现: #include REGX52.H sbit RED_A = P0^0; //east and
[单片机]
C51单片机学习笔记(三)——按键对灯、蜂鸣器等器件的控制
1.独立按键的原理 一般的独立按键有四个脚,无论按键是否被按下,1和2总是相通的,3和4也是相通的。当按键按下时,1、2脚与3、4脚接通,按住不放则保持接通状态 按键通断过程的抖动:当按键按下时(释放时)输出的理想波形是标准的矩形波,但是,由于机械触点的弹性作用,闭合时电路不会马上稳定的接通,这中间会出现一连串的抖动,如图所示,抖动时间一般为5~10ms 按键的消抖:按键的抖动会造成一次按下被误认为多次按下,所以要进行消抖处理,一般分为硬件消抖和软件消抖,这里讨论软件消抖,方法是当单片机检测到按键闭合时,采用延时程序产生5~10ms的延时,等抖动消失后,再判断是否处于闭合状态,同理释放的时候,也要给延时。 按键给单片机
[单片机]
C<font color='red'>51单片机</font>学习笔记(三)——按键对灯、蜂鸣器等器件的控制
51单片机控制RTL8019AS实现以太网通讯
摘要:介绍以太网的帧协议和以太网控制芯片RTL8019AS的结构特性;介绍51单片机控制RTL8019AS实现以太网通讯的硬件设计方案;采用C51语言实现ARP协议(地址解析协议),并进行了系统的调试与验证。 关键词:RTL8019AS Ethernet 51单片机 TCP/IP协议 互联网络硬件、软件的迅猛发展,使得网络用户呈指数增长,在使用计算机进行网络互联的同时,各种家电设备、仪器仪表以及工业生产中的数据采集与控制设备在逐步地走向网络化,以便共享网络中庞大的信息资源。在电子设备日趋网络化的背景下,利用廉价的51单片机来控制RTL8019AS实现以太网通讯具有十分重要的意义。 1 以太网(Ethernet)协议 一个标
[网络通信]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved