求助帖,51单片机控制ds18b20,弄了好久就是不出结果
时间:10-02
整理:3721RD
点击:
有大神帮我看看吗,我想把读出来的温度给P1口控制LED灯,可是输出总是全为高电平,我是在proteus中仿真的,单片机晶振是11.0592#include <reg52.h>
#include <intrins.h>
#define UCHAR unsigned char
#define UINT unsigned int
sbit dula=P3^0;
sbit wela=P3^1;
sbit dq=P2^7;
void delay1(UINT z);
void init();
UCHAR fuwei();
void xie(UCHAR temp1);
UCHAR du();
void delay()
{;;}
UINT wd();
UINT n;
int main()
{
UCHAR i,j;
UINT w;
while(1)
{
w=wd();
// P1=0;
i=w&0xff; //取低8位
j=(w>>8)&0xff;
P1=i;
delay1(20);
}
}
void delay1(UINT z)
{
while(z--);
}
void init()
{
dq=1;
}
UCHAR fuwei()
{
UCHAR flag;
dq=1;
delay();
dq=0;
for(n=300;n>0;n--);
dq=1;
for(n=30;n>0;n--);
flag=dq;
for(n=200;n>0;n--);
dq=1;
return flag;
}
void xie(UCHAR temp1)
{
int i=0;
dq=1;
delay();
for(i=0;i<8;i++)
{
CY=temp1>>1;
dq=0;
for(n=7;n>0;n--);
dq=CY;
for(n=40;n>0;n--);
dq=1;
_nop_();
}
dq=1;
delay();
}
UCHAR du()
{
UCHAR temp,i;
bit ret_bit;
dq=1;
delay();
for(i=0;i<8;i++)
{
dq=0;
_nop_();
_nop_();
dq=1;
for(n=7;n>0;n--);
ret_bit=dq;
for(n=20;n>0;n--);
dq=1;
if(ret_bit)
{
temp=(temp>>1)|0x80;
}
else
temp=temp>>1;
}
dq=1;
return temp;
}
UINT wd()
{
UCHAR i,j;
UINT k;
fuwei();
xie(0xcc);
xie(0x44);
delay1(10);
fuwei();
xie(0xcc);
xie(0xbe);
i=du();
j=du();
k=j;
k=k<<8;
k=k+i;
return k;
}
#include <intrins.h>
#define UCHAR unsigned char
#define UINT unsigned int
sbit dula=P3^0;
sbit wela=P3^1;
sbit dq=P2^7;
void delay1(UINT z);
void init();
UCHAR fuwei();
void xie(UCHAR temp1);
UCHAR du();
void delay()
{;;}
UINT wd();
UINT n;
int main()
{
UCHAR i,j;
UINT w;
while(1)
{
w=wd();
// P1=0;
i=w&0xff; //取低8位
j=(w>>8)&0xff;
P1=i;
delay1(20);
}
}
void delay1(UINT z)
{
while(z--);
}
void init()
{
dq=1;
}
UCHAR fuwei()
{
UCHAR flag;
dq=1;
delay();
dq=0;
for(n=300;n>0;n--);
dq=1;
for(n=30;n>0;n--);
flag=dq;
for(n=200;n>0;n--);
dq=1;
return flag;
}
void xie(UCHAR temp1)
{
int i=0;
dq=1;
delay();
for(i=0;i<8;i++)
{
CY=temp1>>1;
dq=0;
for(n=7;n>0;n--);
dq=CY;
for(n=40;n>0;n--);
dq=1;
_nop_();
}
dq=1;
delay();
}
UCHAR du()
{
UCHAR temp,i;
bit ret_bit;
dq=1;
delay();
for(i=0;i<8;i++)
{
dq=0;
_nop_();
_nop_();
dq=1;
for(n=7;n>0;n--);
ret_bit=dq;
for(n=20;n>0;n--);
dq=1;
if(ret_bit)
{
temp=(temp>>1)|0x80;
}
else
temp=temp>>1;
}
dq=1;
return temp;
}
UINT wd()
{
UCHAR i,j;
UINT k;
fuwei();
xie(0xcc);
xie(0x44);
delay1(10);
fuwei();
xie(0xcc);
xie(0xbe);
i=du();
j=du();
k=j;
k=k<<8;
k=k+i;
return k;
}
首先确定你的温度是否读出来了,然后确定你的led显示程序能正确显示数字,先测led显示,然后加上温度在测试,希望能够帮到你
不好意思,好像没什么问题啊。
我是这么觉得,可就是不行,心累
这是我的图
印象中DS18b20要相应的初始化吧
main函数的P1是什么,不用声明它是P1口吗?不声明的话它不就是普通变量名吗?P1口当然就保持硬件初始化状态了
这个不用申明吧,不是只有位才要申明吗
DS18b20记得好像要初始化操作吧
函数fufei要有返回类型,你看一下返回值对吧,要是返回值一直不对说明你初始化不成功或者传感器坏了,另外你写的程序太乱了。需不需要我给你提供一份
好呀,谢谢了
