【毕业设计】12-基于单片机的电子体温计(原理图工程+源码工程+仿真工程+答辩论文)
文章目录
- 【毕业设计】12-基于单片机的电子体温计(原理图工程+源码工程+仿真工程+答辩论文)
- 任务书
- 设计说明书
- 摘要
- 设计框架架构
- 设计说明书及设计文件
- 源码展示
任务书
主要研究内容
采用单片机作为控制器、结合温度传感器、A/D转换器、显示芯片等外围元件设计出一个智能温度计系统,使其实现系统的温度的采集、显示、超温报警等功能。
1、根据智能温度计的功能要求,提出系统总体结构;
2、对系统进行硬件设计、软件设计;
3、制作实物。
研究方法:
阅读大量智能楼宇消防监控系统的相关文献资料,掌握其技术的原理和电路的结构,理解程序实现的核心思想;积累相关资料确定论文的主体内容,重点进行研究;
资料链接
原理图工程文件
源码工程文件
实物图片
答辩论文,
论文低重复率。字数22922
BOM表
实物操作视频
元器件相关资料
设计说明书
摘要
传统的额温枪是通过水银温度计来测试系统,水银温度计在应用过程中十分复杂,并且需要等待很久时间,不能及时得出测试结果.本文针对此现象设计出一款基于单片机的电子体温计,通过电子式的传感器来对数据进行读取。使用的单片机为STC89C51、MLX90614温度传感器、蜂鸣器、液晶显示器组成,将检测到的数据直接将检测到的温度显示在屏幕中,实时的显示当前的体温数据。为系统实现的功能有测量体温设置报警阈值。系统由硬件软件两部分组成。通过电路设计、程序编写,最终制作实物对实物进行测试,验证了本次系统设计功能。设计过程中充分考虑到系综合系统的性价比,保证在生产过程中有着一个较好的性价比满。社会要求。并且保证测量精度达到医疗级别系统运行稳定可靠。
本设计紧跟当前社会发展以及新冠疫情发生,设计出一款电子体温计,可以应用在市场上。并且可以将其推广。
设计框架架构
前 言 1
第一章 绪论 2
第一节 温度计的研究背景 2
第二节 温度计的研究意义 2
第三节 温度计的研究现状及趋势 4
第四节 本文的主要研究内容 5
第五节 本章小结 6
第二章 基于单片机的电子体温计的系统设计方案分析 7
第一节 电子体温计的设计要求分析 7
第二节 温度检测方案的确定 8
一、温度传感器选择 8
二、温度传感器特性 9
第三节 系统结构组成框图 10
第四节 本章小结 11
第三章 基于单片机的电子体温计系统硬件电路设计 12
第一节 单片机最小系统电路设计 12
一、单片机的简介 12
二、复位电路 14
二、晶振电路 15
第二节 温度检测电路的设计 15
第三节 按键电路设计 16
第四节 报警提示模块电路设计 17
第五节 LCD液晶显示电路设计 18
第六节 电源电路设计 19
第七节 系统总电路图 19
第八节 本章小结 20
第四章 基于单片机的电子体温计的软件设计 21
第一节 Keil软件介绍 21
第二节 系统的主程序流程设计 22
第三节 其他子程序流程设计 23
一、报警驱动程序流程图 23
二、按键驱动程序流程图 23
三、LCD液晶显示驱动程序流程图 24
四、温度传感器驱动程序流程图 25
第四节 按键模块程序设计 26
第五节 LED及蜂鸣器驱动程序设计 27
第六节 LCD液晶显示驱动程序设计 27
第七节 温度传感器驱动程序设计 28
第八节 本章小结 29
第五章 基于单片机的电子体温计的实现 30
第一节 实物调试 30
第二节 功能测试 32
一、体温读取测试 33
二、体温阈值调节功能测试 34
三、超温报警测试 36
第三节 结果分析 36
第四节 本章小结 37
结 论 38
致 谢 39
参考文献 40
附 录 42
一、英文原文 42
二、英文翻译 45
三、工程图纸 47
四、源代码 48
设计说明书及设计文件
论文低重复率。字数22922
源码展示
#include <reg52.h>
#include "LCD1602.h"
#include "MLX90614.h"
#include "keys.h"
#include "Timer0.h"
sbit LED_Green_Pin=P1^7;
sbit Speaker_Pin=P2^0;
unsigned char MS200_Con=0;
unsigned char View_Change=1;
unsigned int Set_Data=375;
unsigned char Set_View[]={0,0,'.',0,0xdf,'C'};
void main()
{
Timer0_Init();//初始化定时器0
MLX90614_Initial();//初始化温度传感器
InitLcd();//初始化液晶
Lcd_1602_word(0x80,16,"Temp: ");
Lcd_1602_word(0xC0,16,"SET: ");
while(1)
{
if(Key_Change)
{
Key_Change=0;
if(Key_Value==1)
{
Set_Data++;
}
else
{
Set_Data--;
}
}
if(MS200_Con>=20)
{
MS200_Con=0;
MLX90614_Memread();
View_Change=1;
}
if(View_Change)
{
View_Change=0;
Lcd_1602_word(0x88,8,MLX90614_Temp_View);
Set_View[0]=Set_Data/100+0x30;
Set_View[1]=Set_Data%100/10+0x30;
Set_View[3]=Set_Data%10+0x30;
Lcd_1602_word(0xca,6,Set_View);
if((MLX90614_Temp/10)>=Set_Data)//温度大于设定数值
{
Speaker_Pin=0;
LED_Green_Pin=1;
}
else
{
LED_Green_Pin=0;
Speaker_Pin=1;
}
}
}
/*
功能描述: 定时器0中断函数
函数参数: 无
返回说明: 无
*/
void Timer0_Interrupt(void) interrupt 1 // 定时器0中断函数
{
TH0 = 0xDC; //重置定时时间,如果初始化使用的是定时方式2则不需要重置
TL0 = 0x00;
MS200_Con++;
Key_Acquisition();//扫描按键
}
#include "MLX90614.h"
long MLX90614_Temp=0;
unsigned char MLX90614_Temp_View[8]={0,0,0,'.',0,0,0xdf,'C'};
//************ 数据定义****************
bdata unsigned char MLX90614_Flag;//可位寻址数据
sbit MLX90614_Bit_Out= MLX90614_Flag ^7;
sbit MLX90614_Bit_In= MLX90614_Flag ^0;
void MLX90614_Memread(void)
{
unsigned char DataH,DataL,Pecreg;
MLX90614_Start_Bit();
MLX90614_Tx_Byte(0xB4); //Send SlaveAddress
//tx_byte(0x00);
MLX90614_Tx_Byte(0x07); //Send Command
//------------
MLX90614_Start_Bit();
MLX90614_Tx_Byte(0x01);
MLX90614_Bit_Out=0;
DataL=MLX90614_Rx_Byte();
MLX90614_Bit_Out=0;
DataH=MLX90614_Rx_Byte();
MLX90614_Bit_Out=1;
Pecreg=MLX90614_Rx_Byte();
MLX90614_Stop_Bit();
MLX90614_Temp=DataH*256+DataL;
MLX90614_Temp=MLX90614_Temp*2;
//MLX90614_Temp=MLX90614_Temp-27315;
MLX90614_Temp=MLX90614_Temp+MLX90614_Correct_Data;
if(MLX90614_Temp>=27315)
{
MLX90614_Temp=MLX90614_Temp-27315;
MLX90614_Temp_View[0]=MLX90614_Temp/10000+0x30;
MLX90614_Temp_View[1]=MLX90614_Temp%10000/1000+0x30;
MLX90614_Temp_View[2]=MLX90614_Temp%1000/100+0x30;
MLX90614_Temp_View[4]=MLX90614_Temp%100/10+0x30;
MLX90614_Temp_View[5]=MLX90614_Temp%10+0x30;
if(MLX90614_Temp_View[0]==0x30)
{
MLX90614_Temp_View[0]=' ';
if(MLX90614_Temp_View[1]==0x30)
{
MLX90614_Temp_View[1]=' ';
}
}
}
else
{
MLX90614_Temp=27315-MLX90614_Temp;
MLX90614_Temp_View[0]='-';
MLX90614_Temp_View[1]=MLX90614_Temp%10000/1000+0x30;
MLX90614_Temp_View[2]=MLX90614_Temp%1000/100+0x30;
MLX90614_Temp_View[4]=MLX90614_Temp%100/10+0x30;
MLX90614_Temp_View[5]=MLX90614_Temp%10+0x30;
if(MLX90614_Temp_View[1]==0x30)
{
MLX90614_Temp_View[1]=' ';
}
MLX90614_Temp=MLX90614_Temp-27315;
}
}
void MLX90614_Initial()
{
MLX90614_SCL=1;
MLX90614_SDA=1;_nop_();
_nop_();_nop_();_nop_();
MLX90614_SCL=0;
MLX90614_Delay(1000);
MLX90614_SCL=1;
}
//************************************
void MLX90614_Start_Bit(void)
{
MLX90614_SDA=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
MLX90614_SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
MLX90614_SDA=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
MLX90614_SCL=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
}
//------------------------------
void MLX90614_Stop_Bit(void)
{
MLX90614_SCL=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
MLX90614_SDA=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
MLX90614_SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
MLX90614_SDA=1;
}
//--------- 发送一个字节---------
void MLX90614_Tx_Byte(unsigned char dat_byte)
{
char i,n,dat;
n=Nack_counter;
TX_again:
dat=dat_byte;
for(i=0;i<8;i++)
{
if(dat&0x80)
MLX90614_Bit_Out=1;
else
MLX90614_Bit_Out=0;
MLX90614_Send_Bit();
dat=dat<<1;
}
MLX90614_Receive_Bit();
if(MLX90614_Bit_In==1)
{
MLX90614_Stop_Bit();
if(n!=0)
{n--;goto Repeat;}
else
goto exit;
}
else
goto exit;
Repeat:
MLX90614_Start_Bit();
goto TX_again;
exit: ;
}