系统的功能分析
(附文件)
系统功能分析
本设计由STC89C52单片机电路+1602液晶显示电路+MLX90614ESF红外非接触温度检测电路+按键电路+蜂鸣器报警电路。
1、液晶实时显示MLX90614ESF检测的环境温度值和被测物体温度值,显示中E环境温度,O物体温度。
2、可以通过按键设置温度的阈值,如果MLX90614检测到的温度高于设置的阈值,则蜂鸣器报警,否则,蜂鸣器不报警。
系统总体结构
本系统具体框图如下图所示:
原理图:
STC89C52单片机核心系统电路设计
STC89C52RC是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K字节系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,但是做了很多的改进使得芯片具有传统51单片机不具备的功能。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。具有以下标准功能:8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,3个16 位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。另外 STC89C52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35MHz,6T/12T可选。
STC89C52单片机最小系统电路由复位电路、时钟电路和电源电路。拥有这三部分电路后,单片机即可正常工作。单片机最小系统原理图如下图所示。
5V电源电路设计
本系统选择5V直流电源作为系统总电源,为整个系统供电,电路简单、稳定。DC为电源的DC插座,可以直接接USB电源线,一端插在DC插座上,另外一端可以插在5V电源上,如电脑USB、充电宝、手机充电器等等。LED为红色LED灯,作为系统是否有点的指示灯,电阻为1K电阻,起到限流作用,保护LED灯,以防电流过大烧坏LED灯。SW为自锁开关,开关按下后,红灯亮,此时系统电源5V直流输出。开关再次按下后,红灯灭,此时系统电源无5V电源输出。
GY-906 MLX90614ESF非接触式红外测温模块电路设计
MLX90614是一款非接触式温度测量的红外温度计。 TO-39封装内集成了对红外灵敏的热电堆探测器芯片和信号处理ASSP(专用集成电路)芯片。
由于集成了低噪声放大器,17位ADC和强大的DSP单元,使得高精度的温度计得以实现。温度计出厂设置为数字SMBus输出,在整个温度测量范围内的分辨率为0.02℃。
用户可以将输出配置为PWM格式。作为标准,将PWM格式配置成10位来连续传送测量温度。测量温度范围为-20…120℃,分辨率是0.14℃。本传感器体积小,成本低,易集成。
系统软件设计
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<stdio.h>
#include<intrins.h>
#include "delay.h"
#include "1602.h"
#include "mlx90614.h"
sbit buzzer=P1^0; //引脚定义
sbit key1=P2^0;
sbit key2=P2^1;
unsigned long time_20ms; //定时计数
char dis0[16]; //液晶数组显示暂存
char dis1[16];
unsigned int setNum = 37; //设置值
//---------------------------------------
//Name: CALTEMP
//Temperature data is T=(Data)*0.02-273.15
//---------------------------------------
bit rekey =0;//防止按键重复按下
bit disFlag =0;//更新显示标志
unsigned int Tem; //温度
float objTemp,envTemp; //物体温度和环境温度
void Init_Timer0(void); //函数声明
void main (void)
{
Init_Timer0(); //定时器0初始化
LCD_Init(); //初始化液晶
DelayMs(20); //延时有助于稳定
LCD_Clear();
while (1) //主循环
{
if(disFlag==1) //显示标志
{
Tem=ReadObjectTemp(); //读取实物温度
objTemp=(float)(Tem)*0.02-273.15;
Tem=ReadEnvironTemp(); //读取环境温度
envTemp=(float)(Tem)*0.02-273.15;
sprintf(dis0,"E: %4.1f'C ",envTemp);//打印温度值
LCD_Write_String(0,0,dis0);//显示
sprintf(dis1,"O:%5.1f'C %3d ",objTemp,setNum);//打印温度设置值
LCD_Write_String(0,1,dis1);//显示
if(objTemp>setNum)
{buzzer =0; } //温度高蜂鸣器鸣叫
else
{buzzer=1;} //温度低 停止
disFlag = 0;
}
if((key1 == 0)||(key2 == 0)) //有按键按下
{
if(rekey == 0)
{
DelayMs(10);
if(key1 == 0) //按键1按下
{
rekey =1; //防止重复按下
if(setNum<200) setNum++; //++
}
else if((key2 == 0))//按键2按下
{
rekey =1; //防止重复按下
if(setNum>0) setNum--; //--
}
}
}
else
{
rekey = 0; //防止重复按下
}
}
}
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH0=(65536-20000)/256; //重新赋值 20ms
TL0=(65536-20000)%256;
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
void Timer0_isr(void) interrupt 1
{
TH0=(65536-20000)/256; //重新赋值 20ms
TL0=(65536-20000)%256;
time_20ms++;
if(time_20ms%20==0) //定时更新显示
{disFlag = 1;}
}
.
链接:https://pan.baidu.com/s/1kBEZQXSYoqjkmm7ENmfTDQ
提取码:ejvs
.