单片机温度控制器DS18B20写入时序问题

摸板写程序如下
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
Delay_DS18B20(5);
DQ = 1;
dat>>=1;
在执行完DQ = dat&0x01;后,手册上说写0DQ要保较长时间,而写1时间很短,但Delay_DS18B20(5);中的延时都是一样的,那怎么区分写入的是0和1呢,谢谢

我有汇编的 写入程序
WRITE:MOV R2,#08h ;循环次数,及输入多少位
CLR C
WRITE1:CLR P3.3
MOV R3,#07h
STOP1:DJNZ R3,STOP1 ;延迟15us
RRC A ;带进位循环右移,输入位进入C
MOV P3.3,C
MOV R3,#22
STOP2:DJNZ R3,STOP2 ;延迟45us
SETB P3.3 ;释放数据总线
NOP
DJNZ R2,WRITE1 ;输入1字节(8位),没完成则继续循环
SETB P3.3
RET
以上是字节写入
P3.3 接的DS18B20的数据总线
主机将信号线从高电平拉至低电平,产生写起始信号。从信号线的下降沿开始,在15~60 μS的时间内DS18B20对信号线检测,如信号线为高电平,则写1,如信号线为0,则写0,从而完成了一个写周期。在开始另一个写周期前,必须有1μS以上的高电平恢复期。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-12-03
这个问题看来 你还是没理解c语言 延时就是MCU什么也不做 在那里等待 至于DQ的状态 延时之前就决定了 如DQ之前是1 延时时保持1追问

DS18B20中文手册上是这样描述的
写0的步骤如下 写1的步骤如下
1.单片机拉低电平约10-15us , 1.单片机拉低电平约10-15us,
2.单片机持续拉低电平约20-45us, 2.单片机持续拉高电平约20-45us,
3.释放总线 3.释放总线
问题是第2步单片机持续拉低电平和拉高电平如何在程序中体现出来的

追答

DQ = dat&0x01;
Delay_DS18B20(5); 这条语句就是延时语句
这就是单片机持续拉低电平和拉高电平的体现 如果dat&0x01 的值是1 那DQ拉高 然后进行延时 如果dat&0x01是0 DQ拉低 然后进行等待 一个完整的写时序步骤
DQ =1; // 先将数据线拉高
_nop_(); //等待一个机器周期
DQ=0; //将数据线从高拉低时即启动写时序
DQ=dat&0x01; //利用与运算取出要写的某位二进制数据,
//并将其送到数据线上等待DS18B20采样
for(time=0;time<10;time++)
;//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样
DQ=1; //释放数据线
for(time=0;time<1;time++)
;//延时3us,两个写时序间至少需要1us的恢复期

本回答被提问者采纳
相似回答