晶振22.1184M的STC12C5A60S2单片机怎么编写ds18b20程序?怎么调呀? 网上找了,但是调不好,复位的能调好。

请高手帮忙调一下?感谢感谢!
2024-12-24 23:06:09
推荐回答(2个)
回答1:

/*时序调试可以用定时器,首先把准确的时序调好,然后是在wendu()函数里的复位函数while(dsreset());之后有一定的延时;就行了,我的ds18b20接的是单片机P1^7口,之前也是挑不出来,最后就是在复位函数while(dsreset());之后加了个延时才出来的。另外我用的是lcd1602显示*/

#include
#include

#define uchar unsigned char
#define uint unsigned int

sbit dq=P1^7;
sbit rs=P3^7;
sbit rw=P3^6;
sbit en=P2^7;
uchar num;
uchar flag;

void delay1(uint z)
{
while(z--);
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
///////////////lcd1602////////////////////////////
void write_com(uchar com)
{
rw=0;
rs=0;
P0=com;
delay(5);
en=1;
delay(5);
en=0;
}

void write_dat(uchar dat)
{
rw=0;
rs=1;
P0=dat;
delay(5);
en=1;
delay(5);
en=0;
}

void lcdinit()
{
rw=0;
en=0;
write_com(0x38);
write_com(0x0e);
write_com(0x06);
write_com(0x80);
}
////////////////ds18b20//////////////////////////////////////
uchar dsreset(void) //18B20复位,初始
{
uchar i;
dq=0;
flag=0;
TH0=0xfa;
TL0=0xf6;
TR0=1;
while(!flag);
dq=1;
i=dq;
TH0=0xff;
TL0=0x91;
TR0=1;
flag=0;
while(!flag);
i=dq;
return i;
}

void ds18b20xie_byte(uchar dat)
{
uchar i,j;
for(i=0;i<8;i++)
{
dq=0;
_nop_();

dq=dat&0x01;
flag=0;
TH0=0xff;
TL0=0x48;
TR0=1;
while(!flag);
dq=1;
dat>>=1;
}
}
uchar ds18b20du_byte()
{
uchar i,dat=0;
dq=1;
_nop_();
for(i=0;i<8;i++)
{
dq=0;
_nop_();
dat>>=1;
dq=1;
_nop_();
_nop_();
_nop_();
if(dq) dat=dat|0x80;
flag=0;
TH0=0xff;
TL0=0xa4;
TR0=1;
while(!flag);
dq=1;
}
return dat;
}

void wendu()
{
uchar i,j;
int time,time1;
while(dsreset());
dq=1;
delay(200);//////////////要有一定的延时
ds18b20xie_byte(0xcc);
ds18b20xie_byte(0x44);
delay(2);///////////要有一定的延时
while(dsreset());
delay(20000);
ds18b20xie_byte(0xcc);
ds18b20xie_byte(0xbe);
i=ds18b20du_byte();
j=ds18b20du_byte();
time=i+j*256;
if(time<0)
{
write_com(0x80);
write_dat('-');
time=0-time;
}
else write_dat('+');
time1=time>>4;
time=time&0x000f;
time=time*0.625;
write_com(0x81);
write_dat(time1/100+0x30);
write_com(0x82);
write_dat(time1%100/10+0x30);
write_com(0x83);
write_dat(time1%10+0x30);
write_com(0x84);
write_dat('.');
write_com(0x85);
write_dat(time+0x30);

}

/////////////////////////////////////////////////////////////////
void main()
{
TMOD=0x01;
EA=1;
ET0=1;

while(1)
{

lcdinit();
wendu();
write_dat('a');
}
}

void timer0() interrupt 1
{
flag=1;
TR0=0;
}

回答2:

大哥能把qq留下吗,我也有这个同样的电路程序需要解决,可否指点一二(qq2351495375)