通常,LM35温度传感器与微控制器一起使用以测量温度,因为它便宜且容易获得。但是LM35提供模拟值,我们需要使用ADC(模数转换器)将其转换为数字。但是今天,我们使用的是DS18B20温度传感器,其中不需要ADC转换即可获取温度。在这里,我们将使用带有DS18B20的PIC单片机来测量温度。
因此,在这里我们使用微芯片的PIC16F877A微控制器单元构建具有以下规格的温度计。
- 它将显示从-55度到+125度的整个温度范围。
- 仅当温度变化+/- 0.2度时才显示温度。
所需组件:-
- Pic16F877A – PDIP40封装
- 面包板
- Pickit-3
- 5V适配器
- 液晶显示器JHD162A
- DS18b20温度传感器
- 连接外围设备的电线。
- 4.7k电阻器– 2个
- 1万锅
- 20mHz晶体
- 2个33pF陶瓷电容器
DS18B20温度传感器:
DS18B20是一款出色的传感器,可以准确地感测温度。该传感器在温度感应方面提供9位至12位分辨率。该传感器仅与一根电线通信,不需要任何ADC即可获取模拟温度并将其数字转换。
传感器的规格为:-
- 可测量-55°C至+ 125°C(-67°F至+ 257°F)的温度
- -10°C至+ 85°C的精度为±0.5°C
- 从9位到12位的可编程分辨率
- 无需外部组件
- 传感器使用1-Wire®接口
如果我们看一下以上数据手册中的引脚图,我们可以看到传感器的外观与BC547或BC557封装的TO-92完全相同。第一个引脚为接地,第二个引脚为DQ或数据,第三个引脚为VCC。
以下是数据表中的电气规格,这是我们设计所需要的。传感器的额定电源电压为+ 3.0V至+ 5.5V。还需要上拉电源电压,该电压与上述电源电压相同。
此外,在-10摄氏度到+85摄氏度的范围内,精度范围为+ -0.5摄氏度,对于整个范围,精度发生变化,对于-55摄氏度到+范围,精度范围为+ -2摄氏度。 125度范围。
如果再次查看数据表,我们将看到传感器的连接规格。我们可以在寄生电源模式下连接传感器,其中需要两条线,即DATA和GND,或者我们可以在需要三条单独线的情况下,使用外部电源连接传感器。我们将使用第二种配置。
现在我们已经熟悉了传感器的功率额定值以及与连接有关的区域,因此我们现在可以集中精力制作原理图。
电路原理图:-
如果我们看到电路图,我们将看到:
PIC16F877A微控制器上连接了16x2字符LCD,其中RB0,RB1,RB2连接到LCD引脚RS,R / W和E.RB4,RB5,RB6和RB7连接到LCD的4引脚D4,D5,D6, D7。LCD以4位模式或半字节模式连接。
OSC1和OSC2引脚之间连接了一个20MHz的晶体振荡器和两个33pF的陶瓷电容器。它将为微控制器提供恒定的20Mhz时钟频率。
DS18B20还按照引脚配置进行连接,并具有一个4.7k上拉电阻,如前所述。我已经将所有这些都连接到了面包板上。
如果您不熟悉PIC单片机,请按照PIC单片机入门指南中的说明操作。
步骤或代码流:-
- 设置微控制器的配置,包括振荡器配置。
- 设置LCD的所需端口(包括TRIS寄存器)。
- ds18b20传感器的每个周期都从复位开始,因此我们将复位ds18b20并等待存在脉冲。
- 编写暂存器,并将传感器的分辨率设置为12bit。
- 跳过ROM读取,后跟复位脉冲。
- 提交转换温度命令。
- 从暂存器读取温度。
- 检查温度值是负还是正。
- 在16x2 LCD上打印温度。
- 等待温度变化+/-。20摄氏度。
代码说明:
本教程末尾带有演示视频,提供了此数字温度计的完整代码。您将需要一些头文件来运行此程序,可以从此处下载该文件。
首先,我们需要在pic微控制器中设置配置位,然后从 void main 函数开始 。
然后下面四行被用于包括库头文件, lcd.h用于 和 ds18b20.h 。而 xc.h 是单片机头文件。
#包括
这些定义用于向温度传感器发送命令。这些命令在传感器的数据表中列出。
#define skip_rom 0xCC #define convert_temp 0x44 #define write_scratchpad 0x4E #define resolution_12bit 0x7F #define read_scratchpad 0xBE
传感器数据表中的此表3显示了所有命令,其中使用了宏来发送相应的命令。
仅当温度变化+/- .20度时,温度才会显示在屏幕上。我们可以从此 temp_gap 宏更改此温差。通过更改此宏的值,将更改规格。
另外两个浮点变量用于存储显示的温度数据,并与温度差区分开
#define temp_gap 20 float pre_val = 0,aft_val = 0;
。
在 void main() 函数中, lcd_init() ; 是初始化LCD的功能。从lcd.h库中调用此 lcd_init() 函数。
TRIS寄存器用于选择I / O引脚作为输入或输出。两个无符号的短变量 TempL 和 TempH 用于存储来自温度传感器的12位分辨率数据。
void main(void){TRISD = 0xFF; TRISA = 0x00; TRISB = 0x00; //TRISDbits_t.TRISD6 = 1; 无符号短TempL,TempH;无符号整数t,t2; 浮点数difference1 = 0,difference2 = 0; lcd_init();
让我们看一看while循环,这里我们将 while(1) 循环分解成小块。
这些线用于检测温度传感器是否已连接。
while(ow_reset()){lcd_com(0x80); lcd_puts(“请连接”); lcd_com(0xC0); lcd_puts(“ Temp-Sense Probe”); }
通过使用这段代码,我们初始化传感器并发送命令以转换温度。
lcd_puts(“”); ow_reset(); write_byte(write_scratchpad); write_byte(0); write_byte(0); write_byte(resolution_12bit); // 12位分辨率ow_reset(); write_byte(skip_rom); write_byte(convert_temp);
该代码用于将12位温度数据存储在两个无符号的短变量中。
而(read_byte()== 0xff); __delay_ms(500); ow_reset(); write_byte(skip_rom); write_byte(read_scratchpad); TempL = read_byte(); TempH = read_byte();
然后,如果您检查下面的完整代码,我们将创建if-else条件来找出温度符号是正还是负。
通过使用 If 语句代码,我们可以处理数据并查看温度是否为负,并确定温度变化是否在+/-.20度范围内。在 其他 部分,我们检查温度是否为正,并检测温度变化。
码
从DS18B20温度传感器获取数据:
让我们看看1-Wire®接口的时间间隔。我们正在使用20Mhz晶体。如果我们查看ds18b20.c文件,我们将看到
#定义_XTAL_FREQ 20000000
此定义用于XC8编译器延迟例程。晶体频率设置为20Mhz。
我们做了五个功能
- ow_reset
- read_bit
- read_byte
- 写位
- write_byte
的1-Wire ® 协议需要严格的定时有关的时隙进行通信。在数据表中,我们将获得与时隙相关的完美信息。
在下面的函数中,我们创建了确切的时隙。创建保持和释放的确切延迟并控制相应传感器端口的TRIS位非常重要。
无符号字符ow_reset(void){DQ_TRIS = 0; // Tris = 0(输出)DQ = 0; //将引脚号设置为低电平(0)__delay_us(480); // 1条线需要延时DQ_TRIS = 1; // Tris = 1(输入)__delay_us(60); //(DQ == 0)//如果存在存在加号,则1根线需要时间延迟{__delay_us(480); 返回0; //返回0(表示存在1-wire)} else {__delay_us(480); 返回1; //返回1(1线不存在)}} // 0 =存在,1 =无内容
现在,根据下面在读取和写入中使用的时隙说明,我们分别创建了 读取 和 写入 功能。
unsigned char read_bit(void){unsigned char i; DQ_TRIS = 1; DQ = 0; //将DQ拉低以启动时隙DQ_TRIS = 1; DQ = 1; //然后返回高(i = 0; i <3; i ++); //从时隙return(DQ)开始延迟15us;// DQ行的返回值} void write_bit(char bitval){DQ_TRIS = 0; DQ = 0; //将DQ拉低以启动时隙if(bitval == 1)DQ = 1; //如果写入1 __delay_us(5),则返回DQ高电平;//保留剩余时隙DQ_TRIS = 1的值;DQ = 1; } //延迟为每个循环提供16us,再加上24us。因此delay(5)= 104us
在此处进一步检查所有相关的头文件和.c文件。
因此,这就是我们可以使用DS18B20传感器通过PIC微控制器获取温度的方法。
如果要使用LM35构建简单的数字温度计,请在下面的项目中与其他微控制器一起使用:
- 使用Raspberry Pi进行室温测量
- 使用Arduino和LM35的数字温度计
- 使用LM35和8051的数字温度计
- 使用LM35和AVR单片机进行温度测量