c51单片机和DS18B20温度传感器

前言

温度传感器在现代电子领域中起着至关重要的作用,它能够将温度这一物理量转换成电信号进行测量和监控。 在51单片机系统中,通过合适的温度传感器模块,我们可以实现对环境温度的检测和控制,为各类应用提供稳定的工作环境保障。

目录

一、选择使用的温度传感器型号

二、使用温度传感器具体步骤

三、温度传感器特点

一、选择使用的温度传感器型号

对于C51单片机与电机温度传感器的连接,首先需要明确你使用的温度传感器型号。这里以常用的DS18B20温度传感器为例,给出一种可能的连接方式:
(1)连接DS18B20的VCC和GND到单片机的5V和GND。
(2)将DS18B20的DQ引脚连接到单片机的某个GPIO口,例如P1^0。
(3)编写C51单片机程序,通过GPIO口控制DS18B20进行温度测量。

二、使用温度传感器具体步骤


使用具体步骤如下:
(1)复位DS18B20:通过单片机向DS18B20发送复位脉冲,将DQ引脚拉低并保持一段时间,然后释放DQ引脚。
(2)匹配序列号:如果总线上有多个DS18B20,需要发送ROM指令0x55,匹配每个DS18B20独有的64位序列号。如果总线上只有一个DS18B20,可以直接发送ROM指令0xcc跳过序列号匹配。
(3)发送RAM指令:向DS18B20发送RAM指令0x44,启动DS18B20进行温度测量。
(4)等待温度测量完成:等待一段时间,直到DS18B20完成温度测量。
(5)读取温度数据:向DS18B20发送读RAM指令0xBE,然后从DQ引脚读取温度数据。
(6)计算温度值:根据读取的温度数据计算实际温度值。


需要注意的是,具体的实现方式可能因单片机的型号和编程语言而有所不同。同时,DS18B20需要供电才能工作,如果单片机没有足够的电源,可能还需要额外供电。此外,对于不同的电机型号和工作环境,可能还需要选择不同类型的温度传感器。 

三、温度传感器特点

DS18B20 是由 DALLAS 半导体公司推出的一种的“一线总线(单总线)”接口的温度传感器。与传统的热敏电阻等测温元件相比,它是一种新型的体积小、适用电压宽、与微处理器接口简单的数字化温度传感器。

特点:
1、适应电压范围更宽,电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电。
2、独特的单线接口方式,DS18B20 在与微处理器连接时仅需要一条口线即可实现微处理器与 DS18B20 的双向通讯。
3、DS18B20 支持多点组网功能,多个 DS18B20 可以并联在唯一的三线上,实现组网多点测温。
4、DS18B20 在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内。
5、温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃
6、可编程的分辨率为 9~12 位,对应的可分辨温度分别为 0.5℃、0.25℃、0.125℃ 和 0.0625℃,可实现高精度测温。
7、在 9 位分辨率时最多在 93.75ms 内把温度转换为数字,12 位分辨率时最多在 750ms 内把温度值转换为数字,速度更快。
8、测量结果直接输出数字温度信号,以"一根总线"串行传送给 CPU,同时可传送 CRC 校验码,具有极强的抗干扰纠错能力。
9、负压特性:电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。

外部实物图:

从 DS18B20 外观图可以看到,当我们正对传感器切面(传感器型号字符那一面)时,传感器的管脚顺序是从左到右排列。管脚 1 为 GND,管脚 2 为数据DQ,管脚 3 为 VDD。
如果把传感器插反,那么电源将短路,传感器就会发烫,很容易损坏,所以一定要注意传感器方向。

内部结构图:

 ROM 中的 64 位序列号是出厂前被光刻好的,它可以看作是该 DS18B20 的地址序列号。光刻 ROM 的作用是使每一个 DS18B20 都各不相同,这样就可以实现一根总线上挂接多个 DS18B20 的目的。
DS18B20 温度传感器的内部存储器包括一个高速的暂存器 RAM 和一个非易失性的可电擦除的 EEPROM,后者存放高温度和低温度触发器 TH、TL 和配置寄存器。

