void Ds18b20Write(unsigned char infor) { unsigned int i; Ds18b20OutputInitial(); for(i=0;i<8;i++) { if((infor & 0x01)) { Ds18b20IO = 0; Ds18b20Delay(6); Ds18b20IO = 1; Ds18b20Delay(50); } else { Ds18b20IO = 0; Ds18b20Delay(50); Ds18b20IO = 1; Ds18b20Delay(6); } infor >>= 1; } }
时间: 2024-02-10 22:22:11 浏览: 93
这是一个函数,名为 Ds18b20Write,没有返回值(即返回类型为 void)。该函数的作用是向 DS18B20 温度传感器写入一个字节的数据,具体实现过程为:
1. 定义了一个变量 i,作为循环计数器。
2. 调用了 Ds18b20OutputInitial 函数,该函数作用是将控制 DS18B20 的引脚初始化为输出模式。
3. 进入一个 for 循环,循环次数为 8,即写入一个字节的数据需要循环 8 次。
4. 判断要写入的数据的最低位是否为 1,如果是,则将 DQ 引脚拉低,延时 6us,再将 DQ 引脚拉高,延时 50us;如果不是,则将 DQ 引脚拉低,延时 50us,再将 DQ 引脚拉高,延时 6us。
5. 将要写入的数据右移一位,准备写入下一位。
6. 循环结束,函数执行完毕。
相关问题
unsigned char temperature; //???????? //???DS18B20,?????? void ds18b20_init() { DQ=1; Delay(2); DQ=0; Delay(480); DQ=1; Delay(60); } //?DS18B20????????? void ds18b20_write_byte(unsigned char dat) { unsigned char i; for(i=0;i<8;i++) { DQ=0; Delay(1); DQ=dat&0x01; dat>>=1; Delay(60); DQ=1; } } //??DS18B20????????? unsigned char ds18b20_read_byte() { unsigned char i,dat=0; for(i=0;i<8;i++) { DQ=0; Delay(1); DQ=1; Delay(1); dat|=(DQ<<i); Delay(60); } return dat; } //??DS18B20???? void ds18b20_read_temperature() { unsigned char TL,TH; ds18b20_init(); ds18b20_write_byte(0xCC); //??ROM?? ds18b20_write_byte(0x44); //?????? Delay(750); ds18b20_init(); ds18b20_write_byte(0xCC); //??ROM?? ds18b20_write_byte(0xBE); //??????? TL=ds18b20_read_byte(); //??????8? TH=ds18b20_read_byte(); //??????8? temperature=(TH<<4)|(TL>>4); //????? }
这段代码是一个用于读取DS18B20温度传感器的程序。首先,`ds18b20_init()`函数初始化DS18B20传感器。然后,`ds18b20_write_byte()`函数用于向DS18B20发送命令和数据。`ds18b20_read_byte()`函数用于从DS18B20读取数据。最后,`ds18b20_read_temperature()`函数用于读取DS18B20传感器的温度值,并将其存储在`temperature`变量中。
具体来说,`ds18b20_read_temperature()`函数通过向DS18B20发送"跳过ROM"指令和"温度转换"指令来启动温度转换过程。然后等待750毫秒,等待转换完成。接着发送"跳过ROM"指令和"读取暂存器"指令,来读取DS18B20传感器中存储的温度值。最后将读取到的温度值转换成实际的温度值,并将其存储在`temperature`变量中。
需要注意的是,这段代码中的`Delay()`函数是一个自定义的延时函数,它用于在需要等待一段时间时调用。具体实现可能因不同的开发板而异。
sbit DQ = P2^0; uchar a,b,c,d; void Delay750us() //@11.0592MHz { unsigned char i, j; _nop_(); i = 2; j = 84; do { while (--j); } while (--i); } void Delay75us() //@11.0592MHz { unsigned char i; i = 32; while (--i); } void Delay8us() //@11.0592MHz { unsigned char i; i = 1; while (--i); } /*初始化*/ void DS18B20_init(void) { unsigned char x = 255; DQ = 1; DQ = 0; Delay750us(); //750us DQ = 1; while(DQ && x--); //等待应答 Delay750us(); } /*写数据*/ void write_DS18B20(unsigned char dat) { unsigned char i; for(i = 8; i > 0; i--) { DQ = 0; Delay8us(); DQ = dat & 0x01; Delay75us(); DQ = 1; dat >>= 1; } } /*读数据*/ unsigned char read_DS18B20(void) { unsigned char i,dat; for(i = 8; i > 0; i--) { DQ = 1; DQ = 0; dat >>= 1; DQ = 1; if(DQ)dat |= 0x80; Delay75us(); } return(dat); } unsigned char get_temp(void) { unsigned char t; DS18B20_init(); write_DS18B20(0xcc); write_DS18B20(0x44); DS18B20_init(); write_DS18B20(0xcc); write_DS18B20(0xbe); a = read_DS18B20(); b = read_DS18B20(); c = a & 0x0f; a >>= 4; b <<= 4; t = a | b; return(t); } 解释这段代码
这段代码是用于获取DS18B20温度传感器的温度值的。这个传感器使用单总线协议进行通信,所以需要使用单片机的IO口来模拟这个总线的通信。具体的实现过程如下:
1. 初始化DS18B20传感器,发送初始化序列,包括将总线拉低750us,然后拉高750us,等待DS18B20的应答信号。
2. 向DS18B20传感器发送写命令,包括发送跳过ROM码的指令0xcc和转换温度的指令0x44。
3. 初始化DS18B20传感器,发送初始化序列,等待DS18B20的应答信号。
4. 向DS18B20传感器发送读命令,包括发送跳过ROM码的指令0xcc和读取温度值的指令0xbe。
5. 读取DS18B20传感器返回的温度值,分为三个字节,a、b、c。其中a和b需要进行移位操作和按位或操作,得到最终的温度值t。
注意,这段代码中使用了一些延时函数,包括延时750us、延时75us和延时8us。这些延时函数的具体实现方式是通过循环来实现一定的延时时间。
阅读全文