向DS18B20写入一个字节
时间: 2024-04-28 07:22:09 浏览: 17
向DS18B20写入一个字节需要遵循如下步骤:
1. 将总线拉低至少1微秒,以发送一个低电平脉冲信号,表示要向DS18B20发送数据。
2. 发送8位数据,从最低位开始。每个位发送时,将总线拉低至少1微秒表示0或拉低更长时间表示1,然后将总线拉高至少60微秒,以使DS18B20读取数据。
3. 等待DS18B20确认接收数据。确认信号由DS18B20发送,它会将总线拉低至少60微秒,表示已接收到数据。
4. 将总线拉高至少1微秒,以表示数据传输结束。
需要注意的是,写入数据之前,需要先向DS18B20发送“写使能命令”,以使DS18B20准备好接收数据。写使能命令的具体步骤可以参考DS18B20的数据手册。
相关问题
基于51单片机写一个DS18B20的驱动代码
以下是基于51单片机的DS18B20驱动代码,其中使用了延时函数。
```c
#include <reg51.h>
#define DQ P1_0 // 定义DS18B20的数据引脚
void delay_us(unsigned int t) // 微秒级延时函数
{
while(t--);
}
void delay_ms(unsigned int t) // 毫秒级延时函数
{
unsigned int i, j;
for(i = 0; i < t; i++)
for(j = 0; j < 112; j++);
}
unsigned char DS18B20_init() // 初始化DS18B20
{
unsigned char i;
DQ = 1; // 先将数据线拉高
delay_us(1); // 延时1微秒
DQ = 0; // 将数据线拉低
delay_us(500); // 延时500微秒
DQ = 1; // 将数据线拉高
delay_us(60); // 延时60微秒
i = DQ; // 读取DS18B20的应答信号
delay_us(240); // 延时240微秒
return i; // 返回DS18B20的应答信号
}
void DS18B20_write_byte(unsigned char dat) // 向DS18B20写入一个字节
{
unsigned char i;
for(i = 0; i < 8; i++)
{
DQ = 0; // 将数据线拉低
delay_us(2); // 延时2微秒
DQ = dat & 0x01; // 写入最低位
delay_us(60); // 延时60微秒
DQ = 1; // 将数据线拉高
dat >>= 1; // 右移一位
}
}
unsigned char DS18B20_read_byte() // 从DS18B20读取一个字节
{
unsigned char i, dat = 0;
for(i = 0; i < 8; i++)
{
DQ = 0; // 将数据线拉低
delay_us(2); // 延时2微秒
DQ = 1; // 将数据线拉高
delay_us(2); // 延时2微秒
dat >>= 1; // 右移一位
if(DQ) dat |= 0x80; // 如果数据线为高,则将最高位设为1
delay_us(60); // 延时60微秒
}
return dat;
}
void DS18B20_start() // 启动DS18B20的温度转换
{
DS18B20_init(); // 初始化DS18B20
DS18B20_write_byte(0xCC); // 跳过ROM操作
DS18B20_write_byte(0x44); // 启动温度转换
}
unsigned int DS18B20_read_temp() // 读取DS18B20的温度值
{
unsigned char TL, TH;
unsigned int temp;
DS18B20_init(); // 初始化DS18B20
DS18B20_write_byte(0xCC); // 跳过ROM操作
DS18B20_write_byte(0xBE); // 读取温度值
TL = DS18B20_read_byte(); // 读取温度值低字节
TH = DS18B20_read_byte(); // 读取温度值高字节
temp = TH;
temp <<= 8; // 将高字节左移8位
temp |= TL; // 将低字节与高字节合并
return temp; // 返回温度值
}
void main()
{
unsigned int temp;
while(1)
{
DS18B20_start(); // 启动温度转换
delay_ms(750); // 延时750毫秒,保证转换完成
temp = DS18B20_read_temp(); // 读取温度值
// 将温度值显示在数码管上
// ...
}
}
```
需要注意的是,DS18B20的数据引脚需要使用外部上拉电阻,一般使用4.7kΩ的电阻即可。另外,DS18B20的数据引脚也可以直接连接到单片机的IO口,不需要使用中间件。
ds18b20 51单片机
DS18B20是一款数字温度传感器,可以通过单总线接口与51单片机进行通讯。
使用DS18B20需要注意以下几点:
1. DS18B20的引脚包括VCC、GND和DQ(数据引脚)。其中,VCC接5V电源,GND接地,DQ连接单片机的IO口。
2. DS18B20采用的是单总线通讯协议,因此需要在程序中实现相应的通讯函数。
3. DS18B20的温度数据是以16位二进制补码形式存储的,需要将其转换为实际温度值进行使用。
下面是一个简单的示例代码,用于读取DS18B20的温度数据:
```c
#include <reg52.h>
sbit DQ = P1^4; // DQ连接单片机的P1.4口
unsigned int temp; // 保存温度数据的变量
void delay(unsigned int t) // 延时函数
{
while(t--);
}
void init_ds18b20() // 初始化DS18B20
{
DQ = 1; // 置高电平,准备发送复位脉冲
delay(500); // 延时500us
DQ = 0; // 发送复位脉冲
delay(80); // 延时80us
DQ = 1; // 释放总线
delay(500); // 等待DS18B20回应
}
void write_ds18b20(unsigned char dat) // 向DS18B20写入一个字节
{
unsigned char i;
for(i=0; i<8; i++)
{
DQ = 0; // 拉低总线
DQ = dat & 0x01; // 发送数据位
delay(5); // 等待时序
DQ = 1; // 恢复总线
dat >>= 1; // 准备发送下一位数据
}
}
unsigned char read_ds18b20() // 从DS18B20读取一个字节
{
unsigned char i, dat = 0;
for(i=0; i<8; i++)
{
DQ = 0; // 拉低总线
dat >>= 1; // 准备接收数据位
if(DQ) dat |= 0x80; // 如果总线为高电平,接收数据位为1
delay(5); // 等待时序
DQ = 1; // 恢复总线
}
return dat;
}
void get_temp() // 获取温度数据
{
init_ds18b20(); // 初始化DS18B20
write_ds18b20(0xcc); // 跳过ROM操作
write_ds18b20(0x44); // 启动温度转换
delay(100); // 等待转换完成
init_ds18b20(); // 再次初始化DS18B20
write_ds18b20(0xcc); // 跳过ROM操作
write_ds18b20(0xbe); // 发送读取温度命令
temp = read_ds18b20(); // 读取温度低字节
temp |= read_ds18b20() << 8; // 读取温度高字节
}
void main()
{
while(1)
{
get_temp(); // 获取温度数据
temp >>= 4; // 将温度数据右移4位,去掉小数部分
// 进行温度转换,具体公式见DS18B20的数据手册
temp = (temp * 625) / 100;
// 将温度数据输出到LED灯
P2 = temp;
delay(1000); // 延时1秒
}
}
```
需要注意的是,以上代码仅供参考,实际使用时需要根据具体情况进行修改。同时,DS18B20的通讯协议比较复杂,需要仔细阅读其数据手册并进行实验验证。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![mp4](https://img-home.csdnimg.cn/images/20210720083504.png)