DS18B20程序在proteus中仿真出错:(与51单片机连接的) 5
主程序:运行DS18B20_convert()时,DS18B20_CT这根DQ线波形一直是如图所示,然后单片机一直停留在DS18B20_convert()中的DS18B2...
主程序:运行DS18B20_convert()时,DS18B20_CT这根DQ线波形一直是如图所示,然后单片机一直停留在DS18B20_convert()中的DS18B20_Reset()函数中,后面的语句不执行了,怎么办????????
void DS18B20_Reset()
{
uchar i=0;
//bit flag=1;
DS18B20_CT=1;
_nop_();//可以产生一个下降沿,也可以不需要
DS18B20_CT=0;//进入复位状态
for(i=0;i<250;i++);//至少需要480us
DS18B20_CT=1;//然后释放总线,进入接受状态
for(i=0;i<30;i++);//等待,
//flag=DS18B20_CT;//读取低电平
for(i=0;i<120;i++);//最长持续240us,等待结束
//return(flag);//这里我不读取flag了
}
/**********************************************************
*写数据到DS1820
*函数名称:DS1820_WriteData()
**********************************************************/
void DS18B20_WriteData(uchar wData)
{
uchar i,j;
for(i=0;i<8;i++)//from LSB to MSB
{
DS18B20_CT=1;
_nop_();
DS18B20_CT=0;
for(i=0;i<5;i++);//拉低10us
DS18B20_CT=wData&0x01;//the first bit
for(j=30;j>0;j--);//delay 60us,no less than 60us
DS18B20_CT=1;
wData>>=1;//the next bit;
_nop_();
}
}
/**********************************************************
*从DS1820中读出数据
*函数名称:DS1820_ReadData()
**********************************************************/
uchar DS18B20_ReadData()
{
uchar i,tempData=0;
for(i=0;i<8;i++)
{
DS18B20_CT=1;
_nop_();
DS18B20_CT=0;//这里开始准备输入
_nop_();//保持1us
DS18B20_CT=1;//切换为输入
for(i=0;i<5;i++);//输出在15us内有效
//_nop_();
if(DS18B20_CT)
{
tempData|=0x80;
}
tempData>>=1;
for(i=0;i<30;i++);
}
return(tempData);
}
/*********************************************************
*温度值的转换
***********************************************************/
void DS18B20_convert()
{
uchar i=0;
DS18B20_Reset();
DS18B20_WriteData(0xcc);//跳过ROM
DS18B20_WriteData(0x1f);//配置为9位精度
//////////程序好像一直停在这块区域,执行不到读数据的操作/////////////////////////////////////////
DS18B20_Reset();
DS18B20_WriteData(0xcc);
DS18B20_WriteData(44);//启动温度转换
DS18B20_Reset();
DS18B20_WriteData(0xcc);
DS18B20_WriteData(0xbe);//读数据
temp1=DS18B20_ReadData();
temp2=DS18B20_ReadData();//低位在前
DS18B20_Reset();
} 展开
void DS18B20_Reset()
{
uchar i=0;
//bit flag=1;
DS18B20_CT=1;
_nop_();//可以产生一个下降沿,也可以不需要
DS18B20_CT=0;//进入复位状态
for(i=0;i<250;i++);//至少需要480us
DS18B20_CT=1;//然后释放总线,进入接受状态
for(i=0;i<30;i++);//等待,
//flag=DS18B20_CT;//读取低电平
for(i=0;i<120;i++);//最长持续240us,等待结束
//return(flag);//这里我不读取flag了
}
/**********************************************************
*写数据到DS1820
*函数名称:DS1820_WriteData()
**********************************************************/
void DS18B20_WriteData(uchar wData)
{
uchar i,j;
for(i=0;i<8;i++)//from LSB to MSB
{
DS18B20_CT=1;
_nop_();
DS18B20_CT=0;
for(i=0;i<5;i++);//拉低10us
DS18B20_CT=wData&0x01;//the first bit
for(j=30;j>0;j--);//delay 60us,no less than 60us
DS18B20_CT=1;
wData>>=1;//the next bit;
_nop_();
}
}
/**********************************************************
*从DS1820中读出数据
*函数名称:DS1820_ReadData()
**********************************************************/
uchar DS18B20_ReadData()
{
uchar i,tempData=0;
for(i=0;i<8;i++)
{
DS18B20_CT=1;
_nop_();
DS18B20_CT=0;//这里开始准备输入
_nop_();//保持1us
DS18B20_CT=1;//切换为输入
for(i=0;i<5;i++);//输出在15us内有效
//_nop_();
if(DS18B20_CT)
{
tempData|=0x80;
}
tempData>>=1;
for(i=0;i<30;i++);
}
return(tempData);
}
/*********************************************************
*温度值的转换
***********************************************************/
void DS18B20_convert()
{
uchar i=0;
DS18B20_Reset();
DS18B20_WriteData(0xcc);//跳过ROM
DS18B20_WriteData(0x1f);//配置为9位精度
//////////程序好像一直停在这块区域,执行不到读数据的操作/////////////////////////////////////////
DS18B20_Reset();
DS18B20_WriteData(0xcc);
DS18B20_WriteData(44);//启动温度转换
DS18B20_Reset();
DS18B20_WriteData(0xcc);
DS18B20_WriteData(0xbe);//读数据
temp1=DS18B20_ReadData();
temp2=DS18B20_ReadData();//低位在前
DS18B20_Reset();
} 展开
1个回答
展开全部
#include<reg52.h>
sbit DQ=P0^0;
void Delay(int num) //延时函数
{
while(num--) ;
}
void Init_DS18B20(void)//初始化ds18b20
{
DQ = 1; //DQ复位
Delay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
Delay(80); //精确延时 大于 480us
DQ = 1; //拉高总线
Delay(14);
Delay(20);
}
unsigned char ReadOneChar(void)//读一个字节
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
Delay(4);
}
return(dat);
}
void WriteOneChar(unsigned char dat)//写一个字节
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
Delay(5);
DQ = 1;
dat>>=1;
}
}
unsigned int ReadTemperature(void)//读取温度
{
unsigned char a=0;
unsigned char b=0;
long unsigned int tvalue;//温度值
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器
a=ReadOneChar(); //读低8位
b=ReadOneChar(); //读高8位
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
tvalue=tvalue*0.0625; //读取的数据保留到个位
return(tvalue);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
VSH艾羽
2024-10-27 广告
2024-10-27 广告
ANSYS是一款功能强大的有限元分析软件,广泛应用于航空航天、汽车、电子、能源等多个领域。它能够进行结构、流体、热、电磁等多物理场的仿真分析,支持复杂的几何建模、高效的网格划分和多种求解器,帮助工程师优化产品设计,减少开发成本,提高生产效率...
点击进入详情页
本回答由VSH艾羽提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询