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); } 解释这段代码
时间: 2023-06-18 22:03:52 浏览: 229
这段代码是用于获取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。这些延时函数的具体实现方式是通过循环来实现一定的延时时间。
阅读全文