89C52+1602+DS18B20实现的实时温度显示系统
时间:2019-12-23
大小:343.42KB
阅读数:124
查看他发布的资源
资料介绍
内容是经过验证的。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 *******************************************************************************/……
版权说明:本资料由用户提供并上传,仅用于学习交流;若内容存在侵权,请进行举报,或
联系我们 删除。