首页|嵌入式系统|显示技术|模拟IC/电源|元件与制造|其他IC/制程|消费类电子|无线/通信|汽车电子|工业控制|医疗电子|测试测量
首页 > 分享下载 > 嵌入式系统 > 89C52+1602+DS18B20实现的实时温度显示系统

89C52+1602+DS18B20实现的实时温度显示系统

资料介绍

内容是经过验证的。51+18B20实时测温通过。以下为作者的笔记。仿真在PROTEUS7.2版通过了。
(不过此程序只能正确显示0~99度之内的温度。支持最高精度的显示。高于100和小于0度的温度会出错。注释很详细,如果需要很自行更改。)
调试笔记:

1、DS18B20重新启动单总线,然后使用0xbe读取转换的温度值,不能写入0x44(启动转换)命令之后延时750ms接着就读取scratchpad,这样是没有意义的,参见DS18b20 Datasheet中的访问流程图;

2、用单片机模拟单总线需要精确的微秒级延时,因此,延时程序的编制太重要不过了;本例程编制中参考了网络原创贴:51单片机 Keil C 延时程序的简单研究(by: InfiniteSpace Studio),具体如下:

/*延时计算式:2 × x+5;Step:2us;*/
extern void Delay_Xus(int8u x) //x取值1~255;
{ while(--x); }

3、Read time slot中必须对DQ写1后再读,否则,读出来的温度转换值将是不预期的垃圾;

以下为作者的One-Wire.C中的代码。单总线的所有控制驱动。

/******************************************************************************/
/**
/**模块名:-------------------One-Wire.C----------------------------------
/**-----------------DS18B20单总线模块----------------------------*/
/**功能描述:
/**
/**创建人:huangtiexiong日期:2006-11-28*/
/**修改人:日期:2006-11-28*/
/**其他说明:
/******************************************************************************/

#include"Includes.h"//文件包含

/*************************************************
模块级变量申明
*************************************************/
staticvoidOneWire_Rst(void);
staticvoidOneWire_Init(void);
staticvoidOneWire_WriteByte(int8ucmd);
staticint8uOneWire_ReadByte(void);
staticvoidOneWire_Idle(void);


/*************************************************
子函数定义
*************************************************/

