关于ds 18b20的 写时间隙、、
时间:10-02
整理:3721RD
点击:
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit ds18=P2^2;
sbit duan=P2^6;
sbit wei=P2^7;
sbit deng=P1^0;
uint temp;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void display(uint temp);
void init();
void delay(uchar c);
void fuwei();
uchar rd(void);
void wr(uchar ml);
bit tmpreadbit(void);
main()
{ uchar i;
uchar a,b;
float tt;
init();
while(1)
{ for(i=0;i<9;i++)
{
fuwei();
delay(1);
wr(0xcc);
wr(0x44);
delay(658);
fuwei();
delay(1);
wr(0xcc);
wr(0xbe);
a=rd();
b=rd();
temp=b;
temp<<=8;
temp=temp|a;
tt=temp*0.0625;
temp=tt*10+0.5;
display(temp);
}
}
}
void init()
{
P0=0xff;
duan=0;
wei=0;
temp=0;
}
void delay(uchar c)
{
uchar a,b;
for(a=c;a>0;a--)
for(b=100;b>0;b--);
}
void display(uint c)
{ uchar bai,shi,ge;
bai=c/100;
shi=c%100/10;
ge=c%10;
P0=0xff;
wei=1;
P0=0xf7;
wei=0;
P0=0x00;
duan=1;
P0=table[bai];
duan=0;
delay(1);
P0=0xff;
wei=1;
P0=0xef;
wei=0;
P0=0x00;
duan=1;
P0=table[shi];
duan=0;
delay(1);
P0=0xff;
wei=1;
P0=0xdf;
wei=0;
P0=0x00;
duan=1;
P0=table[ge];
duan=0;
delay(1);
}
void fuwei()
{
uchar i;
ds18=0;
delay(3);//760us
for(i=0;i<8;i++);//28us
ds18=1;//1us
i=0;
while((ds18==1)&&(i<18))i++;
ds18=1;
for(i=0;i<20;i++);//67us,20,13us,4,44us,13
i=0;
}
void wr(uchar ml)
{
uint i;
uchar j;
//bit testb;
for(j=1;j<=8;j++)
{
ml=ml>>1;
if(CY==1) //write 1
{
ds18=0;
for(i=0;i<1;i++); /* 就是这、不是说写1的时候、时间、间隙是15us啊、我调到13us结果还是不行、写入混乱啊、 一点点往下调到现在这种、才可以进行 正常的操作了、、、为什么啊、不是说好的15us 啊*/
ds18=1;
for(i=0;i<13;i++);
;
}
else
{
ds18=0; //write 0
for(i=0;i<17;i++);
ds18=1;
; ;
// for(i=0;i<4;i++);
}
}
}
bit tmpreadbit(void)
{
uint i;
bit dat;
ds18=0;i++;
ds18=1;i++;i++;
dat=ds18;
i=8;while(i>0)i--;
return (dat);
}
uchar rd(void) //read a byte date
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1);
}
return(dat);
}
#define uint unsigned int
#define uchar unsigned char
sbit ds18=P2^2;
sbit duan=P2^6;
sbit wei=P2^7;
sbit deng=P1^0;
uint temp;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void display(uint temp);
void init();
void delay(uchar c);
void fuwei();
uchar rd(void);
void wr(uchar ml);
bit tmpreadbit(void);
main()
{ uchar i;
uchar a,b;
float tt;
init();
while(1)
{ for(i=0;i<9;i++)
{
fuwei();
delay(1);
wr(0xcc);
wr(0x44);
delay(658);
fuwei();
delay(1);
wr(0xcc);
wr(0xbe);
a=rd();
b=rd();
temp=b;
temp<<=8;
temp=temp|a;
tt=temp*0.0625;
temp=tt*10+0.5;
display(temp);
}
}
}
void init()
{
P0=0xff;
duan=0;
wei=0;
temp=0;
}
void delay(uchar c)
{
uchar a,b;
for(a=c;a>0;a--)
for(b=100;b>0;b--);
}
void display(uint c)
{ uchar bai,shi,ge;
bai=c/100;
shi=c%100/10;
ge=c%10;
P0=0xff;
wei=1;
P0=0xf7;
wei=0;
P0=0x00;
duan=1;
P0=table[bai];
duan=0;
delay(1);
P0=0xff;
wei=1;
P0=0xef;
wei=0;
P0=0x00;
duan=1;
P0=table[shi];
duan=0;
delay(1);
P0=0xff;
wei=1;
P0=0xdf;
wei=0;
P0=0x00;
duan=1;
P0=table[ge];
duan=0;
delay(1);
}
void fuwei()
{
uchar i;
ds18=0;
delay(3);//760us
for(i=0;i<8;i++);//28us
ds18=1;//1us
i=0;
while((ds18==1)&&(i<18))i++;
ds18=1;
for(i=0;i<20;i++);//67us,20,13us,4,44us,13
i=0;
}
void wr(uchar ml)
{
uint i;
uchar j;
//bit testb;
for(j=1;j<=8;j++)
{
ml=ml>>1;
if(CY==1) //write 1
{
ds18=0;
for(i=0;i<1;i++); /* 就是这、不是说写1的时候、时间、间隙是15us啊、我调到13us结果还是不行、写入混乱啊、 一点点往下调到现在这种、才可以进行 正常的操作了、、、为什么啊、不是说好的15us 啊*/
ds18=1;
for(i=0;i<13;i++);
;
}
else
{
ds18=0; //write 0
for(i=0;i<17;i++);
ds18=1;
; ;
// for(i=0;i<4;i++);
}
}
}
bit tmpreadbit(void)
{
uint i;
bit dat;
ds18=0;i++;
ds18=1;i++;i++;
dat=ds18;
i=8;while(i>0)i--;
return (dat);
}
uchar rd(void) //read a byte date
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1);
}
return(dat);
}
请问你能给我保证你所写的15us就是15么。你能保证么。?一个for函数里面执行起来占了所说指令你算过没?还有是时序
、有调试、就是设置断点、查看、for(i=0;i<4;i++);
这句话算着是14us 的、然后将总线拉高、可是这样就不行、
改成 i<1 就可以运行了呢、
它这个时间是不是要算上、总线从低到高、有个延迟呢
我看到别人的程序是这样的
for(time=0;time<10;time++)
;//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样
DQ=1; //释放数据线
for(time=0;time<1;time++)
;//延时3us,两个写时序间至少需要1us的恢复期
可参考下
嗯嗯、谢谢呢、感谢、