本帖最后由 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
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>