文章目录

  • 【毕业设计】46-基于单片机的智能卫浴系统设计(原理图工程+仿真工程+源代码+答辩论文+答辩PPT)
  • 资料要求
  • 任务书
  • 设计说明书
  • 摘要
  • 设计框架架构
  • 设计说明书及设计文件
  • 源码展示


资料要求

原理图工程文件
仿真模型工程文件
答辩论文低重复率文档,19386字
英文文献及翻译
答辩PPT
详情请私信!

任务书

主要研究内容: 1.单片机; 2.温度传感器、模数转换器、蜂鸣器 设计思路: 查阅相关文献资料学习单片机、温度传感器、模数转换器、蜂鸣器,编程实现智能卫浴系统功能,采用温度传感器检测水温,再传递给主控芯片单片机进行处理,当水温过低,则继续加热,若水温超过上限值,蜂鸣器发出报警。 方法和要求: 1.查阅相关文献资料学习单片机、温度传感器、模数转换器、蜂鸣器; 2.学习Keil软件,用汇编语言或者C语言编程实现智能卫浴系统设计功能; 3.学习Proteus软件,进行仿真或实物实现智能卫浴系统设计功能。 5.撰写毕业论文。

设计说明书

摘要

基于单片机的智能卫浴系统设计,需要实现的功能,有水温加热,水温,温度检测水温温度超温报警的功能。
系统在设计过程中需要有软件和硬件之间配合,才能实现整个系统的功能。系统需要使用到温度传感器,在本次系统使用的温度传感器是模拟式温度传感器。检测到温度发出的是电压信号,需要通过模数转换器相互配合、使用到的液晶显示器是LCD1602通过独立按键实现人机交互功能,控制整个系统,设定系统报警阈值。

设计框架架构

第一章 绪 论… 1

第一节 课题研究背景… 1

第二节 课题研究现状… 2

第三节 卫浴系统智能化趋势… 2

第四节 本文主要研究内容… 3

第五节 本章小结… 4

第二章 系统方案分析… 5

第一节 系统设计框架… 5

第二节 主控方案选择… 5

第三节 本章小结… 6

第三章 系统硬件电路设计… 8

第一节 单片机最小系统模块设计… 8

二、复位电路… 10

二、晶振电路… 10

第二节 电源模块设计… 11

第三节 按键电路模块设计… 12

第四节 LED显示模块电路… 12

第五节 LCD液晶显示模块电路… 13

一、显示元件介绍… 13

二、显示电路设计… 13

第六节 温度传感器模块电路… 14

第七节 蜂鸣器报警模块电路… 15

第八节 系统总电路图… 15

第九节 本章小结… 16

第四章 系统软件程序设计… 17

第一节 Keil软件介绍… 17

第二节 软件总设计流程… 17

第三节 按键模块程序设计… 19

一、按键模块程序流程图… 19

二、按键模块的程序… 19

第四节 LED显示模块程序设计… 20

一、LED显示模块程序流程图… 20

二、LED显示模块的程序… 20

第五节 LCD液晶显示模块程序设计… 22

一、LCD液晶显示模块程序流程图… 22

二、LCD液晶显示模块的程序… 23

第六节 温度传感器模块程序设计… 24

一、温度传感器模块程序流程图… 24

二、温度传感器模块的程序… 25

第七节 蜂鸣器报警模块程序设计… 26

一、蜂鸣器报警模块程序流程图… 26

二、蜂鸣器报警模块的程序设计… 26

第八节 本章小结… 27

第五章 系统仿真… 28

第一节 仿真软件介绍… 28

第二节 功能仿真并分析… 28

一、仿真总电路… 28

二、系统功能仿真… 29

第三节 本章小结… 34

结 论… 35

致 谢… 36

参考文献… 37

附 录… 39

一、英文原文… 39

二、英文翻译… 41

三、工程图纸… 43

四、源代码… 44

设计说明书及设计文件

单片机系统设计架构图_课程设计

单片机系统设计架构图_温度传感器_02


单片机系统设计架构图_课程设计_03


单片机系统设计架构图_单片机_04


单片机系统设计架构图_课程设计_05


单片机系统设计架构图_嵌入式硬件_06


单片机系统设计架构图_课程设计_07


单片机系统设计架构图_温度传感器_08

