DS18B20的读写时隙问题

unsignedcharReadOneChar(void){//读一个字节unsignedchari=0;unsignedchardat=0;for(i=8;i>0;i-... unsigned char ReadOneChar(void){//读一个字节
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--){
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
Delay(4);
}
return(dat);
}
/******************************************************************************/
void WriteOneChar(unsigned char dat){//写一个字节
unsigned char i=0;
for (i=8; i>0; i--){
DQ = 0;
DQ = dat&0x01;
Delay(5);
DQ = 1;
dat>>=1;
}
}
资料上都是总线从高往低拉产生读写时隙,但是我的这种写法不知道为什么也可以?
展开
 我来答
backup88
2011-11-12 · 超过18用户采纳过TA的回答
知道答主
回答量:77
采纳率:100%
帮助的人:21万
展开全部
给你调通过的程序,自己看吧!
#define DQ_HIGH() DQ_DIR =1 //设置数据口为输入
#define DQ_LOW() DQ = 0; DQ_DIR = 0 //设置数据口为输出

//复位DQ18B20函数,每次通信过程都是以Reset信号开始
// 返回值:
// 1: 复位成功
// 0: 不存在设备
unsigned char DS_Reset(void)
{
unsigned char Presence=1; // 应答位
DQ_HIGH(); //释放总线等电阻拉高总线
NOP(); // 对同一端口操作要延时一个NOP
DQ_LOW() ; //主机拉至低电平
Delay3US(164); //延时500us
DQ_HIGH(); //释放总线等电阻拉高总线,并保持15~60us
Delay3US(17); //延时60us
if(DQ==1)
Presence=0; //没有接收到应答信号,继续复位
else
Presence=1; //接收到应答信号
Delay3US(164); //延时500us
return(Presence);
}
// 内部函数,读一个位,返回值0说明位是0,否则为1
unsigned char DS_Read_Bit(void)
{
unsigned char temp;
DQ_HIGH(); //读操作开始前,总线应被上拉电阻拉高
NOP(); // 拉高到变低之间有1us的间隔
DQ_LOW(); // 主机输出低电平
NOP(); //低电平应该保持1μs以上
DQ_HIGH(); //主机释放总线
Delay3US(1); // 延时15us
temp=DQ; // 读取DS18B20输出的数据
Delay3US(12); //延时45us,与上次延时加一起大于60us
return temp;
}
// 内部函数,写一个位,ch为0说明写0,否则写1
void DS_Write_Bit(unsigned char ch)
{
DQ_HIGH(); //写操作开始前,总线应被上拉电阻拉高
NOP(); // 拉高到变低之间有1us的间隔
DQ_LOW(); // 主机输出低电平
NOP(); //连续写操作之间应该有1μs间隔
if(ch==1)
DQ_HIGH(); //如果写1,拉高电平
// 否则说明写0,前面操作已经使总线输出0了
Delay3US(18); //延时60us
DQ_HIGH(); // 写操作结束后总线继续被上拉电阻拉高
}
// 读一个字节
unsigned char DS_Read_Byte(void)
{
unsigned char i;
unsigned char data=0;
unsigned char tmp;// 保存读处的位
for(i=8;i>0;i--)
{
data>>=1;
tmp=DS_Read_Bit();
if(tmp) data|=0x80; //tmp为1则把data最高位置1
Delay3US(18); //63us
}
return(data);
}
//写一个字节
void DS_Write_Byte(unsigned char data)
{
unsigned char i;
unsigned char temp;
for(i=8;i>0;i--)
{
temp=data&0x01; //获得最低位值
DS_Write_Bit(temp); //写一个位
data=data>>1; //最低位右移一位
}
}
luxvyang
2011-11-12 · 超过17用户采纳过TA的回答
知道答主
回答量:48
采纳率:0%
帮助的人:41.7万
展开全部
你的延时是毫秒级的 时间足够长到你不出错。 总线空闲是高电平。你DQ=0就都拉低了,也是高到低。 你问的大概我就能理解到这意思。具体程序参考楼上的,已经很完美了,我就不贴了
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式