`

DS18B20-Onewire Bus-单总线 单片机读取温度

 
阅读更多

DS18B20,单片机,11.0592MHZ

</pre><pre name="code" class="cpp">#ifndef __DELAY_H__
#define __DELAY_H__
/*------------------------------------------------
 uS延时函数,含有输入参数 unsigned char t,无返回值
 unsigned char 是定义无符号字符变量,其值的范围是
 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
 长度如下 T=tx2+5 uS 
------------------------------------------------*/
void delay(unsigned int i);

#endif

 

DS18B20_H

 

#ifndef __DS18B20_H__
#define __DS18B20_H__

#include<reg52.h>     //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<intrins.h>

#define uchar unsigned char
#define uint   unsigned int;
/*------------------------------------------------
                    端口定义
------------------------------------------------*/

/*------------------------------------------------
                  函数声明
------------------------------------------------*/
unsigned int ReadTemperature(void);
void Init_DS18B20(void);
unsigned char ReadOneChar(void);
void WriteOneChar(unsigned char dat);
void delay(unsigned int i);

#endif


delay.c

 

#include "delay.h"
/*------------------------------------------------
 uS延时函数,含有输入参数 unsigned char t,无返回值
 unsigned char 是定义无符号字符变量,其值的范围是
 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时
 长度如下 T=tx2+5 uS 
------------------------------------------------*/
/******************************************************************/
/*                    延时函数                                    */
/******************************************************************/
void delay(unsigned int i)//延时函数
{
 while(i--);
}

 

/*---------<span style="font-family: Arial, Helvetica, sans-serif;">--</span><span style="font-family: Arial, Helvetica, sans-serif;">blog.csdn.net/liuzongming1988</span><span style="font-family: Arial, Helvetica, sans-serif;">-</span>-------------------------------------
  名称:18B20温度传感器
  网站:<span style="font-family: Arial, Helvetica, sans-serif;">blog.csdn.net/liuzongming1988</span>
  内容:18B20单线温度检测的应用样例程序
------------------------------------------------*/
#include"delay.h"
#include"18b20.h"


sbit DQ=P1^3;//ds18b20 端口

/******************************************************************/
/*                    初始化                                      */
/******************************************************************/
void Init_DS18B20(void)
{
 unsigned char x=0;
 DQ = 1;    //DQ复位
 delay(8);  //稍做延时
 DQ = 0;    //单片机将DQ拉低
 delay(300); //精确延时 大于 480us
 DQ = 1;    //拉高总线
 delay(10);
 x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
 delay(5);
}

/******************************************************************/
/*                    读一个字节                                  */
/******************************************************************/
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
 {
  DQ = 0; // 给脉冲信号
  dat>>=1;
  DQ = 1; // 给脉冲信号
  if(DQ)
   dat|=0x80;
  delay(5);
 }
 return(dat);
}

/******************************************************************/
/*                 写一个字节                                     */
/******************************************************************/
void WriteOneChar(unsigned char dat)
{
 unsigned char i=0;
 for (i=8; i>0; i--)
 {
  DQ = 0;
  DQ = dat&0x01;
  delay(5);
  DQ = 1;
  dat>>=1;
 }
delay(5);
}

/******************************************************************/
/*                   读取温度                                     */
/******************************************************************/
unsigned int ReadTemperature(void)
{
unsigned char a=0;
unsigned int b=0;
unsigned int t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作

WriteOneChar(0x44); // 启动温度转换
delay(200);

Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作 
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();   //低位
b=ReadOneChar();   //高位

b<<=8;
t=a+b;

return(t);
}

 

 

/*-----------<span style="font-family: Arial, Helvetica, sans-serif;">blog.csdn.net/liuzongming1988</span>---------------------
  名称:DS18b20数码管显示
  编写:blog.csdn.net/liuzongming1988
  内容:显示格式 符号 xxx.x C 
        可以显示负温度
------------------------------------------------*/
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<math.h>
#include<INTRINS.H>		

#include "18b20.h"
#include "delay.h"
#define uchar unsigned char
#define uint   unsigned int;
/******************************************************************/
/*                    定义端口                                    */
/******************************************************************/
sbit seg1=P2^0;
sbit seg2=P2^1;
sbit seg3=P2^2;

sfr dataled=0x80;//显示数据端口
/******************************************************************/
/*                    全局变量                                    */
/******************************************************************/
uint temp;
uchar flag_get,count,num,minute,second;
uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
                                               //7段数码管段码表  共阴极 显示段码值0~ 9
//{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,	0x7f,0x6f};//
uchar  str[6];

void Init_Timer0(void);

/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main (void)
{                  
unsigned char TempH,TempL,j;
Init_Timer0();
P2=0x00;  
count=0;
temp=ReadTemperature();
temp=ReadTemperature();


while(1)
{
   str[5]=0x39;         //显示C符号
   str[1]=tab[TempH/100]; //百位温度
   str[2]=tab[(TempH%100)/10]; //十位温度
   str[3]=tab[(TempH%100)%10]|0x80; //个位温度,带小数点
   str[4]=tab[TempL];
  if(flag_get==1)       //定时读取当前温度
    {
  temp=ReadTemperature();
  if(temp&0x8000)
     {
     str[0]=0x40;//负号标志
     temp=~temp;  // 取反加1
	 temp +=1;
	 }
  else
     str[0]=0;

  TempH=temp>>4;
  TempL=temp&0x0F;
  TempL=TempL*6/10;//小数近似处理
  flag_get=0;
    }
  }
}

/*------------------------------------------------
                    定时器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{

TMOD|=0x01;//定时器设置
TH0=0xef;
TL0=0xf0;

//IE=0x82;
EA=1;            //总中断打开
ET0=1;           //定时器中断打开

TR0=1;           //定时器开关打开
}
/*------------------------------------------------
                 定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1 	using 1
{
TH0=0xef;//定时器重装值
TL0=0xf0;
num++;
if (num==50)
    {num=0;
	  flag_get=1;//标志位有效
      }
count++;
if(count==1)
   {P2=0;
    dataled=str[0];}//数码管扫描
if(count==2)
   {P2=1;
    dataled=str[1];}
if(count==3)
   { P2=2;
     dataled=str[2];
     }
if(count==4)
   { P2=3;
     dataled=str[3];
     }
if(count==5)
   { P2=4;
     dataled=str[4];
     }
if(count==6)
   { P2=5;
     dataled=str[5];
     count=0;}
	
}



分享到:
评论

相关推荐

    基于DS18B20多点温度采集和无线传输

    基于DS18B20多点温度采集和无线传输系统通过采用先进的单总线技术和无线通信技术,有效地解决了传统温度测量中存在的布线复杂、信号干扰等问题。该系统不仅可以简化硬件设计,降低成本,还能够提高数据传输的准确性...

    DS18B20在单片机系统的应用

    DS18B20是由美国DALLAS公司生产的一种单总线数字温度传感器。它能够将温度信号直接转换为串行数字信号,便于微控制器进行处理。这款传感器的一个显著特点是能够在单一的数据线上挂接多个DS18B20芯片,构建出多点温度...

    单片机C语言实例温度采集DS18B20

    单片机C语言实例:温度采集DS18B20 单片机是电子设备中的微型计算机,它集成了CPU、内存、定时器/计数器、I/O接口等多种功能,广泛应用于各种自动化控制和数据采集系统。在这个实例中,我们将深入探讨如何使用C语言...

    单总线测温 51单片机

    在这个项目中,51单片机被用于读取和处理单总线(Single-Wire Bus)传感器,如DS18B20,来实现温度测量功能。 DS18B20是一款由DALLAS Semiconductor(现MAXIM Integrated)生产的数字温度传感器,它最大的特点是只...

    单片机数据通信之单总线数据传输分析.pdf

    以DS18B20为例进行单总线通信分析,DS18B20是一款常用的数字温度传感器,通过单总线协议与单片机通信。要与DS18B20通信,首先要理解其时序图。时序图是分析通信协议的关键,时序图中详细规定了数据的发送与接收的...

    基于12864与18B20的温度液晶显示2.doc

    - 然后读取DS18B20的温度值,根据读取的温度值更新液晶屏上的显示。 - 温度值的正负通过`flag1`来判断,可能会影响到液晶屏上温度前的正负号显示。 - 最后,利用`ezk`数组将温度值转换为相应的字符序列,然后在...

    基于单片机的数字式温度计的设计.doc

    软件部分,需要编写控制程序,实现单片机对DS18B20的初始化、温度读取、数据处理以及结果显示等功能。这个过程中,需要熟悉单片机的工作原理,掌握DS18B20的通信协议,以及编程语言(如C或汇编)的应用。 在实际...

    cc2530单片机多点温度采集实验设计.pdf

    首先,需要对DS18B20进行初始化,然后进入温度转换模式,最后将转换结果通过单总线协议读取出来。在IAR EW8051集成开发环境下进行软件调试和程序运行,保证程序的稳定性和准确性。 ### 硬件成本与程序稳定性 实验...

    《单片机技术》第04章在线测试.docx

    1. **温度传感器**:通过I/O口连接一个DS18B20温度传感器,用于采集环境温度。 2. **显示模块**:使用LCD显示屏显示当前温度值。 3. **报警模块**:如果温度超过预设值,则通过蜂鸣器发出报警声。 具体实现步骤如下...

Global site tag (gtag.js) - Google Analytics