/*******************************************************************************
***函数名:staticvoidOneWire_Init(void)
***功能描述:
***全局变量:
***输入:NO!
***输出:NO!
***创建人:huangtiexiong日期:2006-11-28
***修改人:日期:2006-11-28
***函数说明:单总线数据传输初始化;
/******************************************************************************/
staticvoidOneWire_Init(void)
{
DQ=1;
NOP();
DQ=0;//拉低数据线,准备ResetOneWireBus;
Delay_Xus(125);//延时510us,ResetOne-WireBus.
Delay_Xus(125);

DQ=1;//提升数据线;
Delay_Xus(15);//延时35us;

while(DQ)//等待Slave器件Ack信号;
{
NOP();
}
Delay_Xus(60);//延时125us;
DQ=1;//提升数据线,准备数据传输;
}
/*******************************************************************************
***函数名:staticvoidOneWire_Rst(void)
***功能描述:
***全局变量:No!
***输入:NO!
***输出:NO!
***创建人:huangtiexiong日期:2006-11-28
***修改人:日期:2006-11-28
***函数说明:单总线Resetpulse;
/******************************************************************************/
staticvoidOneWire_Rst(void)
{
DQ=0;//拉低数据线,准备ResetOneWireBus;
Delay_Xus(125);//延时511us,ResetOne-WireBus.
DQ=0;
Delay_Xus(125);
}
/*******************************************************************************
***函数名:staticvoidOneWire_WriteByte(int8ucmd)
***功能描述:写一个字节;
***全局变量:NO!
***输入:cmd:8bit;
***输出:NO!
***创建人:huangtiexiong日期:2006-11-28
***修改人:日期:2006-11-28
***函数说明:cmd主要有Rom操作指令和E2Ram操作指令两种;
/******************************************************************************/
staticvoidOneWire_WriteByte(int8ucmd)
{
int8ui;
for(i=0;i8;i++)
{
if(cmd0x01)//低位在前;
{
DQ=0;//结束Recoverytime;
NOP();
NOP();
NOP();
DQ=1;//发送数据;
}
else
{
DQ=0;//结束Rectime;
NOP();
NOP();
NOP();
//DQ=0;//发送数据;
}
Delay_Xus(30);//等待SlaveDevice采样;
DQ=1;//Recovery;
NOP();//RecoveryTimeStart;
cmd>>=1;
}
}
/*******************************************************************************
***函数名:staticint8uOneWire_ReadByte(void)
***功能描述:读取一个字节;
***全局变量:NO!
***输入:NO!
***输出:8bitdata;
***创建人:huangtiexiong日期:2006-11-28
***修改人:日期:2006-11-28
***函数说明:读之前必须首先写1;
/******************************************************************************/
staticint8uOneWire_ReadByte(void)
{
int8ui;
int8utmp=0;
DQ=1;//准备读;
NOP();
for(i=0;i8;i++)
{
tmp>>=1;//低位先发;
DQ=0;//Readinit;
_nop_();//2ms;
DQ=1;//必须写1,否则读出来的将是不预期的数据;
Delay_Xus(2);//延时9us;
_nop_();
if(DQ)//在12us处读取数据;
tmp|=0x80;
Delay_Xus(30);//延时55us;
DQ=1;//恢复OneWireBus;
NOP();
}
returntmp;
}
/*******************************************************************************
***函数名:staticvoidOneWire_Idle(void)
***功能描述:总线空闲模式;
***全局变量:NO!
***输入:NO!
***输出:NO!
***创建人:huangtiexiong日期:2006-11-28
***修改人:日期:2006-11-28
***函数说明:
/******************************************************************************/
staticvoidOneWire_Idle(void)
{
DQ=1;
NOP();
}
/*******************************************************************************
***函数名:externvoidDS18B20_Init(void)
***功能描述:器件DS18B20初始化;
***全局变量:NO!
***输入:NO!
***输出:NO!
***创建人:huangtiexiong日期:2006-11-28
***修改人:日期:2006-11-28
***函数说明:
/******************************************************************************/
externvoidDS18B20_Init(void)
{
OneWire_Init();
}
/*******************************************************************************
***函数名:externvoidDS18B20_RomCmd(int8uromCmd)
***功能描述:DS18B20Rom操作命令写;
***全局变量:NO!
***输入:romCmd;
***输出:NO!
***创建人:huangtiexiong日期:2006-11-28
***修改人:日期:2006-11-28
***函数说明:0x33:ReadRom;0x55:MatchRom;0xcc:Skiprom;0xf0:Searchrom;
0xec:AlarmSearch.
/******************************************************************************/
externvoidDS18B20_RomCmd(int8uromCmd)//仅写了SkipRom例程;
{
switch(romCmd)
{
case0xcc://SkipRomcommand;
OneWire_WriteByte(0xcc);
break;

default:
break;
}
}
/*******************************************************************************
***函数名:externvoidDS18B20_MemCmd(int8umemCmd)
***功能描述:DS18B20Memory操作命令;
***全局变量:NO!
***输入:NO!
***输出:NO!
***创建人:huangtiexiong日期:2006-11-28
***修改人:日期:2006-11-28
***函数说明:仅写了ConvertT(0x44)和0xBE命令;
0x44:ConvertT;0xbe:ReadScratch-pad;
/******************************************************************************/
externvoidDS18B20_MemCmd(int8umemCmd)
{
switch(memCmd)
{
case0x44://StarttoConverttemperature;
OneWire_WriteByte(0x44);
NOP();
DS18B20_Busy();
Delay_Xms(250);//延时750ms;
Delay_Xms(250);
Delay_Xms(250);
break;

case0xbe://Readscratchpad;
OneWire_WriteByte(0xbe);
break;

default:
break;
}
}
/*******************************************************************************
***函数名:externvoidDS18B20_ReadDat(int8ulen,int8u*buf)
***功能描述:读取DS18B20内部的Scratchpad内容;
***全局变量:NO!
***输入:len:将要读取的数据长度;
***输出:buf:数据缓存;
***创建人:huangtiexiong日期:2006-11-28
***修改人:日期:2006-11-28
***函数说明:
/******************************************************************************/
externvoidDS18B20_ReadDat(int8ulen,int8u*buf)
{
int8ui;
for(i=0;ilen;i++)
{
buf[i]=OneWire_ReadByte();
}
OneWire_Rst();
OneWire_Idle();
}
/*******************************************************************************
***函数名:externvoidDS18B20_Busy(void)
***功能描述:内部模数转换中,忙
***全局变量:NO!
***输入:NO!
***输出:NO!
***创建人:huangtiexiong日期:2006-11-28
***修改人:日期:2006-11-28
***函数说明:
/******************************************************************************/
externvoidDS18B20_Busy(void)
{
OneWire_Idle();
}


/*******************************************************************************
****EndOfFile
*******************************************************************************/

标签:嵌入式单片机MCU
89C52+1602+DS18B20实现的实时温度显示系统
本地下载

评论