用proteus仿真51单片机读18b20。在0度时读出的数据是0x80 0x80

2020-01-23 14:34发布

本帖最后由 qqwwzzxx 于 2014-6-29 17:03 编辑

用proteus仿真51单片机读18b20。在0度时读出的数据是0x80 0x80。

上传不了附件,不知道咋回事。

//====================18B20.C=========================
#include"18b20.h"
/******************************************************************/
/*                    延时函数                                    */
/******************************************************************/
void delay(unsigned int i)//延时函数 1:5 5:60 10:110 25:250 50:480 60:550  300:2.5ms
{
while(i--);
}
/******************************************************************/
/*                    初始化                                      */
/******************************************************************/
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1;    //DQ复位
delay(20);  //稍做延时
DQ = 0;    //单片机将DQ拉低
delay(60); //精确延时 大于 480us
DQ = 1;    //拉高总线
delay(5);
x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay(25);
}
/******************************************************************/
/*                    读一个字节                                  */
/******************************************************************/
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
  DQ = 0; // 给脉冲信号
  _nop_();//XXXXXXXXXXXXXXXXXXXXXXXX
dat>>=1;
  DQ = 1; // 给脉冲信号
   _nop_();//XXXXXXXXXXXXXXXXXXXXXXXX
  if(DQ)
   dat|=0x80;
  delay(5);   //约60us
}
return(dat);
}
/******************************************************************/
/*                 写一个字节                                     */
/******************************************************************/
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
  DQ = 0;
  _nop_();//XXXXXXXXXXXXXXXXXXXXXXXX
   _nop_();//XXXXXXXXXXXXXXXXXXXXXXXX
DQ = dat&0x01;
  delay(5);//65us
  DQ = 1;
  dat>>=1;
}
delay(3);
}
//=================18B20.H===============
#ifndef __18B82_H__
#define __18B82_H__

#include"reg52.h"
#include <intrins.h>
/******************************************************************/
/*                    定义端口                                    */
/******************************************************************/
sbit DQ=P2^7;//ds18b20 端口

void delay(unsigned int i);     
void Init_DS18B20(void);                                        //初始化
unsigned char ReadOneChar(void);                        //读
void WriteOneChar(unsigned char dat);                //写

#endif
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
simahacker
1楼-- · 2020-01-23 15:31
你直接在实物上测试看对不对,仿真不可信的!如果实物不行你就看看你的时序。
qqwwzzxx
2楼-- · 2020-01-23 19:34
 精彩回答 2  元偷偷看……

一周热门 更多>