一. 系统简介
该系统是基于51单片机的温度监测报警系统。由主控模块、检测模块、显示模块以及报警模块四大模块组成。主控模块使用STC89C52实验板,检测模块采用DS18B20的温度传感器监测环境温度,并将监测到的温度值传送给显示模块的LCD1602显示屏进行显示,而当温度超过设定的上限或低于设定的下限值时,控制报警模块的LED发光二极管显示并通过蜂鸣器发出警告。四大模块协同工作,主要实现对温度的检测、显示以及报警功能。
二. 系统设计
- 系统流程图
- 温度上下限设置流程图
- 硬件原理总体框图
- 硬件模块电路分析
4.1 数据处理模块
89C52是片内有ROM/EPROM的单片机,故此芯片构成的最小系统简单可靠。但由于集成度的限制,最小应用系统只能用作一些小型的控制单元。
4.2 DS18B20温度监测模块
采用可编程温度传感器DS18B20进行温度检测,具有抗干扰能力强、采集进度高、不需要复杂调理电路和AD转换电路等特点,只要将DS18B20的I/O口直接与单片机的P37口相连即可实现温度的读取。
4.3 LCD温度显示模块
采用LCD1602液晶显示器将温度传感器读取的温度值显示出来,具有体积小、功耗低、显示操作简单等特点,但温度范围窄,工作温度为0-55°C,存储温度为-20~+60°C。
4.4 蜂鸣器温度报警模块
采用开发板上的无源蜂鸣器实现温度报警,单输出一个电平是不能控制使其发声的,须通过一定频率的脉冲来触发,才能使其发声。
4.5按键设置阈值及模式切换模块
温度上下限的设定以及模式切换通过独立按键来实现,首次按下K3,即进入修改状态,此时在上限处会出现 “ * ”,表示该值处于被更改状态,然后可通过K1、K2分别实现对温度上限的上调和下调;再次按下K3,即确定上限值已修改完毕,“ * ” 将移动到下限值处,同理可通过K1、K2实现对温度下限值的上调和下调;第三次按下K3即上下限修改完成;K4即对模式的切换。
三. 实验设备
- 51单片机(包括DS18B20、蜂鸣器)
- LCD1602
- WiFi烧录器
- WiFi模块
- 移动终端
- 串口通信总线
四. 实验过程
- 了解元器件的工作原理并找到通信引脚;
1)DS18B20
遵循单总线协议,每次测温必须有初始化、传送ROM命令、传送RAM命令、数据交换四个过程。每次测量前,首先将-55°C所对应的基数分别置入减法计数器、温度寄存器中,在计数门关闭前若已减至0,则温度寄存器中的数组就增加,然后计数器以斜率累加器的状态置入新的数值,再对时钟计数,然后减至0,温度寄存器又增加。只要计数器仍未关闭则重复以上过程,直至温度寄存器达到被测温度值。
2)LCD1602
RS为数据/命令选择端,RW为读/写选择端,EN为使能端;根据字符发生器中字符代码与图形的对应关系,可以将对应的字符显示出来。该器件的基本操作时序,如下表:
输入 | 输出 | |
---|---|---|
读状态 | RS=0,RW=1,EN=1 | D0~D7=状态字 |
写指令 | RS=0,RW=0,D0~D7=指令码,EN=高脉冲 | 无 |
读数据 | RS=1,RW=1,EN=1 | D0~D7=数据 |
写数据 | RS=1,RW=0,D0~D7=数据,EN=高脉冲 | 无 |
原则上每次对控制器进行读写操作前,都必须进行读写检测,确保STA7=0,实际上,由于单片机的操作速度慢于液晶控制器的反应速度,故只需进行简短的延时即可。
3)蜂鸣器
开发板采用无源蜂鸣器,通过一个限流电阻与VCC相连,另一个管脚与ULN2003D芯片(NPN达林顿管)上的P15接口相连。也就是说,BEEP管脚是通过单片机P15接口,经过ULN2003D驱动芯片输出到蜂鸣器中,而ULN2003D芯片则起到电流放大的作用——单片机的P15端口输出一个高电平,则NPN三极管处于导通状态,于是蜂鸣器得电从而发声。
4)独立按键
四个按键的一端全部供地。默认状态下(按键未按下时),按键的各个管脚并非完全导通;按下按键后,相应的单片机端口都会被拉低(因为P3口是准双向IO口)。并且按键在闭合和断开时,触电会存在抖动现象,可通过软件消抖的方法解决即延时待其稳定后,再次判断按键是否被按下。
- 按照需要连接各器件;
- 根据各器件的工作原理编写程序来实现相应的控制功能;
部分源码如下:
#include "reg52.h"
sbit keyu=P3^1; //按键加
sbit keyl=P3^0; //按键减
sbit keyh=P3^2; //按键选择调节温度上下限
sbit keym=P3^3; //按键切换模式
sbit RS=P2^6; //LCD数据/命令选择端
sbit RW=P2^5; //LCD读/写端
sbit EN=P2^7; //LCD使能端
sbit DQ=P3^7; //DS18B20接入口
sbit buzz=P1^5; //蜂鸣器接口 -
bit f=1; //正负温度标志位
unsigned char m=1,y=0,o=0; //寄存器
unsigned int sdata; //存放整数温度
unsigned char xiaoshu1; //存放小数后第一位温度数值
unsigned char xiaoshu2; //存放小数后第二位温度数值
unsigned char code huany[]=" Welcome To Use "; //欢迎使用
unsigned char code tt[] =" TEMP Monitoring"; //温度监测
unsigned char code duqu[]=" loading... "; //读取
unsigned char code tab1[]=" T: C M "; //框架
unsigned char code tab2[]="H: L: ";
unsigned char code shuzu[]="0123456789+- .*"; //0123456789+-空格.*
unsigned char u=40; //上限
char l=15,p; //下限
void delay_50us(unsigned int t)//延时
{
unsigned int j,k;
for (;t>0;t--)
{
for(j=10;j>0;j--)
{
for(k=1;k>0;k--);
}
}
}
void delay(unsigned int i)//全局延时
{
while(i--);
}
void button()//蜂鸣器
{
unsigned char k=800;
while(k--)
{
buzz=~buzz;
delay(115);
}
}
/***************LCD****************/
void write_com(unsigned com)//写操作
{
EN=0;RS=0;RW=0;
P0=com;
delay_50us(1);
EN=1;
delay_50us(5);
EN=0;
}
void write_data(unsigned char dat)//写数据
{
EN=0;RS=1;RW=0;
P0=dat;
delay_50us(1);
EN=1;
delay_50us(5);
EN=0;
}
void Init_LCD(void)//初始化
{
delay_50us(5);
write_com(0x38);//写指令38H 不检测忙信号
delay_50us(1