基于51单片机的自动开关小风扇制作

1.背景

这个夏天,7月的雨季过后天气越来越热,于是买了一个小风扇。但普通小风扇智能化程度低,不能自动开关,会白白浪费电,于是想着利用单片机将其改造一下,增加一些自动开关的功能,感应到有人就开启,没人就关闭,也同时学习一下单片机的知识。

2.实现功能

这个项目称之为USB小风扇改造计划1.0,后续还会有2.0、3.0。目的是将USB小风扇增加一个功能:感应是否有人自动开启风扇。

既然是拓展,不能破坏原来的小风扇结构,于是计划将我的控制系统封装成一个硬件整体,小风扇和控制器连接,然后控制器和电脑电源连接,这样就不会破坏原有的小风扇结构,实现硬件解耦。

3.基本构思

使用超声波传感器感知物体距离,当距离小于一定阈值的时候启动开关,控制风扇运转,大于一定值关闭开关。电源由电脑USB口输入,控制器输出口控制电源通断,与小风扇连接。总之,小风扇最终的输入控制量就是电源的开关量,达到某个条件就打开/关闭。

4.方案设计

这里开始具体方案设计,主要材料选材、连接方案、软件

4.1主要材料

1、单片机最小系统:选择51单片机。这里需要用51单片机的最小系统,不仅仅是单片机芯片。懒得焊接,就买了个51的最小系统底座。用上以前的51单片机芯片。

2、继电器:继电器作为开关,可以通过单片机的IO口高低电平控制电源的通断。选了一个单路继电器,具体接口说明如下图。

3.超声波传感器:选择普通的HC-SR04这种型号的超声波传感器。该型号的超声波传感器的使用方法和原理可以查看相关使用方法,这里就不赘述了。

4.USB接口:用于供电。

4.2设计连接图

选择了上述的硬件后,具体的硬件连接示意图如下

4.3软件代码

软件部分主要是启动超声波传感器,测量距离。这里设置低于40cm触发IO口置为低电平,然后启动继电器常开口,开启风扇。

/*** 项目名称:USBFan1.0 USB感应风扇 ***/
/*** 项目功能:感应有人靠近,自动打开风扇 ***/
/*** 完成时间:20240802 ***/
/*** 作者:罗特布克 ***/
/*** 备注:***/

#include "reg52.h"
 
/*** 定义IO口 ***/
sbit SWITCH = P3^6; //  定义继电器开关
sbit Trig = P1^1;   //  超声波触发口
sbit Echo = P1^2;   //  超声波接收口

/*** 函数:延时10us ***/ 
void Delay10us() //  延时10us @11.0592MHz
{
	unsigned char i;
	i = 2;
	while (--i);
}
/*** 函数:初始化定时器 ***/  
void Time0Init()
{
	TMOD &= 0xF0;
	TMOD |= 0x01;
	TH0 = 0;
	TL0 = 0;
}
/*** 函数:启动超声波触发信号 ***/ 
void StartHC_SR04()//  给Trig口一个10us的高电平
{
	Trig = 0;
	Trig = 1;
	Delay10us();
	Trig = 0;
}
/*** 函数:返回测得距离 ***/ 
double Calculate_Dis(void)
{
	double distance=0;
	double time=0;
	StartHC_SR04();
	while(Echo == 0);  //  Echo返回的高电平的持续时间就是超声波传播的时间。这里等待高电平,没来就一直等待,直到变为1进入下一个语句。
	TR0 = 1;           //  开启定时器
	while(Echo == 1);  //  当Echo为高电平,说明超声波还没有回来,持续计时,直到变为低电平,进入下一个语句(关闭计时器)。
	TR0 = 0;           //  关闭定时器
	time = (TH0 * 256 + TL0)*1.085; //  计算时间 单位是us
	distance = time * 0.017;        //  计算距离 = 速度*时间/2,单位cm
	return 	distance;
}
/*** 主函数 ***/ 
void main()
{
	double HC_Dis=0; //  超声波传感器测得的距离
	Time0Init();
	while(1)
	{
		HC_Dis=Calculate_Dis();
		if(HC_Dis < 40)
		{
			SWITCH = 0;
		}
		else
		{
			SWITCH = 1;
		}
		TH0 = 0; //定时器清空,以便下一次测距
		TL0 = 0;
	}
}       
 

4.4实物组装

按照上边的设计图进行连接。

(1)准备材料:增加了一些杜邦线和面包板,当然还需要焊锡、剥线钳、热胶棒、改刀等辅助工具。对了,还要一个现成的USB小风扇。

(2)组装完成,导入代码测试。

(3)整理线束,让控制器更整洁。

测试视频:

基于51单片机的自动启动小风扇

5.小结

这个项目中超声波传感器经常检测不准造成,造成开关开合频繁,可以通过软件延时修复BUG。这次先这样,后边继续优化。

基于单片机的温控风扇的设计 摘 要 温控风扇在现代社会中的生产以及人们的日常生活中都有广泛的应用,如工业生产中大型机械散热系统中的风扇、现在笔记本电脑上的广泛应用的智能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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值