void Init_DS18B20(void) { unsigned char x=0; DQ = 1; Delayns(8); DQ = 0; Delayns(80); DQ = 1; Delayns(14); x=DQ; Delayns(20); } unsigned char ReadOneChar(void) { unsigned char i=0; unsigned char dat = 0; for(i=0;i>0;i--) { DQ = 0; dat>>=1; DQ = 1; if(DQ) dat |= 0x80; Delayns(4); } return(dat); } void WriteOneChar(unsigned char dat) { unsigned char i=0; for(i=0;i>0;i--) { DQ = 0; DQ = dat&0x01; Delayns(5); DQ = 1; dat>>=1; } } unsigned int ReadTemperature(void) { unsigned char a=0; unsigned char b=0; unsigned int t=0; float tt = 0; Init_Ds18B20(); WriteOneChar(0xCC); WriteOneChar(0x44); Init_DS18B20(); WriteOneChar(0xCC); WriteOneChar(0xBE); a=ReadOneChar(); b=ReadOneChar(); t=b; t<<=8; t=t|a; tt=t*0.0625; t=tt*10+0.5; return(t); }
时间: 2023-10-22 07:09:44 浏览: 39
这段代码是使用单总线DS18B20温度传感器读取温度的代码,具体的函数包括:
1. Init_DS18B20():初始化DS18B20传感器,包括发送复位信号,等待一定时间,读取DS18B20的响应等。
2. ReadOneChar():读取单总线上DS18B20传感器发送的数据。
3. WriteOneChar():向单总线上的DS18B20传感器写入数据。
4. ReadTemperature():读取DS18B20传感器的温度数据,并计算出对应的温度值。
其中,Init_DS18B20() 和 ReadOneChar() 函数用来实现单总线通信协议,WriteOneChar() 用来向DS18B20传感器写入指令,ReadTemperature() 则用来读取DS18B20传感器的温度数据,并进行相关的计算,得到对应的温度值。
相关问题
解释一下这串代码void delay_18B20(uint i) { while(i--); } void Init_DS18B20(void) { uchar x=0; DQ =1; delay_18B20(8); DQ =0; delay_18B20(80); DQ =1; delay_18B20(14); x=DQ; delay_18B20(20); } uchar ReadOneChar(void) { unsigned char i=0; unsigned char dat0 = 0; for(i=8;i>0;i--){ DQ= 0; dat0>>=1; DQ= 1; if(DQ) dat0|=0x80; delay_18B20(4); } return(dat0); }
这段代码是用来操作DS18B20温度传感器的函数。
- `delay_18B20`函数用于实现延时功能,参数`i`表示延时的次数。函数内部使用了一个简单的`while`循环,通过不断递减`i`的值来实现延时。
- `Init_DS18B20`函数用于初始化DS18B20温度传感器。在初始化过程中,通过设置`DQ`引脚的电平和调用`delay_18B20`函数来实现相应的延时。具体的初始化步骤包括:
- 将`DQ`引脚设置为高电平。
- 延时一段时间(约8微秒)。
- 将`DQ`引脚设置为低电平。
- 延时一段时间(约80微秒)。
- 将`DQ`引脚设置为高电平。
- 延时一段时间(约14微秒)。
- 读取`DQ`引脚的电平,并将结果保存在变量`x`中。
- 延时一段时间(约20微秒)。
- `ReadOneChar`函数用于从DS18B20温度传感器读取一个字节的数据。在读取过程中,通过控制`DQ`引脚的电平和调用`delay_18B20`函数来实现相应的延时。具体的读取步骤包括:
- 使用一个循环,循环8次,每次读取一个位。
- 将`DQ`引脚设置为低电平,用于发送读取命令。
- 将要读取的数据位右移一位。
- 将`DQ`引脚设置为高电平,用于读取数据位的值。
- 如果`DQ`引脚为高电平,则将要读取的数据位的最高位设为1;否则设为0。
- 延时一段时间(约4微秒)。
- 返回读取到的数据字节。
需要注意的是,代码中使用了一些未定义的类型和变量,如`uchar`、`DQ`,这些可能是用户自定义的类型或者来自其他地方的定义。在理解代码功能时,需要对这些类型和变量进行适当的替换或定义。同时,还需要确保正确地连接和配置DS18B20温度传感器以及相应的引脚。
void Init_DS18B20(void) { unsigned char x=0; DQ=1; Delayns(8); DQ=0; Delayns(80); DQ=1; Delayns(14); x=DQ; Delayns(20); } 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; Delayns(4); } return(dat); } void WriteOneChar(unsigned char dat) { unsigned char i=0; for(i=8;i>0;i--) { DQ=0; DQ=dat&0x01; Delayns(5) ; DQ=1; dat>>=1; } } unsigned int ReadTemperature(void) { unsigned char a =0; unsigned char b=0; unsigned int t=0; float tt=0; Init_DS18B20(); WriteOneChar(0XCC); WriteOneChar(0X44); Init_DS18B20(); WriteOneChar(0XCC); WriteOneChar(0XBE); a=ReadOneChar(); b= ReadOneChar(); t=b; t<<=8; t=t|a; tt=t0.0625; t=tt10+0.5; return(t); }请帮我看看代码有没有错,为什么我读的有问题。我如果要读温度的话,怎么读
根据你提供的代码来看,这段代码主要是用来读取DS18B20温度传感器的温度值的。下面是一些可能导致读取温度有问题的原因:
1. DS18B20传感器的连接方式是否正确?DS18B20传感器应该连接到微控制器的GPIO引脚,并且需要使用上拉电阻将引脚拉高。在代码中,DQ引脚对应的GPIO引脚需要设置为输出模式,并且在需要读取数据时需要将其设置为输入模式。
2. DS18B20传感器的工作电压是否正确?DS18B20传感器的工作电压一般为3V到5V之间,需要根据具体的传感器和电路进行设置。
3. 温度值的转换是否正确?在代码中,读取到的温度值需要进行转换才能得到实际温度值。具体转换方法可以参考DS18B20的数据手册。
如果你要读取温度值,可以调用`ReadTemperature()`函数来实现。该函数会返回一个unsigned int类型的温度值,单位为0.1摄氏度。例如,如果返回值为250,表示实际温度为25.0摄氏度。该函数的调用流程如下:
1. 调用`Init_DS18B20()`函数初始化DS18B20传感器。
2. 调用`WriteOneChar(0XCC)`函数发送跳过ROM操作码。
3. 调用`WriteOneChar(0X44)`函数发送温度转换操作码。
4. 调用`Init_DS18B20()`函数重新初始化DS18B20传感器。
5. 调用`WriteOneChar(0XCC)`函数发送跳过ROM操作码。
6. 调用`WriteOneChar(0XBE)`函数发送读取温度值操作码。
7. 调用`ReadOneChar()`函数读取温度值的低8位。
8. 调用`ReadOneChar()`函数读取温度值的高8位。
9. 将读取到的温度值转换成实际温度,并返回结果。
需要注意的是,读取温度值的过程中可能会存在误差,因此需要根据具体情况进行校准。