您的位置 首页 报告

克己51单片机常用头文件(DS18B20)

/*————————————————————————–TEMPERATURE.HTheuserfunc

/*————————————————————————–

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

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ceping/baogao/275926.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部