配置寄存器结构:

 配置寄存器是配置不同的位数来确定温度和数字的转化,低五位一直都是"1",TM 是测试模式位,用于设置 DS18B20 在工作模式还是在测试模式。在 DS18B20 出厂时该位被设置为 0,用户不需要去改动。R1 和
R0 用来设置 DS18B20 的精度(分辨率),可设置为 9,10,11 或 12 位,对应的分辨率温度是 0.5℃,0.25℃,0.125℃和 0.0625℃。在初始状态下默认的精度是 12 位,即 R0=1、 R1=1。

四、代码

以下是使用Keil编写的DS18B20温度传感器的单片机代码及注释:

#include <reg52.h>  
  
sbit DQ = P1^0; //定义DQ引脚  
  
void delay(unsigned int i) //延时函数  
{  
    while(i--);  
}  
  
void reset() //复位函数  
{  
    DQ = 0;  
    delay(5); //延时5ms  
    DQ = 1;  
}  
  
unsigned char read_byte() //读取一个字节数据  
{  
    unsigned char i, data = 0;  
    for(i=0; i<8; i++) //循环8次,每次读取一位数据  
    {  
        DQ = 0; //拉低数据线  
        delay(5); //延时,保证数据稳定传输  
        DQ = 1; //拉高数据线,准备读取下一位数据  
        data <<= 1; //左移一位,准备存储数据  
        if(DQ) data |= 0x01; //如果DQ为高电平,则将最低位设置为1  
    }  
    return data;  
}  
  
