×
单片机 > 单片机程序设计 > 详情

自制51单片机常用头文件(DS18B20)

发布时间:2020-06-20 发布时间:
|
/*--------------------------------------------------------------------------

TEMPERATURE.H

The user function is C51.
Copyright (c) 1988-2004 Keil Elektronik GmbH sum zhaojun
All rights reserved.
--------------------------------------------------------------------------*/
#ifndef __TEMPERATURE_H__
#define __TEMPERATURE_H__

#define uchar unsigned char
#define uint unsigned int

sbit DQ = P3^3;     // ds18b20与单片机连接口

uchar data Tp[8];   // 温度显示数据

/******************************ds1820程序

***************************************/
/***************************************************** 
 函 数 名:void Delay_DS(uint useconds)
 功    能:DS18B20延时1微秒
 说    明:DS18B20时序延时
 入口参数:useconds 
 返 回 值:无  
 *****************************************************/
//延时 
void Delay_DS(uint useconds)//延时1微秒
{
  while (useconds--);
}

/***************************************************** 
 函 数 名:void Ow_Reset()
 功    能:DS18B20复位
 说    明:DS18B20使用时先要复位
 入口参数:无 
 返 回 值: 
 *****************************************************/
void Ow_Reset()
{  
 DQ = 1;          // DQ复位
 Delay_DS(4);     // 延时
 DQ = 0;          // DQ拉低
 Delay_DS(100);   // 精确延时大于480us
    DQ = 1;          // 拉高
 Delay_DS(40);  

/***************************************************** 
 函 数 名:uchar Read_byte()
 功    能:从 1-wire 总线上读取一个字节
 说    明:读总线上的数据有严格的时序
 入口参数: 
 返 回 值:value  
*****************************************************/  
uchar Read_byte()

 uchar i = 0;
 uchar value = 0;

 for (i=8; i>0; i--)
 {  
  DQ = 0;    // 给脉冲信号
  value >>= 1;
  DQ = 1;    // 给脉冲信号
  if(DQ)
  value |= 0x80;
  Delay_DS(10);
 }

   return (value);
}

/***************************************************** 
 函 数 名:void Write_Byte()
 功    能:向 1-WIRE 总线上写一个字节
 说    明:写总线上的数据有严格的时序
 入口参数:val 
 返 回 值:无  
*****************************************************/
void Write_Byte(uchar val)
{
    uchar i = 0;

    for (i=8; i>0; i--)
    { 
  DQ = 0;
  DQ = val & 0x01;
  Delay_DS(10);
  DQ = 1;
  val >>= 1;
   }
}

/***************************************************** 
 函 数 名:void Read_Temperature()
 功    能:读温度并放入显示数组中
 说    明:
 入口参数:xx,yy 
 返 回 值:无  
*****************************************************/  
void Read_Temperature() 
{
 uchar a,b;
 uchar tflag;                // 温度正负标志
 uint tvalue;                // 温度值
 
 Ow_Reset();    
 Write_Byte(0xcc);           // 跳过读序列号*
 Write_Byte(0x44);           // 启动温度转换
 
 Ow_Reset();    
 Write_Byte(0xcc);           // 跳过读序列号 
 Write_Byte(0xbe);           // 读取温度 
 
 a = Read_byte();            // 读出温度低8位
 b =  Read_byte();            // 读出温度高8位
 tvalue = b;
 tvalue <<= 8;
 tvalue = tvalue | a;

   if( tvalue < 0x0fff)
   {
       tflag = 0;
 }
    else
    {
      tvalue = ~tvalue + 1;
   tflag = 1;
    }

 tvalue = tvalue*(0.625);      // 温度值扩大10倍,精确到1位小数

 Tp[2] = tvalue%1000/100+0x30; // 十位数
 Tp[3] = tvalue%100/10+0x30;   // 个位数
 Tp[4] = 0x2e;                 // 显示小数点
 Tp[5] = tvalue%10+0x30;       // 显示温度小数位
 Tp[6] = 0x01;                 // 显示自定义字符
 Tp[7]= 0x43;                  // 显示字符"C"

 if (tflag == 0)
 {
  Tp[1] = 0x20;             // 正温度不显示符号
 }
 else
 {
  Tp[1] = 0x2d;             // 负温度显示负号:-
 }
 if (Tp[2] == 0x30)
 {
  Tp[2] = 0x20;             // 如果十位为0,不显示
 }
}

/***************************************************** 
 函 数 名:void Adjust_Res()
 功    能:温度分辨率调整
 说    明:此函数可以对温度的显示进行精度调节.
 入口参数:res 
 返 回 值:无  
 *****************************************************/
void Adjust_Res(char res)   // res 分别等于 0x1f, 0x3f, 0x5f 温度读数分辨率分别对应
                            //               0.5, 0.25, 0.125   
{
 Ow_Reset();             // 复位
 Write_Byte(0xcc);       // 跳过Rom
 Write_Byte(0x4e);       // 写暂存器

 Write_Byte(0x02);       // 写TH 
 Write_Byte(0x01);       // 写TL
 Write_Byte(res);        // 温度转换分辨率设置

 Ow_Reset();             // 复位
 Write_Byte(0xcc);       // 跳过Rom 
 Write_Byte(0x48);       // 把暂存器内容写到EPRam中
}

#endif

关键字:51单片机  头文件  DS18B20

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈msp430f5529入门(2)----时钟配置.例程分析