|

楼主 |
发表于 2019-3-3 16:27:04
|
显示全部楼层
请教温度显示到串口例程对读写部分还是不是很清楚需要请教解惑:
根据 DS18B20初始化部分,DQ=1延时和DQ=0都是单片机控制总线的操作,X=DQ是读DS18B20控制器Rx是否拉高总线判断单片机是否连接DS18B20。
********************************************************************************
** 函数名称 : ReadOneChar()
** 函数功能 : 读一个字节
********************************************************************************
*/
ReadOneChar() //主机数据线先从高拉至低电平1us以上,再使数据线升为高电平,从而产生读信号
{
unsigned char i=0; //每个读周期最短的持续时间为60us,各个读周期之间必须有1us以上的高电平恢复期
unsigned char dat=0;
for (i=8;i>0;i--) //一个字节有8位
{
DQ=1;
delay(1);
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}
/*
上面的读部分反复搜网上例程解释也大致知道,读一个字节部分读到 DQ=0就 dat>>=1;读到DQ=1; dat|=0x80;
但是对比DS18B20初始化部分,弄不明白DQ=0和DQ=1是单片机控制总线的操作还是读到DS18B20的位数据?
我感觉DQ=0和DQ=1应该是单片机控制总线的读DS18B20操作,类似初始化X=DQ读DS18B20控制器Rx是那部分?
为什么不这样写
{
bit dat;
DQ=0; //单片机(微处理器)将总线拉低
_nop_(); //读时隙起始于微处理器将总线拉低至少1us
DQ=1; //拉低总线后接着释放总线,让从机18b20能够接管总线,输出有效数据
_nop_();
_nop_(); //小延时一下,读取18b20上的数据 ,因为从ds18b20上输出的数据
//在读"时间隙"下降沿出现15us内有效
dat=DQ; //主机读从机18b20输出的数据,这些数据在读时隙的下降沿出现//15us内有效
TempDelay(10); //所有读"时间隙"必须60~120us,这里77us
return(dat); //返回有效数据
}
这段时间一直在琢磨这个例程,比前段时间清楚一些还是有些迷糊。
补充内容 (2019-3-4 09:42):
找到相关编程解释,谢谢! |
|