AT89S52带DS18B20做温度采集的时候,程序编译通过,带仿真的时候,程序停留在WHILE(DQ);不动了,检测不DQ的应答脉冲,检查了DS18B20的连接线以及5V的外供电都没什么问题!为什么接收不到应答信号呢?请教各位这种情况可能的原因和解决的方法,不胜感谢!
/*等待应答脉冲*/
void RXwait (void)
{ unsigned char i;
while (DQ);
while (~DQ); //检测到应答脉冲
i=4;
while (i>0)
i--;
}
把整个程序写出来
这怎么看呀
要不去cpubbs下载关于测温的程序看看
已经都调试通过了
#include <AT89X52.H>
unsigned char TPLSB,TPMSB; //温度的低位,高位字节
sbit DQ=P3^5; //数据通讯接口
/*程序延时T毫秒*/
void delay(unsigned char t)
{
unsigned char i;
while(t--)
{
for(i=0;i<125;i++)
{ }
}
}
/*产生复位脉冲初始化DS18B20*/
void TXreset (void)
{ unsigned char i;
DQ=0;
i=100; //拉低900US
while(i>0)
i--;
DQ=1; //产生上升沿
i=4;
while(i>0)
i--;
}
/*等待应答脉冲*/
void RXwait (void)
{ unsigned char i;
while (DQ);
while (~DQ); //检测到应答脉冲
i=4;
while (i>0)
i--;
}
/*读取数据的一位,满足温度的要求*/
bit RDbit (void)
{
unsigned char i;
bit b;
DQ=0;
i++; //保持低至少1us
DQ=1;
i++;
i++; //延时15US以上,读时钟下降沿后15US,DS18B20输出数据有效
b=DQ;
i=8;
while (i>0)
i--; //读时钟不低于60US
return (b);
}
/*读取数据的一个字节*/
unsigned char RDbyte (void)
{
unsigned char i,j,b;
b=0;
for (i=0;i<=8;i++)
{
j=RDbit();
b=(j<<7)|(b>>1);
return (b);
}
}
/*写数据的一个字节*/
void WRbyte (unsigned char b)
{
unsigned char i;
unsigned char j;
bit btmp;
for (j=1;j<=8;j++)
{
btmp=b&0x01;
b=b>>1; //取下一位由地位到高位
if (btmp)
{
DQ=0;
i++;
i++; //延时,使得15US内拉高
DQ=1;
i=8; //整个写1的时隙不低于60US
while (i>0)
i--;
}
else
{
DQ=0; //写0
i=8;
while (i>0)
i--; //保持低在60~120US之间
DQ=1;
i++;
i++;
}
}
}
/*启动温度转换程序*/
void convert (void)
{ TXreset( ); //产生复位脉冲,初始化DS18B20
RXwait(); //等待DS18B20给出应答脉冲
delay(1); //延时
WRbyte(0xcc); //SKIP ROM命令
WRbyte(0x44); //convert T命令
}
/*读取温度值程序*/
void RDtemp(void)
{
TXreset();
RXwait();
delay(1);
WRbyte(0xcc);
WRbyte(0xbc); //read scratchpad命令
TPLSB=RDbyte(); //温度的低四位为二进制小数部分,高位值的高字节的高五位为符号位
TPMSB=RDbyte();
}
/*主程序,读取温度值最终放在TPLSB,TPMSB变量中通过数码管输出,要进行十进制 有符号数的转换*/
void main(void)
{
do
{ delay(1); //延时1MS
convert(); //启动温度转换需要750MS
RDtemp(); //读取温度值
}
while(1);
}
程序如上;请指点!
我也遇到过这个问题
就是用while(dq)和while(~dq)
就是跳不过去
我知道怎么回事了
因为你的DQ是18B20给的脉冲
因为在程序中DQ一直是高所以跳不出去
但在实际用的时候
当DQ=1时候 就等待
如果18B20检测到低电平就可以跳过再有高电平就跳过下一行
这才是18B20的原理吧
/*等待应答脉冲*/
的写法本身就是
是不正确的
另外还要看一下你的硬件电路的连接方法
那等待因大脉冲应该怎么写
望赐教
脉冲那么写没错
就是等待外部送给单片机的脉冲
我用proteus仿过
是正确的
你再debug时跳不过去
是因为没有外部脉冲
所以等待脉冲一直是高
当然跳不过去
只要手动赋值
就可以跳过去
你接着跟下去 就可以知道程序对不对 到底有没有写进去东西 就可以了
去CPUBBS 论坛看看他的那份单片机开发板的例子吧
那个我调试过是正常的
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |