51单片机加ds18b20多路测温通过匹配rom来
时间: 2023-05-31 20:03:45 浏览: 108
实现
在51单片机中使用DS18B20多路测温,需要通过匹配ROM来实现。具体步骤如下:
1. 初始化DS18B20:在51单片机中,需要通过设定数据口和控制口的引脚来初始化DS18B20,同时也需要设置其工作模式。
2. 搜索DS18B20:在多路测温中,需要搜索所有连接的DS18B20设备。这可以通过发送搜索命令来实现。搜索命令会扫描总线上的所有设备,并返回每个设备的ROM编号。
3. 匹配ROM编号:在搜索到所有设备的ROM编号后,需要通过匹配ROM编号来确定每个设备的位置。这可以通过将每个设备的ROM编号与已知的设备ROM编号进行比较来实现。
4. 读取温度值:一旦确定了每个设备的位置,就可以通过发送温度转换命令来读取每个设备的温度值。这些温度值可以存储在一个数组中,以便稍后使用。
5. 处理温度值:最后,可以使用读取到的温度值来执行任何必要的操作,例如显示温度或控制其他设备。
需要注意的是,DS18B20是一种数字温度传感器,其数据线需要连接到8051单片机的IO口,而且要注意DS18B20的供电电压为3.3V~5V。在使用DS18B20时,需要注意正确的引脚连接和工作模式设置,以确保正常工作。
相关问题
基于51单片机+DS18B20温度测温器将温度在LCD1602显示代码
下面是基于51单片机和DS18B20温度传感器的温度测量和LCD1602显示的代码:
```c
#include <reg52.h>
#include <intrins.h>
#define DQ P2_0 // DS18B20数据线连接到单片机的P2.0口
#define LCD P0 // LCD1602数据线连接到单片机的P0口
sbit rs = P3^5; // LCD1602的RS引脚连接到单片机的P3.5口
sbit rw = P3^6; // LCD1602的RW引脚连接到单片机的P3.6口
sbit en = P3^7; // LCD1602的EN引脚连接到单片机的P3.7口
typedef unsigned char uchar;
typedef unsigned int uint;
uchar code table[] = "Temperature:"; // 温度显示的字符串
void delay(uint x) // 短暂延时函数
{
uint i, j;
for (i = x; i > 0; i--)
for (j = 110; j > 0; j--);
}
void init_ds18b20() // 初始化DS18B20
{
uchar i;
DQ = 1;
delay(1);
DQ = 0;
delay(80);
DQ = 1;
delay(20);
i = DQ;
delay(20);
}
void write_ds18b20(uchar dat) // 向DS18B20写入一个字节的数据
{
uchar i;
for (i = 0; i < 8; i++) {
DQ = 0;
_nop_();
DQ = dat & 0x01;
delay(6);
DQ = 1;
dat >>= 1;
}
}
uchar read_ds18b20() // 从DS18B20读取一个字节的数据
{
uchar i, dat = 0;
for (i = 0; i < 8; i++) {
dat >>= 1;
DQ = 0;
_nop_();
DQ = 1;
delay(1);
if (DQ) dat |= 0x80;
delay(6);
}
return dat;
}
int get_temperature() // 获取温度数据
{
uchar i;
int temp = 0;
init_ds18b20();
write_ds18b20(0xcc); // 跳过ROM操作
write_ds18b20(0x44); // 启动温度转换
delay(100);
init_ds18b20();
write_ds18b20(0xcc);
write_ds18b20(0xbe); // 读取温度数据
temp |= read_ds18b20();
temp |= (read_ds18b20() << 8);
return temp;
}
void write_lcd1602(uchar dat, uchar cmd) // 向LCD1602写入一个字节的数据或指令
{
rw = 0;
LCD = cmd;
rs = 0;
en = 1;
_nop_();
en = 0;
delay(5);
rs = 1;
LCD = dat;
en = 1;
_nop_();
en = 0;
delay(5);
}
void init_lcd1602() // 初始化LCD1602
{
write_lcd1602(0x38, 0);
write_lcd1602(0x0c, 0);
write_lcd1602(0x06, 0);
write_lcd1602(0x01, 0);
}
void main()
{
int temp;
uchar i;
init_lcd1602();
while (1) {
temp = get_temperature();
write_lcd1602(0x80, 0); // 设置光标位置为第一行第一列
for (i = 0; i < 12; i++) // 显示温度字符串
write_lcd1602(table[i], 1);
write_lcd1602((temp >> 8) + '0', 1); // 显示温度的高八位
write_lcd1602((temp & 0xff) / 10 + '0', 1); // 显示温度的低八位的十位
write_lcd1602((temp & 0xff) % 10 + '0', 1); // 显示温度的低八位的个位
delay(500); // 延时一段时间再进行下一次温度测量和显示
}
}
```
这段代码通过DS18B20温度传感器获取温度数据,然后通过LCD1602显示器显示温度数据。在主函数中,我们不断循环获取温度数据并进行显示。需要注意的是,DS18B20的数据线连接到单片机的P2.0口,而LCD1602的数据线连接到单片机的P0口。在代码中使用了一些简单的函数来实现DS18B20的读写和LCD1602的初始化和写入数据。
51单片机ds18b20测温程序
以下是基于51单片机的DS18B20测温程序:
```c
#include<reg51.h>
#include<intrins.h>
#define DQ P1_0 //定义DS18B20数据线所连接的单片机IO口
void delay_us(unsigned char t) //延时函数
{
while(t--)
{
_nop_();
}
}
void delay_ms(unsigned char t) //延时函数
{
while(t--)
{
delay_us(1000);
}
}
unsigned char init_ds18b20() //DS18B20初始化函数
{
unsigned char flag = 0;
DQ = 1; //先将数据线置高
delay_us(1);
DQ = 0; //将数据线拉低
delay_us(500); //延时480us~960us
DQ = 1; //将数据线拉高
delay_us(60); //延时60us~240us
flag = DQ; //读取DS18B20的应答信号
delay_us(420); //延时完毕
return flag; //返回应答信号
}
void write_ds18b20(unsigned char dat) //DS18B20写数据函数
{
unsigned char i;
for(i=0; i<8; i++)
{
DQ = 0; //将数据线拉低
delay_us(2); //延时2us
DQ = dat&0x01; //写入数据
delay_us(60); //延时60us
DQ = 1; //将数据线拉高
dat >>= 1;
delay_us(2); //延时2us
}
}
unsigned char read_ds18b20() //DS18B20读数据函数
{
unsigned char i,dat=0;
for(i=0; i<8; i++)
{
DQ = 0; //将数据线拉低
delay_us(2); //延时2us
DQ = 1; //将数据线拉高
delay_us(2); //延时2us
dat |= DQ<<i; //读取数据
delay_us(60); //延时60us
}
return dat;
}
void main()
{
unsigned char temp_high,temp_low;
int temp;
while(1)
{
if(init_ds18b20()) //DS18B20初始化
{
write_ds18b20(0xcc); //跳过ROM操作
write_ds18b20(0x44); //温度转换命令
delay_ms(750); //延时750ms
init_ds18b20(); //DS18B20初始化
write_ds18b20(0xcc); //跳过ROM操作
write_ds18b20(0xbe); //读取温度命令
temp_low = read_ds18b20(); //读取温度低八位
temp_high = read_ds18b20(); //读取温度高八位
temp = temp_high<<8|temp_low; //将温度值合成
temp = temp*0.0625*10; //将温度值转换为十进制数
//此处可将温度值通过串口或LCD显示出来
}
}
}
```
在上面的程序中,我们定义了DS18B20的IO口为P1_0,使用了51单片机的延时函数来实现精确的延时。在主函数中,我们不断进行温度测量,通过串口或LCD显示出温度值即可。需要注意的是,DS18B20的温度转换需要750ms的时间,因此在进行温度转换时需要延时足够的时间。
阅读全文