void main()   
{  
    unsigned char temperature;  
    reset(); //复位DS18B20  
    delay(10); //延时,等待DS18B20响应复位脉冲  
    DQ = 0; //拉低数据线,匹配序列号(如果总线上只有一个DS18B20,可以跳过此步骤)  
    delay(40); //延时,等待DS18B20响应匹配序列号  
    DQ = 1; //释放数据线,发送ROM指令0xcc(如果总线上只有一个DS18B20)或RAM指令0x44(如果总线上有多个DS18B20)  
    delay(10); //延时,等待DS18B20响应指令  
    temperature = read_byte(); //读取温度数据的高字节  
    delay(50); //延时,等待DS18B20完成温度测量  
    temperature <<= 8; //左移8位,准备存储温度数据的低字节  
    temperature |= read_byte(); //读取温度数据的低字节  
    //根据读取的温度数据计算实际温度值,并进行相应的处理(例如控制电机的工作状态)  
}

  • 49
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是基于C51单片机DS18B20温度传感器完整代码及注释: ```c #include<reg52.h> // 引入51单片机头文件 #include<intrins.h> typedef unsigned char uchar; typedef unsigned int uint; sbit DQ=P2^0; // DS18B20温度传感器数据线连接的单片机IO口 uchar code table[]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67, // 共阴极数码管显示0~9 0x77,0x7c,0x39,0x5e,0x79,0x71 }; // 数码管显示字符的编码 void delay_us(uint i) // 延时us { while(i--); } void delay_ms(uint i) // 延时ms { uchar j; while(i--) { for(j=0;j<110;j++); } } uchar ds18b20_init() // 初始化DS18B20 { uchar i; DQ=1; delay_us(15); DQ=0; delay_us(500); DQ=1; delay_us(30); i=DQ; // 判断DS18B20是否存在 delay_us(500); return i; } void ds18b20_write_byte(uchar dat) // 向DS18B20写入一个字节 { uchar i,j; for(j=0;j<8;j++) { i=dat&0x01; dat>>=1; if(i) DQ=1; else DQ=0; delay_us(15); DQ=1; _nop_(); _nop_(); } } uchar ds18b20_read_byte() // 从DS18B20读取一个字节 { uchar i,j,dat=0; for(j=0;j<8;j++) { DQ=0; _nop_(); _nop_(); i=DQ; delay_us(15); dat=(dat>>1)|(i<<7); DQ=1; } return dat; } void ds18b20_changtemp() // 让DS18B20开始转换温度 { ds18b20_init(); ds18b20_write_byte(0xcc); ds18b20_write_byte(0x44); } void ds18b20_readtemp(uchar *temp) // 读取DS18B20转换后的温度值 { uchar a,b; ds18b20_init(); ds18b20_write_byte(0xcc); ds18b20_write_byte(0xbe); a=ds18b20_read_byte(); b=ds18b20_read_byte(); *temp=b; *temp<<=8; *temp=*temp|a; } void main() { uchar temp; // 存储温度值 uchar shi,ge; // 存储温度值的十位和个位 while(1) { ds18b20_changtemp(); // 开始转换温度 delay_ms(500); // 等待转换完成 ds18b20_readtemp(&temp); // 读取温度值 shi=temp/10; // 计算十位 ge=temp%10; // 计算个位 P1=table[shi]; // 在数码管上显示十位 P0=table[ge]; // 在数码管上显示个位 } } ``` 代码注释: ```c #include<reg52.h> // 引入51单片机头文件 #include<intrins.h> typedef unsigned char uchar; // 定义无符号字符型变量 typedef unsigned int uint; // 定义无符号整型变量 sbit DQ=P2^0; // DS18B20温度传感器数据线连接的单片机IO口 uchar code table[]={ // 数码管显示字符的编码,共阴极数码管显示0~9 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67, 0x77,0x7c,0x39,0x5e,0x79,0x71 }; void delay_us(uint i) // 延时us { while(i--); } void delay_ms(uint i) // 延时ms { uchar j; while(i--) { for(j=0;j<110;j++); } } uchar ds18b20_init() // 初始化DS18B20 { uchar i; DQ=1; // 数据线置高 delay_us(15); DQ=0; // 拉低数据线 delay_us(500); // 延时,保持低电平 DQ=1; // 释放数据线 delay_us(30); i=DQ; // 判断DS18B20是否存在 delay_us(500); return i; } void ds18b20_write_byte(uchar dat) // 向DS18B20写入一个字节 { uchar i,j; for(j=0;j<8;j++) { i=dat&0x01; // 取最低位 dat>>=1; // 依次取下一位 if(i) DQ=1; // 写1 else DQ=0; // 写0 delay_us(15); // 等待15us DQ=1; // 释放数据线 _nop_(); // 空操作,延时1us _nop_(); } } uchar ds18b20_read_byte() // 从DS18B20读取一个字节 { uchar i,j,dat=0; for(j=0;j<8;j++) { DQ=0; // 拉低数据线 _nop_(); _nop_(); i=DQ; // 读取数据 delay_us(15); // 等待15us dat=(dat>>1)|(i<<7); // 将读取到的数据存入dat DQ=1; // 释放数据线 } return dat; } void ds18b20_changtemp() // 让DS18B20开始转换温度 { ds18b20_init(); // 初始化DS18B20 ds18b20_write_byte(0xcc); // 跳过ROM操作,直接向DS18B20写指令 ds18b20_write_byte(0x44); // 写转换指令 } void ds18b20_readtemp(uchar *temp) // 读取DS18B20转换后的温度值 { uchar a,b; ds18b20_init(); // 初始化DS18B20 ds18b20_write_byte(0xcc); // 跳过ROM操作,直接向DS18B20写指令 ds18b20_write_byte(0xbe); // 读取温度指令 a=ds18b20_read_byte(); // 读取温度低8位 b=ds18b20_read_byte(); // 读取温度高8位 *temp=b; // 将温度高8位存入temp *temp<<=8; // 左移8位 *temp=*temp|a; // 将温度低8位存入temp } void main() { uchar temp; // 存储温度值 uchar shi,ge; // 存储温度值的十位和个位 while(1) { ds18b20_changtemp(); // 开始转换温度 delay_ms(500); // 等待转换完成 ds18b20_readtemp(&temp); // 读取温度值 shi=temp/10; // 计算十位 ge=temp%10; // 计算个位 P1=table[shi]; // 在数码管上显示十位 P0=table[ge]; // 在数码管上显示个位 } } ``` 以上代码实现了DS18B20温度传感器的读取和数码管的显示。在使用之前,需要将DS18B20连接到单片机的IO口,并在代码中修改对应的IO口。同时,需要根据实际情况调整代码中的延时参数,以保证DS18B20的正常工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值