51单片机的温湿度检测控制系统(仿真+程序+报告+原理图)

1、主要功能

该系统由AT89C51单片机+LCD1602模块+DHT11温湿度传感器模块+DS1302时间模块+电机驱动模块+报警模块构成。

可实现功能:
1、LCD1602显示温度+湿度+时间
2、DHT11采集温湿度数据
3、DS1302采集时间数据
4、通过按键来调整温湿度上下限报警值
5、超出限制时蜂鸣器和LED光电报警,对应继电器驱动电机转动,进行加热/降温/除湿/加湿

2、仿真

protues 仿真使用的是8.10版本,由于该软件版本迭代原因,不能确保其他版本软件能够正常运行,请安装好对应软件(版本一致或者高于这个版本都可以)

在这里插入图片描述

3、程序代码

只是放上来了部分代码,仅供参考。

在这里插入图片描述

/******************************************************
** 函数名:key_scan
** 描述  :按键扫描
** 输入  :无
** 输出  :无
******************************************************/
void key_scan(void)
{
	static unsigned char key_in_flag = 0;//按键按下标志
	unsigned char key_l;//存储扫描到行列值。
	key_value = 20;//按键值清除
	if((P3 & 0x0f) != 0x0f)//按键按下
	{
		delay_ms(1);//按键消抖动
		if(((P3 & 0x0f) != 0x0f) && (key_in_flag == 1))
		{
			key_in_flag = 0;//松手检测防止一直触发
			P3 = 0x0f;
            //delay_ms(1);//按键消抖动
			key_l = P3;//扫描得到按键值
			switch(key_l)
			{
				//获取按键值
				case 0x0e:
				{
					key_value = 1;
				}
				break;
				case 0x0d:
				{
					key_value = 2;
				}
				break;
				case 0x0b:
				{
					key_value = 3;
				}
				break;
				//case 0x70:
				//break;
			}
		}
	}
	else
	{
		key_in_flag = 1;//(按键松开标志)
	}

}
/*******************************************************************************
* 函 数 名         : LcdWriteCom
* 函数功能		   : 向LCD写入一个字节的命令
* 输    入         : u8com
* 输    出         : 无
*******************************************************************************/
void lcd_wri_com(unsigned char com)	  //写入命令
{
	E = 0;	 //使能清零
	RS = 0;	 //选择写入命令
	RW = 0;	 //选择写入

	DB = com;
	delay_ms(1);

	E = 1;	 //写入时序
	delay_ms(5);
	E = 0;
}
void main(void)
{
	 get_1302(time_1302);//获取时间
	 change(); //时间转换
	 init_all_hardware();//初始化硬件,IO和定时器
	 while(1)
	 {
		 get_1302(time_1302);//获取时间
		 change(); //时间转换
		 if(temp ==0)
		 {
			 wri_string(1,0,times);//初始化显示
		 }
		 key_scan();//按键扫描
		 key_service();//按键服务处理函数
		 time_service();//时间处理函数
	 }
}

4、原理图

在这里插入图片描述

5、参考报告

内含5k字,21页的相关报告一份,纯手打,内容一致

在这里插入图片描述

6、常见问题汇总

里面包含了我对各个模块的详细解析,可以结合代码一起理解。如果正巧老师问题多,这个可以帮到你哦。(不定时更新,讲解模块也会越来越多)

在这里插入图片描述

7、资源获取

在这里插入图片描述

