基于STC89C52单片机的锅炉控制自动控制系统(PROTEUS仿真)

目 录

前 言 1
第一章 绪论 2
第一节 研究背景 2
第二节 研究意义 2
第三节 本文的主要研究内容 3
第四节 本章小结 4
第二章 锅炉控制系统方案介绍 5
第一节 系统设计思想 5
第二节 主要元器件介绍 6
一、单片机介绍 6
二、DS18B20介绍 7
三、MPX4115介绍 8
四、AD0832介绍 8
五、LCD1602介绍 8
第三节 系统结构总框图 9
第四节 本章小结 9
第三章 锅炉控制系统硬件电路设计 10
第一节 单片机最小系统电路设计 10
第二节 电源接口电路设计 11
第三节 按键电路设计 11
第四节 LED指示电路设计 12
第五节 LCD液晶显示电路设计 12
第六节 DS18B20温度检测电路设计 14
第七节 MXP4115气压检测电路设计 15
第八节 蜂鸣器报警电路设计 15
第九节 系统总电路图 16
第十节 本章小结 17
第四章 锅炉控制系统软件设计 18
第一节 Keil软件介绍 18
第二节 软件总设计流程 18
第三节 按键模块程序设计 19
第四节 LED及蜂鸣器报警程序设计 20
第五节 DS18B20程序设计 21
第六节 MXP4115程序设计 22
第八节 本章小结 23
第五章 锅炉控制系统仿真实现 24
第一节 Proteus软件介绍 24
第二节 系统调试与功能测试 24
一、系统调试 24
二、系统测试 25
第三节 本章小结 29
总 结 30
致 谢 31
参考文献 32
附 录 34
一、英文原文 34
二、英文翻译 43
三、工程图纸 50
四、源代码 51
第三节 本文的主要研究内容

本次系统为锅炉控制系统的研究与设计,随着工业的不断发展对锅炉控制系统需要进一步的研究,当前锅炉的控制系统中不能精确地对锅炉的内部进行检测。如温度、压强等多个参数进行统一检定。只能通过对锅炉的压力或者温度某一个值来进行检查,不会进行报警处理。针对此现象设计出一款可以实现温度压强报警及为一体的锅炉控制系统,可以实现,对温度和压强值得设定,当系统超过设定值则通过声学和光学报警,通过此监控可以达到节约能源并且防止安全事故发生的优良控制系统。
本系统通过对系统的分析研究,选择使用MPX4115传感器、DS18B20温度传感器,STC89C52单片机、LCD1602液晶显示器作为本次系统的核心元器件,对系统的硬件电路搭建软件程序编写。通过PROTEUS仿真软件通过对温度和气压的测试,可以发现所设计的控制系统能够满足设计要求,达到了预期的效果完成系统设计。。
本文第一章通过对锅炉控制系统的研究背景、研究意义分析。
第二章根据本次设计需要实现的功能分析,确定系统的硬件框架与系统使用的元器件。
第三章对系统的硬件电路设计,首先对系统各个子电路设计,然后将系统通过网络标号连接起来。完成系统对硬件设计
第四章对系统的软件系统设计,使用的编程软件为Keil,C语言编写。按照功能对系统对总程序设计流程设计,然后对各个子程序设计,最后将子程序调用到主函数中。
第五章使用仿真软件对系统仿真实现,使用的仿真软件为Proteus。首先将硬件电路搭建完成,进行软件硬件调试。然后对系统的各个功能测试。
总结,完成本次设计。

#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;				//温度预设值
uchar yushe_yanwu=100;				//烟雾预设值
uint wendu; 								//温度值全局变量
uchar yanwu;					 			//用于读取ADC数据

//运行模式  
uchar Mode=0;				 				//=1是设置温度阀值  =2是设置烟雾阀值	=0是正常监控模式
//管脚声明
sbit Led_Reg		 =P2^2;				 //红灯
sbit Led_Yellow  =P2^4;				 //黄灯
sbit Buzzer    	 =P2^0;				 //蜂鸣器
sbit 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引脚一直是低电平)
sbit LCDRS = P2^7;
sbit LCDEN = P2^6;
sbit D0		 = P0^0;
sbit D1		 = P0^1;
sbit D2		 = P0^2;
sbit D3		 = P0^3;
sbit D4		 = P0^4;
sbit D5		 = P0^5;
sbit D6		 = P0^6;
sbit 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,yushe_yanwu,c,temp)
{
	//显示预设温度
	LCD_Write_Char(0,6,yushe_wendu,2) ;
	
	//显示预设烟雾
	LCD_Write_Char(0,13,yushe_yanwu,3) ;
	
	//时时温度
	LCD_Write_Char(1,6,c/10,2) ;
	write_data('.');
	LCD_Write_Char(1,9,c%10,1) ;
	
	//时时烟雾
	LCD_Write_Char(1,13,temp,3) ;
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/sheziqiong/article/details/131001307