DS18b20 输出不稳定,数码管显示总是在跳。。我猜是DS18b20延时长短的问题,数码管是没问题的,求大神帮忙 5
#include<reg52.h>#defineuintunsignedint#defineucharunsignedcharsbitwex=P2^7;sbitdux=P...
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit wex=P2^7;
sbit dux=P2^6;
sbit DQ=P2^2;
uchar num,temp;
uchar code table1[]={0x00,0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x40,0x6c};
uchar code table2[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
void delayms(uint);
void display(uchar dat);
void delay(uint z)
{
while(z--);
}
void init_18B20()
{
uchar n;
DQ=1;
delay(10);
DQ=0;
delay(80);
DQ=1;
delay(10);
n=DQ;
delay(5);
}
void write_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;
}
delay(5);
}
uchar read_byte()
{
uchar i,value;
for(i=0;i<8;i++)
{
DQ=0;
value>>=1;
DQ=1;
if(DQ)
value|=0x80;
delay(5);
}
return value;
}
uchar readtemperature()
{
uchar a,b;
init_18B20();
write_byte(0xcc);//跳过rom
write_byte(0x44);//驱动温度测量
delay(400);
init_18B20();
write_byte(0xcc);
write_byte(0xbe);
a=read_byte();//低8位
b=read_byte();//高8位
b<<=4;
b+=(a&0xf0)>>4;
return b;
}
void main()
{
while(1)
{
delayms(10);
display(readtemperature());
}
}
void display(uchar dat)
{
uchar shi,ge;
shi=dat/10;
ge=dat%10;
P0=0xfe;
wex=1;
wex=0;
P0=table1[shi];
dux=1;
dux=0;
delayms(5);
P0=0xfd;
wex=1;
wex=0;
P0=table1[ge];
dux=1;
dux=0;
delayms(5);
}
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
} 展开
#define uint unsigned int
#define uchar unsigned char
sbit wex=P2^7;
sbit dux=P2^6;
sbit DQ=P2^2;
uchar num,temp;
uchar code table1[]={0x00,0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x40,0x6c};
uchar code table2[]={
0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
void delayms(uint);
void display(uchar dat);
void delay(uint z)
{
while(z--);
}
void init_18B20()
{
uchar n;
DQ=1;
delay(10);
DQ=0;
delay(80);
DQ=1;
delay(10);
n=DQ;
delay(5);
}
void write_byte(uchar dat)
{
uchar i;
for(i=0;i<8;i++)
{
DQ=0;
DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;
}
delay(5);
}
uchar read_byte()
{
uchar i,value;
for(i=0;i<8;i++)
{
DQ=0;
value>>=1;
DQ=1;
if(DQ)
value|=0x80;
delay(5);
}
return value;
}
uchar readtemperature()
{
uchar a,b;
init_18B20();
write_byte(0xcc);//跳过rom
write_byte(0x44);//驱动温度测量
delay(400);
init_18B20();
write_byte(0xcc);
write_byte(0xbe);
a=read_byte();//低8位
b=read_byte();//高8位
b<<=4;
b+=(a&0xf0)>>4;
return b;
}
void main()
{
while(1)
{
delayms(10);
display(readtemperature());
}
}
void display(uchar dat)
{
uchar shi,ge;
shi=dat/10;
ge=dat%10;
P0=0xfe;
wex=1;
wex=0;
P0=table1[shi];
dux=1;
dux=0;
delayms(5);
P0=0xfd;
wex=1;
wex=0;
P0=table1[ge];
dux=1;
dux=0;
delayms(5);
}
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
} 展开
展开全部
是幸福。
你好~你的疑问就是我的任务
因为要做任务.所以才路过。。。
情不知所起,一往而深。生者可以死,死可以生。
生而不可与死,死而不可复生者,皆非情之至也。
也能表达在下对楼主的爱。
亲... 祝你幸福每一天
你好~你的疑问就是我的任务
因为要做任务.所以才路过。。。
情不知所起,一往而深。生者可以死,死可以生。
生而不可与死,死而不可复生者,皆非情之至也。
也能表达在下对楼主的爱。
亲... 祝你幸福每一天
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
怎么样?解决了没,我刚刚也遇到这个问题,我用1602显示的,数值实在恐怖,一会负值,一会几百。LZ如果解决,劳烦跟我说说,多谢了。
PS:我用现成的程序显示是没问题的,但是用自己编写的程序才出现这种情况。
PS:我用现成的程序显示是没问题的,但是用自己编写的程序才出现这种情况。
追问
没有解决,但是我的不稳定是因为十位上的数字在闪烁。。。可以吧你那好的程序法给我吗 我看看 906726786@qq.com xieixiea
追答
刚刚看到这条消息!!!不同的开发板,对应的程序会有点差别,我的问题已经解决了,我是在读取温度前先关中断的
EA=0;
temp=ReadTemperature();
EA=1;
你要我的程序?现在网上不是大把。既然你要我就发给你
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
k
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不懂
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询