操作时序的错误笔记(18B20)

uchar ReadByte_DS18B20(void)
{
	uchar i = 0, byte = 0;
	for (i = 0; i < 8; i++)
	{
		DS18B20 = 0;			//拉低总线,通知DS18B20
		byte >>= 1;			//将得到的数据移入次高位————————————(1)
		DS18B20 = 1;			//释放总线,等待DS18B20发送数据
		_nop_();
		if (DS18B20 == 1)		//如果数据为1,将byte最高位置1,否则为0
			byte |= 0x80;		
		DelayUs(2);			//此处可以不必拉高总线,DS18B20传送完后会自动释放总线
	} 
	return byte;
}

这是发现错误后改正的



uchar ReadByte_DS18B20(void)
{
	uchar i = 0, byte = 0;
	for (i = 0; i < 8; i++)
	{
		DS18B20 = 0;			//拉低总线,通知DS18B20
		_nop_();
		_nop_();
		DS18B20 = 1;			//释放总线,等待DS18B20发送数据
		_nop_();
		if (DS18B20 == 1)		//如果数据为1,将byte最高位置1,否则为0
			byte |= 0x80;
		byte >>= 1;			//将得到的数据移入次高位————————(2)
		DelayUs(2);			//此处可以不必拉高总线,DS18B20传送完后会自动释放总线
	} 
	return byte;
}
这个是错误的写法



如上面两个标注点可以看到,两者的不同仅在于byte>>=1这条语句的位置。

如果是按照第二种写法,当i=7时,如果最高位置1,此时得到的字节应该是完整、正确的,但是由于byte>>=1,最高位变次高位,数据错误,所以结果出错。


之所以会特意写出这个错误,是因为我已经在这个地方绊倒了两次了。所以不得不提醒自己。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值