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

请高手帮忙调一下?感谢感谢!... 请高手帮忙调一下?感谢感谢! 展开
 我来答
dd793144617
2012-04-19
知道答主
回答量:3
采纳率:0%
帮助的人:2.9万
展开全部
/*时序调试可以用定时器,首先把准确的时序调好,然后是在wendu()函数里的复位函数while(dsreset());之后有一定的延时;就行了,我的ds18b20接的是单片机P1^7口,之前也是挑不出来,最后就是在复位函数while(dsreset());之后加了个延时才出来的。另外我用的是lcd1602显示*/

#include <reg51.h>
#include <intrins.h>

#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;
}
liening250
2012-04-26
知道答主
回答量:15
采纳率:0%
帮助的人:7.1万
展开全部
大哥能把qq留下吗,我也有这个同样的电路程序需要解决,可否指点一二(qq2351495375)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式