源码展示

#include <reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include "intrins.h"											   
#define     u8  			unsigned char
#define     u16   		unsigned int
#define     uchar  			unsigned char
#define     uint   		unsigned int		  
uchar yushe_yanwu=100;				//温度预设值
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_yanwu,temp)
{
	//显示预设温度	
	//显示预设温度
	LCD_Write_Char(0,13,yushe_yanwu,3) ;	
	//时时温度
	LCD_Write_Char(1,13,temp,3) ;
}
/***********************************************************************************************************
ADC0832相关函数
***********************************************************************************************************/
sbit ADCS 	=P1^5; //ADC0832 片选
sbit ADCLK  =P1^2; //ADC0832 时钟
sbit ADDI 	=P1^3; //ADC0832 数据输入		/*因为单片机的管脚是双向的,且ADC0832的数据输入输出不同时进行,
sbit 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
}
/***********************************************************************************************************
按键检测相关函数
***********************************************************************************************************/
//按键
sbit Key1=P1^6;				 //设置键
sbit Key2=P1^7;				 //加按键
sbit 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,直至第二次按键按下
u8 Key_Scan()
{	 
	static u8 key_up=1;//按键按松开标志
	if(key_up&&(Key1==0||Key2==0||Key3==0))
	{
		delay_ms(10);//去抖动 
		key_up=0;
		if(Key1==0)			return 1;
		else if(Key2==0)return 2;
		else if(Key3==0)return 3;
	}
	else if(Key1==1&&Key2==1&&Key3==1)
		key_up=1; 	    
 	return 0;// 无按键按下
}
void main (void)
{
	u8 key;
	Init1602();			  //调用初始化显示函数
	LCD_Write_String(0,0,"Control MAX:000");  //开机界面
	LCD_Write_String(1,0,"System  NOW:000");  
	delay_ms(1000);

	while (1)        					//主循环
	{
		key=Key_Scan();					//按键扫描
		yanwu=Adc0832(0);				//读取温度值
		
		if(key==KEY_SET)
		{
			Mode++;
		}
		
		switch(Mode)						//判断模式的值
		{
			case 0:								//监控模式
			{
				Display_1602(yushe_yanwu,yanwu);  //显示预设温度,预设温度,温度值,温度值
				if(yanwu>=yushe_yanwu)	  //温度值大于等于预设值时
				{
					Led_Reg=0;		  			//温度指示灯亮
					Fan=0;
					Buzzer=0;			  			//蜂鸣器报警
				}
				else					  					//温度值小于预设值时
				{
					Led_Reg=1;		  			//关掉报警灯
					Fan=1;
				}
				if(yanwu < yushe_yanwu)	  //温度值小于谠偳桵?
				{
					Led_Yellow=0;		  			//打开黄色灯
				}
				else					  					//温度值小于预设值时
				{
					Led_Yellow=1;		  			//关闭报警灯
				}
				if(yanwu<yushe_yanwu)	  //当温度小于预设值并且温度也小于预设值时 (&&:逻辑与,左右两边的表达式都成立(都为真,也就是1)时,该if语句才成立)
				{
					Buzzer=1;			  			//停止报警
				}
				break;
			}

			case 1:				//预设温度模式
			{
				SelectPosition(0,12) ;				//指定位置	
	   		write_com(0x0d);							//打开显示 无光标 光标闪烁
				if(key==KEY_ADD)							//加键按下
				{
					if(yushe_yanwu>=255)        //当阀值加到大于等于255时
					yushe_yanwu=254;            //阀值固定为254
					yushe_yanwu++;	
					LCD_Write_Char(0,13,yushe_yanwu,3) ;//显示预设温度
				}
				if(key==KEY_MINUS)						//减键按下
				{
					if(yushe_yanwu<=1)					//当温度上限值减小到1时
						yushe_yanwu=1;          	//固定为1
					yushe_yanwu--;							//预设温度值减一,最小为0	  
					LCD_Write_Char(0,13,yushe_yanwu,3) ;//显示预设温度
				}
				break;
			}
			default	:	
			{
				write_com(0x38);//屏幕初始化
				write_com(0x0c);//打开显示 无光标 无光标闪烁
				Mode=0;			//恢复正常模式
				break;
			}
		}
		
	}

}