void init_18b20() { bit q; dq = 1; //°Ñ×ÜÏßÄÃ¸ß delay_uint(1); //15us dq = 0; //¸ø¸´Î»Âö³å delay_uint(80); //750us dq = 1; //°Ñ×ÜÏßÄÃ¸ß µÈ´ý delay_uint(10); //110us q = dq; //¶ÁÈ¡18b20³õʼ»¯ÐźŠdelay_uint(20); //200us dq = 1; //°Ñ×ÜÏßÄÃ¸ß ÊÍ·Å×ÜÏß } /*************д18b20ÄÚµÄÊý¾Ý***************/ void write_18b20(uchar dat) { uchar i; for(i=0;i<8;i++) { //дÊý¾ÝÊǵÍλ¿ªÊ¼ dq = 0; //°Ñ×ÜÏßÄõÍдʱ¼ä϶¿ªÊ¼ dq = dat & 0x01; //Ïò18b20×ÜÏßдÊý¾ÝÁË delay_uint(5); // 60us dq = 1; //ÊÍ·Å×ÜÏß dat >>= 1; } }解释
时间: 2023-10-21 09:28:31 浏览: 46
这是关于18b20温度传感器的操作函数。其中,init_18b20()函数是初始化18b20传感器的函数,该函数的具体功能是:将总线拉低80us,然后拉高10us,读取18b20初始化信号,最后将总线拉高。write_18b20()函数是写入18b20传感器数据的函数,该函数的具体功能是:将数据按照低位到高位的顺序写入18b20传感器。在这两个函数中,dq代表18b20传感器的数据线,dat是要写入的数据。函数中的delay_uint()函数是延时函数,用于等待18b20传感器的响应。
相关问题
#include <tube.H> #include <key.H> #include <onewire.H> sbit DQ = P3^7; //µ¥×ÜÏß½Ó¿Ú u8 ff=0;//ÅжÏÊÇ·ñΪ¸ºÊý //µ¥×ÜÏßÑÓʱº¯Êý void Delay_OneWire(unsigned int t) //STC89C52RC { while(t--); } //ͨ¹ýµ¥×ÜÏßÏòDS18B20дһ¸ö×Ö½Ú void Write_DS18B20(unsigned char dat) { unsigned char i; for(i=0;i<8;i++) { DQ = 0; DQ = dat&0x01; Delay_OneWire(5); DQ = 1; dat >>= 1; } Delay_OneWire(5); } //´ÓDS18B20¶ÁÈ¡Ò»¸ö×Ö½Ú unsigned char Read_DS18B20(void) { unsigned char i; unsigned char dat; for(i=0;i<8;i++) { DQ = 0; dat >>= 1; DQ = 1; if(DQ) { dat |= 0x80; } Delay_OneWire(5); } return dat; } //DS18B20É豸³õʼ»¯ bit init_ds18b20(void) { bit initflag = 0; DQ = 1; Delay_OneWire(12); DQ = 0; Delay_OneWire(80); DQ = 1; Delay_OneWire(10); initflag = DQ; Delay_OneWire(5); return initflag; } unsigned int Ds18b20temp() { u16 H8=0,L8=0; u16 temp1 = 0; init_ds18b20(); Write_DS18B20(0xcc); Write_DS18B20(0x44); Delay_OneWire(200); init_ds18b20(); Write_DS18B20(0xcc); Write_DS18B20(0xbe); L8 = Read_DS18B20(); H8 = Read_DS18B20(); H8 = (H8 << 8) | L8; temp1 = H8; if((H8 & 0xf800) == 0xf800) { ff=1; temp1=~temp1+1; } else ff=0; temp1 = temp1 * 0.625; return temp1; }
这段代码是关于 DS18B20 温度传感器的读取和处理的部分。具体的功能如下:
1. 引入了头文件 `tube.H`、`key.H` 和 `onewire.H`,其中可能定义了一些函数和变量。
2. 定义了一个位变量 `DQ`,用于控制与温度传感器的通信。
3. 定义了一个 `ff` 变量,用于判断温度是否为负数。
4. 定义了延时函数 `Delay_OneWire()`,用于模拟时序。
5. 定义了函数 `Write_DS18B20()`,用于向 DS18B20 发送一个字节的数据。
6. 定义了函数 `Read_DS18B20()`,用于从 DS18B20 读取一个字节的数据。
7. 定义了函数 `init_ds18b20()`,用于初始化 DS18B20 温度传感器。
8. 定义了函数 `Ds18b20temp()`,用于获取温度传感器的温度值。
- 在函数中,首先进行DS18B20的初始化。
- 然后发送命令让DS18B20开始转换温度。
- 延时一段时间等待转换完成。
- 初始化DS18B20。
- 发送命令读取DS18B20的温度值。
- 将高8位和低8位进行合并得到完整的温度值。
- 判断温度是否为负数。
- 将温度值乘以0.625,得到最终的温度值。
- 返回温度值。
以上是对代码的简单分析,具体的实现逻辑可能还需要查看 `tube.H`、`key.H` 和 `onewire.H` 头文件中的定义。
解释一下这串代码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温度传感器以及相应的引脚。