现在的位置: 首页 > 综合 > 正文

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

2018年07月12日 ⁄ 综合 ⁄ 共 715字 ⁄ 字号 评论关闭
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,最高位变次高位,数据错误,所以结果出错。

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

抱歉!评论已关闭.