【毕业设计】45-基于单片机的智能温度/超温报警计的系统设计(原理图工程+仿真工程+源代码+答辩论文+答辩PPT)
文章目录
- 【毕业设计】45-基于单片机的智能温度/超温报警计的系统设计(原理图工程+仿真工程+源代码+答辩论文+答辩PPT)
- 资料下载链接
- 任务书
- 设计说明书
- 摘要
- 设计框架架构
- 设计说明书及设计文件
- 源码展示
资料下载链接
资料下载链接
资料链接:https://www.cirmall.com/circuit/29950/
包含此题目毕业设计全套资料:
任务书
采用51系列单片机作为控制器、数字温度传感器DS18B20、显示芯片、蜂鸣器等外围元件设计出一个智能温度计系统,使其实现系统的启动、停止、复位、对温度的设定、采集、显示、超温报警等功能。
1、根据智能温度计的功能要求,提出系统总体结构;
2、对系统进行硬件设计、软件设计;
3、利用PROTEUS软件对系统进行仿真验证。
设计说明书
摘要
本次系统主要有硬件和软件两个部分组成。硬件部分由STC89C51单片机最小系统单元,温度检测电路单元,报警单元,人机交互单元,电源单元,液晶显示器单元组成,在设计上硬件需要考虑到系统的稳定性以及可靠性。软件部分通过对系统软件总流程图绘制,并绘制各个子控制驱动再对驱动程序编写完成系统程序的设计。在硬件与软件的设计上选择按照功能性分区设计,使设计有条理运行可靠。系统设计没有制作实物而是通过仿真方式调试完成。使用仿真软件Proteus来搭建系统硬件电路,调试测试。最后完成了温度检测并,并可以调节阈值实现对系统的报警自定义设置防止误报的功能。
设计框架架构
前 言 1
第一章 绪论 2
第一节 温度计的研究背景 2
第二节 温度计的研究意义 2
第三节 温度计的研究现状及趋势 3
第四节 本文的主要研究内容 3
第五节 本章小结 4
第二章 基于单片机的智能温度计的系统设计方案分析 5
第一节 温度检测方案的确定 5
一、温度传感器的简介及原理 5
二、温度传感器特性 6
三、温度传感器的选定 6
第二节 智能温度计的设计要求分析 7
第三节 主控制器选择 8
第四节 系统结构组成框图 9
第五节 本章小结 10
第三章 基于单片机的智能温度计的系统硬件电路设计 11
第一节 单片机最小系统电路设计 11
一、单片机的简介 11
二、复位电路 13
二、晶振电路 14
第二节 温度检测电路的设计 15
第三节 按键电路设计 15
第四节 报警提示模块电路设计 16
第五节 LCD液晶显示模块电路 16
第六节 蜂鸣器报警模块电路 18
第七节 系统总电路图 18
第八节 本章小结 19
第四章 基于单片机的智能温度计的系统设计的软件设计 20
第一节 Keil软件介绍 20
第二节 系统的主程序流程设计 21
第三节 其他子程序流程设计 22
一、LED显示驱动程序流程图 22
二、按键模块程序流程图 23
三、LCD液晶显示驱动程序流程图 24
四、温度传感器驱动程序流程图 25
五、蜂鸣器报警驱动程序流程图 27
第四节 按键模块程序设计 27
第五节 LED显示驱动程序设计 28
第六节 LCD液晶显示驱动程序设计 28
第七节 温度传感器驱动程序设计 29
第八节 蜂鸣器报警驱动程序设计 30
第九节 本章小结 30
第五章 基于单片机的智能温度计的系统设计的仿真 1
第一节 仿真软件介绍 1
第二节 系统仿真 2
一、系统总仿真图 2
二、功能仿真验证 3
第三节 结果分析 8
第四节 本章小结 9
结 论 10
致 谢 11
参考文献 12
附 录 14
一、英文原文 14
二、英文翻译 18
三、工程图纸 22
四、源代码 23
设计说明书及设计文件
源码展示
#include <reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include "intrins.h"
#define u8 unsigned char
#define u16 unsigned int
#define uchar unsigned char
#define uint unsigned int
uchar yushe_wendu=50; //温度预设值
uint wendu; //温度值全局变量
//运行模式
uchar Mode=0; //=1是设置温度阀值 =2是设置烟雾阀值 =0是正常监控模式
//管脚声明
#define Led_Gre
=P2^2; //绿灯
#define Led_Yellow =P2^4; //黄灯
#define Buzzer =P2^0; //蜂鸣器
#define Fan =P3^3; //
/********************************************************************
* 名称 : delay_1ms()
* 功能 : 延时1ms函数
* 输入 : q
* 输出 : 无
***********************************************************************/
void delay_ms(uint q)
{
uint i,j;
for(i=0;i<q;i++)
for(j=0;j<110;j++);
}
/***********************************************************************************************************
LCD1602相关函数
***********************************************************************************************************/
//LCD管脚声明 (RW引脚实物直接接地,因为本设计只用到液晶的写操作,RW引脚一直是低电平)
#define LCDRS = P2^7;
#define LCDEN = P2^6;
#define D0 = P0^0;
#define D1 = P0^1;
#define D2 = P0^2;
#define D3 = P0^3;
#define D4 = P0^4;
#define D5 = P0^5;
#define D6 = P0^6;
#define D7 = P0^7;
//LCD延时
void LCDdelay(uint z) //该延时大约100us(不精确,液晶操作的延时不要求很精确)
{
uint x,y;
for(x=z;x>0;x--)
for(y=10;y>0;y--);
}
void LCD_WriteData(u8 dat)
{
if(dat&0x01)D0=1;else D0=0;
if(dat&0x02)D1=1;else D1=0;
if(dat&0x04)D2=1;else D2=0;
if(dat&0x08)D3=1;else D3=0;
if(dat&0x10)D4=1;else D4=0;
if(dat&0x20)D5=1;else D5=0;
if(dat&0x40)D6=1;else D6=0;
if(dat&0x80)D7=1;else D7=0;
}
//写命令
void write_com(uchar com)
{
LCDRS=0;
LCD_WriteData(com);
// DAT=com;
LCDdelay(5);
LCDEN=1;
LCDdelay(5);
LCDEN=0;
}
//写数据
void write_data(uchar date)
{
LCDRS=1;
LCD_WriteData(date);
// DAT=date;
LCDdelay(5);
LCDEN=1;
LCDdelay(5);
LCDEN=0;
}
/*------------------------------------------------
选择写入位置
------------------------------------------------*/
void SelectPosition(unsigned char x,unsigned char y)
{
if (x == 0)
{
write_com(0x80 + y); //表示第一行
}
else
{
write_com(0xC0 + y); //表示第二行
}
}
/*------------------------------------------------
写入字符串函数
------------------------------------------------*/
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
{
SelectPosition(x,y) ;
while (*s)
{
write_data( *s);
s ++;
}
}
//========================================================================
// 函数: void LCD_Write_Char(u8 x,u8 y,u16 s,u8 l)
// 应用: LCD_Write_Char(0,1,366,4) ;
// 描述: 在第0行第一个字节位置显示366的后4位,显示结果为 0366
// 参数: x:行,y:列,s:要显示的字,l:显示的位数
// 返回: none.
// 版本: VER1.0
// 日期: 2013-4-1
// 备注: 最大显示65535
//========================================================================
void LCD_Write_Char(u8 x,u8 y,u16 s,u8 l)
{
SelectPosition(x,y) ;
if(l>=5)
write_data(0x30+s/10000%10); //万位
if(l>=4)
write_data(0x30+s/1000%10); //千位
if(l>=3)
write_data(0x30+s/100%10); //百位
if(l>=2)
write_data(0x30+s/10%10); //十位
if(l>=1)
write_data(0x30+s%10); //个位
}
/*1602指令简介
write_com(0x38);//屏幕初始化
write_com(0x0c);//打开显示 无光标 无光标闪烁
write_com(0x0d);//打开显示 阴影闪烁
write_com(0x0d);//打开显示 阴影闪烁
*/
//1602初始化
void Init1602()
{
uchar i=0;
write_com(0x38);//屏幕初始化
write_com(0x0c);//打开显示 无光标 无光标闪烁
write_com(0x06);//当读或写一个字符是指针后一一位
write_com(0x01);//清屏
}
void Display_1602(yushe_wendu,c)
{
//显示预设温度
LCD_Write_Char(1,4,yushe_wendu,2) ;
//时时温度
LCD_Write_Char(1,12,c/10,2) ;
write_data('.');
LCD_Write_Char(1,15,c%10,1) ;
}
/***********************************************************************************************************
ADC0832相关函数
***********************************************************************************************************/
#define ADCS =P1^5; //ADC0832 片选
#define ADCLK =P1^2; //ADC0832 时钟
#define ADDI =P1^3; //ADC0832 数据输入 /*因为单片机的管脚是双向的,且ADC0832的数据输入输出不同时进行,
#define ADDO =P1^3; //ADC0832 数据输出 /*为节省单片机引脚,简化电路所以输入输出连接在同一个引脚上
//========================================================================
// 函数: unsigned int Adc0832(unsigned char channel)
// 应用: temp=Adc0832(0);
// 描述: 读取0通道的AD值
// 参数: channel:通道0和通道1选择
// 返回: 选取通道的AD值
// 版本: VER1.0
// 日期: 2015-05-29
// 备注:
//========================================================================
unsigned int Adc0832(unsigned char channel)
{
uchar i=0;
uchar j;
uint dat=0;
uchar ndat=0;
uchar Vot=0;
if(channel==0)channel=2;
if(channel==1)channel=3;
ADDI=1;
_nop_();
_nop_();
ADCS=0;//拉低CS端
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿1
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
ADDI=channel&0x1;
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿2
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
ADDI=(channel>>1)&0x1;
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿3
ADDI=1;//控制命令结束
_nop_();
_nop_();
dat=0;
for(i=0;i<8;i++)
{
dat|=ADDO;//收数据
ADCLK=1;
_nop_();
_nop_();
ADCLK=0;//形成一次时钟脉冲
_nop_();
_nop_();
dat<<=1;
if(i==7)dat|=ADDO;
}
for(i=0;i<8;i++)
{
j=0;
j=j|ADDO;//收数据
ADCLK=1;
_nop_();
_nop_();
ADCLK=0;//形成一次时钟脉冲
_nop_();
_nop_();
j=j<<7;
ndat=ndat|j;
if(i<7)ndat>>=1;
}
ADCS=1;//拉低CS端
ADCLK=0;//拉低CLK端
ADDO=1;//拉高数据端,回到初始状态
dat<<=8;
dat|=ndat;
return(dat); //return ad data
}
/***********************************************************************************************************
DS18B20相关函数
***********************************************************************************************************/
#define DQ = P1^0; //ds18b20的数据引脚
/*****延时子程序:该延时主要用于ds18b20延时*****/
void Delay_DS18B20(int num)
{
while(num--) ;
}
/*****初始化DS18B20*****/
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
Delay_DS18B20(8); //稍做延时
DQ = 0; //单片机将DQ拉低
Delay_DS18B20(80); //精确延时,大于480us
DQ = 1; //拉高总线
Delay_DS18B20(14);
x = DQ; //稍做延时后,如果x=0则初始化成功,x=1则初始化失败
Delay_DS18B20(20);
}
/*****读一个字节*****/
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
Delay_DS18B20(4);
}
return(dat);
}
/*****写一个字节*****/
void Xiezifur(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
Delay_DS18B20(5);
DQ = 1;
dat>>=1;
}
}
/*****读取温度*****/
unsigned int ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0;
Init_DS18B20();
Xiezifur(0xCC); //跳过读序号列号的操作
Xiezifur(0x44); //启动温度转换
Init_DS18B20();
Xiezifur(0xCC); //跳过读序号列号的操作
Xiezifur(0xBE); //读取温度寄存器
a=ReadOneChar(); //读低8位
b=ReadOneChar(); //读高8位
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
t= tt*10+0.5; //放大10倍输出并四舍五入
return(t);
}
//=====================================================================================
//=====================================================================================
//=====================================================================================
/*****校准温度*****/
u16 check_wendu(void)
{
u16 c;
c=ReadTemperature()-5; //获取温度值并减去DS18B20的温漂误差
if(c<1) c=0;
if(c>=999) c=999;
return c;
}
/***********************************************************************************************************
按键检测相关函数
***********************************************************************************************************/
//按键
#define Key1=P1^6; //设置键
#define Key2=P1^7; //加按键
#define Key3=P3^2; //减按键
#define KEY_SET 1 //设置
#define KEY_ADD 2 //加
#define KEY_MINUS 3 //减
// 函数: u8 Key_Scan()
// 应用: temp=u8 Key_Scan();
// 描述: 按键扫描并返回按下的键值
// 参数: NONE
// 返回: 按下的键值
// 版本: VER1.0
// 日期: 2015-05-29
// 备注: 该函数带松手检测,按下键返回一次键值后返回0,直至第二次按键按下
//========================================================================