本项目包含的所有文件都可以在公z号:今天也不想打工,回复“51温湿度检测”获取!

  • 18
    点赞
  • 153
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
基于单片机控风扇的设计 摘 要 控风扇在现代社会中的生产以及人们的日常生活中都有广泛的应用,如工业生产中大型机械散热系统中的风扇、现在笔记本电脑上的广泛应用的智能CPU风扇等。本文设计了基于单片机控风扇系统,采用单片机作为控制器,利用度传感器DS18B20作为度采集元件,并根据采集到的度,通过一个达林顿反向驱动器ULN2803驱动风扇电机。根据检测到的度与系统设定的度的比较实现风扇电机的自动启动和停止,并能根度的变化自动改变风扇电机的转速,同时用LED八段数码管显示检测到的度与设定的度。 关键词:单片机、DS18B20、控、风扇 第一章 整体方案设计 1.1 前 言 在现代社会中,风扇被广泛的应用,发挥着举足轻重的作用,如夏天人们用的散热风扇、工业生产中大型机械中的散热风扇以及现在笔记本电脑上广泛使用的智能CPU风扇等。而随着度控制技术的发展,为了降低风扇运转时的噪音以及节省能源等,控风扇越来越受到重视并被广泛的应用。在现阶段,控风扇的设计已经有了一定的成效,可以使风扇根据环境度的变化进行自动无级调速,当度升高到一定时能自动启动风扇,当度降到一定时能自动停止风扇的转动,实现智能控制。 随着单片机在各个领域的广泛应用,许多用单片机作控制的控制系统也应运而生,如基于单片机控风扇系统。它使风扇根据环境度的变化实现自动启停,使风扇转速随着环境度的变化而变化,实现了风扇的智能控制。它的设计为现代社会人们的生活以及生产带来了诸多便利,在提高人们的生活质量、生产效率的同时还能节省风扇运转所需的能量。 本文设计了由ATMEL公司的8052系列单片机AT89C52作为控制器,采用DALLAS公司的度传感器DS18B20作为度采集元件,并通过一个达林顿反向驱动器ULN2803驱动风扇电机的转动。同时使系统检测到得环境度以及系统预设的度动态的显示在LED数码管上。根据系统检测到得环境度与系统预设度的比较,实现风扇电机的自动启停以及转速的自动调节。 1.2 系统整体设计 本设计的整体思路是:利用度传感器DS18B20检测环境度并直接输出数字度信号给单片机AT89C52进行处理,在LED数码管上显示当前环境度值以及预设度值。其中预设度值只能为整数形式,检测到的当前环境度可精确到小数点后一位。同时采用PWM脉宽调制方式来改变直流风扇电机的转速。并通过两个按键改变预设度值,一个提高预设度,另一个降低预设度值。系统结构框图如下: 结 论 本次设计的系统以单片机为控制核心,以度传感器DS18B20检测环境度,实现了根据环境度变化调节不同的风扇电机转速,在一定范围能能实现转速的连续调节,LED数码管能连续稳定的显示环境度和设置度,并能通过两个独立按键调节不同的设置度,从而改变环境度与设置度的差值,进而改变电机转速。实现了基于单片机控风扇的设计。 本系统设计可推广到各种电动机的控制系统中,实现电动机的转速调节。在生产生活中,本系统可用于简单的日常风扇的智能控制,为生活带来便利;在工业生产中,可以改变不同的输入信号,实现对不同信号输入控制电机的转速,进而实现生产自动化,如在电力系统中可以根据不同的负荷达到不同的电压信号,再由电压信号调节不同的发电机转速,进而调节发电量,实现电力系统的自动化调节。综上所述,该系统的设计和研究在社会生产和生活中具有重要地位。 附录2:程序代码 #include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit DQ=P1^7; sbit key1=P1^3; sbit key2=P1^4; sbit dianji=P3^1; float ff; uint y3; uchar shi,ge,xiaoshu,sheding=20,gaonum,dinum; uchar code dispcode[]={ //段码 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; uchar code tablel[]={ //带小数点的段码 0xbf,0x86,0xdb,0xcf, 0xe6,0xed,0xfd, 0x87,0xff,0xef}; uchar dispbitcode[]={ //位选 0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f}; uchar dispbuf[8]={0,0,0,0,0,0,0,0}; void Delay(uint num)// 延时函数 { while( --num ); } void digitalshow(uchar a4,uchar a3,uchar a2,uchar a1,uchar a0) { dispbuf[0]=a0; dispbuf[1]=a1; dispbuf[2]=a2; dispbuf[3]=a3; dispbuf[4]=a4; P2=0xff; P0=dispcode[dispbuf[0]]; P2=dispbitcode[5]; Delay(1);

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值