/*****18B20读函数*****/
时间: 2024-03-30 08:32:08 浏览: 18
18B20是一种温度传感器,常用于测量环境温度。它采用单总线接口进行通信,并具有数字输出。以下是18B20的读函数的介绍:
读取18B20温度传感器的函数通常包括以下步骤:
1. 初始化:设置引脚模式和其他必要的参数。
2. 发送复位脉冲:向传感器发送复位脉冲,以确保传感器处于正确的工作状态。
3. 发送读取命令:向传感器发送读取温度的命令。
4. 接收数据:等待传感器的响应,并接收传感器发送的温度数据。
5. 解析数据:根据18B20的通信协议,解析接收到的数据,得到实际的温度值。
6. 返回温度值:将解析得到的温度值返回给调用者。
需要注意的是,具体的18B20读函数实现可能会因不同的硬件平台或编程语言而有所不同。以上是一般情况下18B20读函数的基本步骤。
相关问题
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。这些延时函数的具体实现方式是通过循环来实现一定的延时时间。
ds18b20 51单片机
DS18B20是一种数字温度传感器,可以通过单总线接口与51单片机通信。使用51单片机读取DS18B20的温度数据需要进行一系列的初始化和通信操作。以下是一个基本的读取DS18B20温度数据的示例代码:
```c
#include<reg51.h>
#include<intrins.h>
#define DQ P1_0
void Delay1us(void);
void Delay10us(void);
void Delay500us(void);
void Delay750us(void);
/* DS18B20写字节函数 */
void WriteByte(unsigned char dat)
{
unsigned char i;
for(i=0; i<8; i++)
{
DQ=0; //拉低总线
_nop_();
_nop_();
if(dat&0x01) DQ=1; //写数据
_nop_();
_nop_();
DQ=1; //释放总线,等待写入下一位
dat>>=1;
}
}
/* DS18B20读字节函数 */
unsigned char ReadByte(void)
{
unsigned char i, dat;
for(i=0; i<8; i++)
{
DQ=0; //拉低总线
_nop_();
_nop_();
DQ=1; //释放总线
_nop_();
_nop_();
dat>>=1;
if(DQ) dat|=0x80; //读数据
Delay1us();
}
return dat;
}
/* DS18B20初始化函数 */
void Init_DS18B20(void)
{
DQ=1; //释放总线
Delay750us();
DQ=0; //拉低总线
Delay500us();
DQ=1; //释放总线
Delay10us();
}
/* DS18B20开始转换函数 */
void StartConvert_DS18B20(void)
{
Init_DS18B20();
WriteByte(0xCC); //跳过ROM操作
WriteByte(0x44); //开始转换
}
/* DS18B20读温度函数 */
unsigned int ReadTemp_DS18B20(void)
{
unsigned char temp1, temp2;
unsigned int temp;
Init_DS18B20();
WriteByte(0xCC); //跳过ROM操作
WriteByte(0xBE); //读取温度数据
temp1=ReadByte(); //读LSB
temp2=ReadByte(); //读MSB
temp=temp2;
temp=(temp<<8)|temp1;
return temp; //返回温度值
}
/* 延时1微秒函数 */
void Delay1us(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
/* 延时10微秒函数 */
void Delay10us(void)
{
unsigned char i;
for(i=0; i<10; i++) Delay1us();
}
/* 延时500微秒函数 */
void Delay500us(void)
{
unsigned char i;
for(i=0; i<500; i++) Delay1us();
}
/* 延时750微秒函数 */
void Delay750us(void)
{
unsigned char i;
for(i=0; i<750; i++) Delay1us();
}
void main()
{
unsigned int temp;
while(1)
{
StartConvert_DS18B20(); //开始转换
Delay500us(); //等待转换完成
temp=ReadTemp_DS18B20(); //读取温度值
temp=temp*0.0625; //将温度值转换为摄氏度
//显示温度值
//...
}
}
```
需要注意的是,DS18B20的通信协议比较复杂,需要根据数据手册进行详细的配置和操作。在实际应用中,可以使用已经封装好的DS18B20库来简化操作。