以51单片机为核心器件,以DS18B20数字芯片为传感器件,设计一个数字温度计;系统应能在上位机串口助手软件接收窗口上湿度、温度信息;显示精度自定义。
时间: 2024-01-21 08:19:24 浏览: 203
首先,需要连接51单片机和DS18B20数字温度传感器。DS18B20是一款数字式温度传感器,它可以通过单总线接口与单片机进行通信。具体连接方式如下:
DS18B20的VCC引脚连接到单片机的5V电源,GND引脚连接到单片机的GND引脚,DQ引脚连接到单片机的任意一个IO口。
接下来,需要编写单片机的程序。程序主要分为三个部分:初始化DS18B20传感器、读取温度数据并发送给上位机、通过串口助手软件接收指令并设置显示精度。
初始化DS18B20传感器的程序如下:
```c
#include "reg52.h"
#include "delay.h"
sbit DQ=P2^7; //单总线接口引脚定义
void ds18b20_init()
{
DQ=1; //DQ引脚输出高电平
delay_us(10);
DQ=0; //发送复位信号
delay_us(500);
DQ=1; //释放总线
delay_us(60);
if(DQ==0) //等待DS18B20响应信号
{
delay_us(500);
DQ=1;
}
}
```
读取温度数据并发送给上位机的程序如下:
```c
void ds18b20_read()
{
unsigned char i=0;
unsigned char temp=0;
unsigned char high,low;
DQ=1; //DQ引脚输出高电平
delay_us(1);
DQ=0; //发送读取命令
delay_us(1);
DQ=1; //释放总线
delay_us(1);
while(DQ); //等待DS18B20响应信号
delay_us(1);
for(i=0;i<8;i++) //读取高八位数据
{
DQ=0;
delay_us(1);
DQ=1;
delay_us(1);
temp>>=1;
if(DQ) temp|=0x80;
delay_us(4);
}
high=temp;
temp=0;
for(i=0;i<8;i++) //读取低八位数据
{
DQ=0;
delay_us(1);
DQ=1;
delay_us(1);
temp>>=1;
if(DQ) temp|=0x80;
delay_us(4);
}
low=temp;
//计算温度值
temp=((high<<8)+low)*0.0625;
//将温度值发送给上位机
SBUF=temp;
while(TI==0);
TI=0;
}
```
通过串口助手软件接收指令并设置显示精度的程序如下:
```c
void set_precision()
{
unsigned char precision=0;
while(!RI); //等待接收到上位机发送的精度值
precision=SBUF;
RI=0;
//根据精度值设置显示精度
switch(precision)
{
case '1':
//设置显示精度为0.1度
break;
case '2':
//设置显示精度为0.01度
break;
case '3':
//设置显示精度为0.001度
break;
default:
//默认显示精度为0.1度
break;
}
}
```
完整的程序如下:
```c
#include "reg52.h"
#include "delay.h"
sbit DQ=P2^7; //单总线接口引脚定义
void ds18b20_init()
{
DQ=1; //DQ引脚输出高电平
delay_us(10);
DQ=0; //发送复位信号
delay_us(500);
DQ=1; //释放总线
delay_us(60);
if(DQ==0) //等待DS18B20响应信号
{
delay_us(500);
DQ=1;
}
}
void ds18b20_read()
{
unsigned char i=0;
unsigned char temp=0;
unsigned char high,low;
DQ=1; //DQ引脚输出高电平
delay_us(1);
DQ=0; //发送读取命令
delay_us(1);
DQ=1; //释放总线
delay_us(1);
while(DQ); //等待DS18B20响应信号
delay_us(1);
for(i=0;i<8;i++) //读取高八位数据
{
DQ=0;
delay_us(1);
DQ=1;
delay_us(1);
temp>>=1;
if(DQ) temp|=0x80;
delay_us(4);
}
high=temp;
temp=0;
for(i=0;i<8;i++) //读取低八位数据
{
DQ=0;
delay_us(1);
DQ=1;
delay_us(1);
temp>>=1;
if(DQ) temp|=0x80;
delay_us(4);
}
low=temp;
//计算温度值
temp=((high<<8)+low)*0.0625;
//将温度值发送给上位机
SBUF=temp;
while(TI==0);
TI=0;
}
void set_precision()
{
unsigned char precision=0;
while(!RI); //等待接收到上位机发送的精度值
precision=SBUF;
RI=0;
//根据精度值设置显示精度
switch(precision)
{
case '1':
//设置显示精度为0.1度
break;
case '2':
//设置显示精度为0.01度
break;
case '3':
//设置显示精度为0.001度
break;
default:
//默认显示精度为0.1度
break;
}
}
void main()
{
TMOD=0x20; //定时器1为模式2,8位自动重装载
TH1=0xfd; //波特率9600,定时器初值
TL1=0xfd; //波特率9600,定时器初值
TR1=1; //启动定时器1
SM0=0;
SM1=1; //串口工作方式为模式1,10位异步收发
REN=1; //允许串口接收
while(1)
{
ds18b20_init(); //初始化DS18B20传感器
ds18b20_read(); //读取温度数据并发送给上位机
set_precision(); //通过串口助手软件接收指令并设置显示精度
}
}
```
在上位机串口助手软件中,可以通过发送字符来设置显示精度。比如发送字符'1',表示设置显示精度为0.1度。同时,上位机也可以接收到单片机发送的温度数据。
以上就是基于51单片机和DS18B20数字温度传感器设计的数字温度计系统的实现过程。
阅读全文