基于单片机的自动开窗器设计
摘 要
随着智能家居技术的快速发展,传统家居设备正逐步向智能化、自动化方向演进。窗户作为建筑的重要组成部分,其智能化控制对于改善居住环境、提升生活品质具有重要意义。然而,现有窗户控制系统普遍存在功能单一、依赖人工操作等问题,难以应对突变的天气状况,无法及时响应雨雪、大风等恶劣天气,给家庭生活带来不便与安全隐患。针对这一问题,本研究设计了一套基于STC89C52单片机的自动开窗器系统,该系统以雨量传感器实时检测雨滴状况,以霍尔传感器采集风速数据,通过步进电机驱动窗户实现自动启闭,能够根据预设阈值自主完成关窗操作,有效避免了因天气突变导致的室内进水或强风侵扰。
本设计以STC89C52单片机为核心控制器,外围电路包括雨量传感器模块、霍尔风速传感器模块、步进电机驱动模块。系统采用模块化设计思想,硬件部分包含单片机最小系统、传感器信号采集电路、电机控制电路和串口通信电路;软件部分包括主控程序、传感器数据采集程序、电机控制程序以及串口调试程序。系统上电后,单片机定时读取雨量传感器状态和霍尔传感器脉冲计数,计算实时风速值,并与预设阈值进行比较,当检测到雨量超过阈值或风速超过安全范围时,自动控制步进电机关闭窗户,并通过串口输出状态信息。用户也可通过按键手动控制窗户开启。
实验测试结果表明,该系统能够准确检测雨量和风速变化,关窗响应时间在3秒以内,步进电机运行平稳可靠,串口数据输出正常,各项功能均达到设计要求。该系统结构简单、成本低廉、运行稳定,具有较强的实用价值和推广前景,为智能家居窗户控制提供了一种可行的解决方案。
关键词:STC89C52单片机;自动开窗器;雨量传感器;霍尔传感器;步进电机
Abstract
With the rapid development of smart home technology, traditional home equipment is gradually evolving towards intelligence and automation. As an important component of buildings, intelligent control of windows is of great significance for improving living environments and enhancing quality of life. However, existing window control systems generally suffer from issues such as single functionality and reliance on manual operation, making it difficult to respond to sudden weather changes and unable to timely address adverse weather conditions like rain, snow, and strong winds, thereby causing inconvenience and safety hazards to household life. To address this problem, this study designs an automatic window opener system based on the STC89C52 microcontroller. The system uses a rain sensor to detect raindrops in real time, a Hall sensor to collect wind speed data, and a stepper motor to drive the window for automatic opening and closing. It can autonomously close the window based on preset thresholds, effectively preventing indoor water ingress or strong wind intrusion caused by sudden weather changes.
This design uses the STC89C52 microcontroller as the core controller, with peripheral circuits including the rain sensor module, Hall wind speed sensor module, stepper motor drive module, and button input module. The system adopts a modular design concept, with the hardware part comprising the microcontroller minimum system, sensor signal acquisition circuits, motor control circuits, and serial communication circuits; the software part includes the main control program, sensor data acquisition program, motor control program, and serial debugging program. After power-on, the microcontroller regularly reads the rain sensor status and Hall sensor pulse counts, calculates real-time wind speed values, and compares them with preset thresholds. When rain exceeds the threshold or wind speed exceeds the safety range, the system automatically controls the stepper motor to close the window and outputs status information through the serial port. Users can also manually control window opening via buttons.
Experimental test results show that the system can accurately detect rain and wind speed changes, with a window-closing response time within 3 seconds. The stepper motor operates smoothly and reliably, and serial data output is normal. All functions meet the design requirements. The system features simple structure, low cost, stable operation, strong practical value, and good promotion prospects, providing a feasible solution for intelligent window control in smart homes.
Keywords:STC89C52 microcontroller; automatic window opener; rain sensor; Hall sensor; stepper motor
目 录
摘 要 1
Abstract 3
第一章 绪论 7
1.1 选题背景及其意义 7
1.2 国内外研究现状 7
1.2.1 国内发展现状 7
1.2.2 国外发展现状 10
1.3 主要内容 10
1.4 文章结构 12
1.5 本章小结 12
第二章 系统总体设计方案 13
2.1 系统需求分析 13
2.2 系统总体设计方案 13
2.3 主要模块选型 14
2.3.1 主控芯片选择 14
2.3.2 雨量传感器选择 15
2.3.3 风速传感器选择 15
2.3.4 步进电机选择 16
第三章 系统硬件设计 17
3.1 单片机最小系统电路 17
3.2 雨量传感器电路 18
3.3 霍尔风速传感器电路 19
3.4 步进电机驱动电路 20
3.5 整体电路分析 21
3.6 本章小结 21
第四章 系统软件设计 21
4.1 主程序设计 22
4.2 定时器中断服务程序 22
4.3 外部中断服务程序 23
4.4 步进电机控制程序 23
4.5 本章小结 23
第五章 系统测试与分析 24
5.1 系统整体测试 24
5.2 系统功能测试 25
5.2.1 雨量检测功能测试 25
5.2.2 风速检测功能测试 26
5.2.3 步进电机控制功能测试 26
5.2.4 自动关窗功能测试 27
5.3 本章小结 28
第六章 结论与展望 29
6.1 总结 29
6.2 展望 29
参考文献 31
致谢 32
第一章 绪论
1.1 选题背景及其意义
近年来,随着物联网技术与嵌入式系统的飞速发展,智能家居产业迎来了前所未有的发展机遇。智能家居通过将传感器、控制器和执行器有机整合,实现了家居设备的自动化与远程控制,显著提升了居住的便捷性、安全性和舒适性。窗户作为建筑与外界环境交互的重要界面,其开合状态直接影响室内的通风、采光、防雨防风等功能。传统的窗户需要人工操作,在遇到突发天气变化如降雨、大风时,住户往往无法及时关闭窗户,导致雨水飘入室内损坏家具地板,或强风造成室内物品散落,给家庭生活带来诸多不便与潜在损失。
针对这一现实问题,设计一套能够自动感知天气变化并自主控制窗户启闭的智能开窗器系统具有重要的现实意义。该系统能够实时监测环境中的雨量大小和风速强弱,当检测到的雨量或风速超过预设的安全阈值时,系统自动驱动电机将窗户关闭,有效避免恶劣天气对室内环境的影响。同时,系统还保留了手动控制功能,方便用户在需要时自行操作。这种智能化的窗户控制系统不仅提升了家居生活的便利性,也体现了智能家居技术向人性化、自动化方向发展的趋势。
本设计采用STC89C52单片机作为主控制器,搭配雨量传感器和霍尔风速传感器分别采集雨量与风速数据,通过步进电机实现窗户的精确控制。系统结构简洁、成本可控、运行可靠,适合在普通家庭中推广应用。通过本课题的研究,能够深入理解单片机系统设计、传感器应用、电机驱动控制等关键技术,为后续从事智能家居相关领域的工作奠定基础。
1.2 国内外研究现状
1.2.1 国内发展现状
国内学者在智能窗户控制领域开展了大量研究工作,并取得了一系列成果。潘立言等人 (2022) 提出了基于物联网的多功能智能窗户设计方案,该方案将传感器采集的环境数据通过物联网平台上传至云端,用户可通过手机APP远程查看窗户状态并实现远程控制,解决了传统窗户无法远程操作的局限性,为智能窗户的物联网应用提供了参考思路1。黄晓斌 (2021) 在基于STM32单片机的多功能智能家居控制系统研究中,将智能窗户作为子系统纳入整体家居控制框架,通过多种传感器融合技术实现窗户的自动控制,验证了嵌入式系统在智能家居领域的应用可行性2。朱嫣锦 (2021) 针对门窗智能启闭器展开研究,设计了基于物联网技术的门窗自动启闭装置,重点解决了门窗在复杂环境下的可靠运行问题,提高了系统的稳定性和适应性3。周婷 (2021) 在项目化教学研究中对单片机技术进行了深入探讨,将智能窗户控制系统作为教学案例,为同类产品的开发提供了实践经验和教学参考4。
付瑞玲等人 (2024) 基于OneNET平台开发了语音控制室内环境监测系统,该系统将窗户控制与环境监测相结合,实现了室内环境参数与窗户状态的联动调节,展现了智能窗户在环境自适应控制方面的应用潜力5。韩增祺等人 (2022) 在智能火灾报警器设计中应用单片机技术,虽然主要针对火灾报警,但其传感器数据采集与处理的方法对智能窗户控制系统具有借鉴意义6。王鹏 (2020) 在基于嵌入式的智能养老院监控系统研究中,将窗户控制作为安全保障子系统,通过多种传感器协同工作,实现了对窗户状态的实时监控和自动控制7。秦凯 (2024) 在基于物联网技术的无线智能家居系统研究中,将智能窗户纳入无线控制网络,解决了窗户控制与家居系统间的数据交互问题8。
李志伟等人 (2024) 基于51单片机与GSM技术设计了GPS卫星定位系统,其单片机应用经验为基于51单片机的智能窗户控制系统提供了技术参考9。杨万宇 (2023) 在中小功率隔离型电源系统研究中,针对系统供电稳定性进行了深入分析,这对保证智能窗户系统长期可靠运行具有重要意义10。胡如福 (2023) 分析了物联网技术与LTE无线通信技术的结合应用,为智能窗户系统远程通信方案提供了技术参考11。孙振华 (2025) 基于ZigBee技术设计了小区照明系统,其无线组网方案可借鉴应用于智能窗户系统的多节点协同控制12。王飞 (2022) 基于WiFi技术设计了语音矿灯,其无线通信模块的应用经验对智能窗户系统的远程控制功能开发具有参考价值13。这些研究成果共同推动了国内智能窗户控制技术的发展,为本课题的研究提供了坚实的理论基础和技术支撑。
1.2.2 国外发展现状
国外在智能窗户控制领域的研究起步较早,技术体系相对成熟。Sabit H (2025) 提出了基于人工智能和物联网技术的智能家居安全系统,该系统将窗户控制作为家居安全的重要组成部分,通过AI算法分析传感器数据,实现了窗户状态的智能判断和自主控制,代表了智能窗户系统向智能化、自适应方向发展的趋势14。J Wang与Liu Q (2020) 基于单片机和FPGA技术开展了矿山电缆故障点定位研究,其嵌入式系统设计与信号处理方法对智能窗户控制系统中的传感器信号处理具有借鉴意义15。此外,国外学者在智能窗户的能源管理方面也开展了深入研究,将窗户控制与室内温湿度调节、光照控制相结合,通过智能算法优化窗户开启时机,达到节能降耗的目的。在传感器技术方面,国外研究更注重多传感器融合与数据融合算法的应用,提高了系统对环境变化的感知精度和响应速度。在控制策略上,国外研究倾向于采用模糊控制、神经网络等智能控制算法,使窗户能够根据复杂的天气变化做出更为合理的响应。这些国外研究成果为本课题的研究提供了先进的技术参考和理论指导,推动了智能窗户系统向更智能、更高效的方向发展。
1.3 主要内容
本设计以STC89C52单片机为核心控制器,构建了一套具备雨量检测和风速检测功能的自动开窗器系统。系统硬件部分主要包括单片机最小系统、雨量传感器模块、霍尔风速传感器模块、步进电机驱动模块和按键输入模块。软件部分采用C语言编程,实现了传感器数据采集、阈值判断、电机控制和串口通信等功能。系统通过雨量传感器采集雨滴信号,当检测到有雨时,单片机判断雨量超过预设阈值,立即控制步进电机关闭窗户。同时,利用霍尔传感器检测风速,通过外部中断对传感器脉冲进行计数,计算实时风速值,当风速超过安全阈值时,同样执行关窗操作。为方便调试和状态监控,系统通过串口将传感器数据和窗户状态实时输出至上位机。用户也可通过按键手动控制窗户开启,满足不同使用场景的需求。整个系统经过软硬件联调测试,验证了各项功能的正确性和运行稳定性。
1.4 文章结构
本文共分为六章,各章内容安排如下:第一章为绪论,阐述选题背景与意义,分析国内外研究现状,介绍本文主要研究内容及论文结构安排。第二章为系统总体设计方案,进行系统需求分析,给出系统整体硬件框架和软件功能模块划分,并对核心元器件进行选型对比。第三章为系统硬件设计,详细说明单片机最小系统电路、雨量传感器电路、霍尔传感器电路、步进电机驱动电路和按键电路的原理与连接方式。第四章为系统软件设计,介绍软件开发环境,给出主程序及各功能模块的程序流程图与详细说明。第五章为系统测试与分析,搭建测试平台,对各功能模块进行测试验证,给出测试数据与结果分析。第六章为结论与展望,总结本文研究成果,分析存在的不足,并对后续改进方向进行展望。
1.5 本章小结
本章首先阐述了基于单片机的自动开窗器系统的选题背景和研究意义,分析了传统窗户在应对突发天气变化时存在的不足,指出了开发智能自动开窗系统的现实必要性。通过对国内外研究现状的系统梳理,了解了本领域的研究进展和发展趋势,国内学者在智能窗户控制系统方面开展了大量研究,涉及传感器应用、物联网通信、嵌入式控制等多个方向;国外研究则更注重智能化控制算法和多传感器融合技术的应用。在此基础上,明确了本文的主要研究内容,即基于STC89C52单片机设计一套具备雨量检测和风速检测功能的自动开窗器系统,实现窗户的自动控制和手动操作。最后对论文的章节结构进行了简要说明,为后续章节的展开奠定了基础。
第二章 系统总体设计方案
2.1 系统需求分析
在智能家居应用场景中,窗户作为建筑与外界的连接界面,其开合状态直接影响居住环境的安全性与舒适性。现有窗户多为手动操作,住户在遇到天气突变时往往来不及关闭窗户,导致雨水飘入室内损坏家具、地板,或强风造成室内物品被吹散、玻璃受损等问题。针对这一现实需求,本设计旨在开发一套能够自动感知天气变化并自主控制窗户启闭的系统,解决传统窗户应对突发天气能力不足的问题。
系统设计目标如下:能够实时检测雨量状况,当检测到降雨时自动关闭窗户;能够实时检测风速大小,当风速超过安全阈值时自动关闭窗户;保留手动控制功能,方便用户根据实际需求操作;系统运行稳定可靠,响应及时;整体结构简洁,成本可控,适合家庭推广使用。为实现上述目标,系统需要具备传感器信号采集、数据处理与判断、电机驱动控制和用户交互等基本功能。
2.2 系统总体设计方案
本系统以STC89C52单片机为核心控制器,外围电路包括雨量传感器、霍尔风速传感器、步进电机驱动电路和按键输入电路。系统整体硬件框架如图2-1所示。单片机作为控制核心,负责读取传感器数据、执行阈值判断、控制电机动作以及串口通信输出。雨量传感器用于检测是否有雨,输出数字开关量信号接入单片机I/O口。霍尔风速传感器用于检测风速大小,输出脉冲信号接入单片机外部中断引脚,通过脉冲计数计算实时风速。步进电机驱动电路连接单片机I/O口,通过控制相序实现电机的正反转,从而驱动窗户开启或关闭。按键电路接入单片机I/O口,实现手动开窗功能。
图2-1 系统总体框架设计图
系统硬件部分由多个功能模块组成,各模块功能如下:雨量传感器模块负责检测环境中的雨滴状况,输出高低电平信号指示有雨或无雨。霍尔风速传感器模块通过检测风轮转动产生的脉冲信号,将风速信息转换为电脉冲,脉冲频率与风速成正比。STC89C52单片机最小系统包括时钟电路、复位电路和电源电路,为整个系统提供运行基础。步进电机驱动模块接收单片机的控制信号,驱动步进电机按照指定方向旋转,通过机械传动机构带动窗户启闭。软件方面,系统实现传感器数据采集、阈值判断、电机控制和串口输出等功能,各模块协同工作,完成自动开窗器的完整功能。
2.3 主要模块选型
2.3.1 主控芯片选择
方案一:STM32F103C8T6单片机。该芯片采用ARM Cortex-M3内核,具有32位处理能力,主频可达72MHz,内置64KB Flash和20KB RAM,拥有丰富的片上外设,包括多个通用定时器、ADC、USART、I2C和SPI接口等。其处理速度快、外设资源丰富,能够执行复杂指令,适合功能复杂、性能要求较高的应用场景。STM32F103C8T6单片机实物如图2-2所示。
图2-2 STM32F103C8T6单片机实物图
方案二:STC89C52单片机。该芯片采用经典的8051内核,为8位微控制器架构,主频可达12MHz,内置8KB Flash和512字节RAM,拥有3个定时器、1个串口和32个I/O口。其结构简单、编程方便、成本低廉,适合对性能要求不高的控制应用。STC89C52单片机实物如图2-3所示。
图2-3 STC89C52单片机实物图
本系统主要完成传感器信号采集、阈值判断和电机控制等任务,对处理速度要求不高,且需要控制步进电机和读取传感器状态,STC89C52的I/O资源已足够满足需求。考虑到系统成本因素和开发简便性,本设计选择STC89C52单片机作为主控芯片。
2.3.2 雨量传感器选择
方案一:雨滴传感器模块。该模块采用LM393比较器电路,通过检测雨滴落在传感器板上的导电情况输出数字电平信号。当传感器板上无水时,输出高电平;当有水时,输出低电平。模块带有灵敏度调节电位器,可调整检测阈值,工作电压为3.3V至5V,输出信号可直接接入单片机I/O口。
方案二:电容式雨量传感器。该传感器通过检测雨滴引起的电容变化来判断雨量大小,输出模拟信号,需要配合ADC电路使用。其灵敏度较高,但电路相对复杂,成本较高。
考虑到本系统只需判断是否有雨,无需精确测量雨量大小,数字输出的雨滴传感器模块更为合适。该模块电路简单、响应迅速、成本低廉,可直接与单片机I/O口连接,简化了电路设计。本设计选用雨滴传感器模块作为雨量检测元件。
2.3.3 风速传感器选择
方案一:霍尔风速传感器。该传感器由风杯组件和霍尔元件组成,风杯在风力作用下旋转,带动磁铁转动,霍尔元件检测磁场变化产生脉冲信号,脉冲频率与风速成正比。传感器输出为数字脉冲信号,可直接接入单片机外部中断引脚进行计数。其结构简单、测量准确、响应迅速。
方案二:热式风速传感器。该传感器通过检测热丝散热情况来测量风速,输出模拟信号,需要ADC转换。其灵敏度高,但成本较高,且对温度变化敏感,需要温度补偿。
本系统需要检测风速是否超过安全阈值,霍尔风速传感器输出脉冲信号,可通过单片机外部中断直接采集,数据处理简单,适合本设计需求。因此选用霍尔风速传感器作为风速检测元件。
2.3.4 步进电机选择
方案一:28BYJ-48步进电机。该电机为五线四相步进电机,工作电压为5V,步距角为5.625度,减速比为1:64,具有体积小、扭矩适中、控制简单的特点,适合驱动窗户等轻负载机构。
方案二:42系列步进电机。该电机为两相步进电机,工作电压为12V或24V,扭矩较大,但需要配备专用驱动器,电路较为复杂,成本较高。
本系统驱动负载为普通窗户,所需扭矩较小,28BYJ-48步进电机配合ULN2003驱动板即可满足需求,控制简单、成本低廉。因此选用28BYJ-48步进电机作为执行元件。
第三章 系统硬件设计
3.1 单片机最小系统电路
单片机最小系统是系统正常工作的基础,主要包括STC89C52芯片、时钟电路、复位电路和电源电路。STC89C52是一款低功耗、高性能的8位微控制器,采用CMOS工艺制造,内置8KB Flash程序存储器,支持在线编程,具有32个可编程I/O口、3个16位定时器、1个全双工串行通信口和6个中断源。该芯片工作电压为5V,最高工作频率可达40MHz,能够满足本系统的控制需求。
时钟电路为单片机提供工作节拍,由12MHz晶振和两个30pF的瓷片电容组成。晶振连接在单片机的XTAL1和XTAL2引脚之间,电容一端接地,另一端接晶振两端,构成稳定的振荡回路。12MHz晶振的选择使单片机机器周期为1微秒,便于精确控制延时和定时。复位电路采用上电自动复位和按键手动复位相结合的方式,由10kΩ电阻和10μF电容组成RC电路,连接到单片机的RST引脚。上电时电容充电,RST引脚保持高电平两个机器周期后复位完成;按键复位通过按键将RST引脚直接接高电平,实现手动复位。电源电路采用5V直流供电,通过电源接口接入系统,在电源引脚VCC和GND之间并联一个100μF电解电容和一个0.1μF瓷片电容,起到电源滤波作用,保证供电稳定性。单片机最小系统电路如图3-1所示。

图3-1 STC89C52单片机最小系统电路图
3.2 雨量传感器电路
雨量传感器用于检测是否有降雨,本设计采用雨滴传感器模块。该模块由传感器板和控制电路两部分组成,传感器板上布设有交错的铜质导线,当雨滴落在传感器板上时,导线间的电阻发生变化,控制电路通过LM393比较器将电阻变化转换为数字电平输出。模块具有灵敏度调节电位器,可根据实际需求调整检测阈值,工作电压为5V,输出信号为TTL电平,可直接接入单片机I/O口。
雨量传感器电路连接简单,模块的VCC引脚接5V电源正极,GND引脚接电源地,DO引脚为数字信号输出端,接单片机的P2.0引脚。当传感器板上无雨滴时,模块输出高电平;当有雨滴落在传感器板上时,模块输出低电平。单片机通过读取P2.0引脚的电平状态即可判断是否有雨。传感器板需放置在室外或窗户附近,以准确感知降雨情况。雨量传感器电路如图3-2所示。

图3-2 雨量传感器电路图
3.3 霍尔风速传感器电路
霍尔风速传感器用于检测风速大小,本设计采用霍尔元件式风速传感器。传感器由风杯、转轴、磁铁和霍尔元件组成,风杯在风力作用下旋转,带动同轴磁铁转动,霍尔元件检测磁场变化产生脉冲信号。传感器输出为数字脉冲信号,脉冲频率与风速成正比,可通过单片机外部中断对脉冲计数,计算实时风速值。
霍尔风速传感器模块包含三根引出线,红色线接5V电源正极,黑色线接电源地,黄色线为信号输出端,接单片机的P3.2引脚。该引脚为单片机的外部中断0输入引脚,配置为下降沿触发模式。当传感器检测到磁铁转动时,输出电平跳变,触发外部中断,中断服务程序对脉冲计数器加一。系统每隔10秒读取一次脉冲计数值,乘以6得到每分钟脉冲数,用于判断风速是否超过安全阈值。霍尔风速传感器电路如图3-3所示。

图3-3 霍尔风速传感器电路图
3.4 步进电机驱动电路
步进电机驱动电路用于控制步进电机运转,本设计选用28BYJ-48步进电机和ULN2003驱动板。28BYJ-48为五线四相步进电机,工作电压为5V,步距角为5.625度,减速比为1:64,输出轴每转需要4096步。ULN2003驱动板内部集成了达林顿管阵列,具有电流放大功能,可直接将单片机I/O口的微弱信号放大后驱动步进电机。
步进电机驱动电路连接方式为:驱动板的IN1至IN4引脚分别接单片机的P2.4、P2.5、P2.6、P2.7引脚,驱动板的VCC引脚接5V电源,GND引脚接电源地,电机接口按标识连接步进电机。单片机通过控制P2.4至P2.7引脚输出相序信号,控制步进电机按指定方向旋转。正向旋转时输出A-B-C-D相序,反向旋转时输出D-C-B-A相序。步进电机通过机械传动机构与窗户连接,正转对应开窗动作,反转对应关窗动作。步进电机驱动电路如图3-4所示。

图3-4 步进电机驱动电路图
3.5 整体电路分析
本系统整体电路以STC89C52单片机为核心,外围电路按功能划分为传感器采集模块、电机驱动模块和人机交互模块。传感器采集模块包括雨量传感器和霍尔风速传感器,雨量传感器通过P2.0引脚将数字开关量信号送入单片机,霍尔风速传感器通过P3.2外部中断引脚将脉冲信号送入单片机。电机驱动模块通过P2.4至P2.7引脚输出步进电机控制相序,经ULN2003驱动板放大后驱动28BYJ-48步进电机运转。系统电源采用5V直流供电,为单片机、传感器、驱动板和电机提供工作电压。单片机最小系统包含12MHz晶振时钟电路和RC复位电路,保证系统稳定运行。整体电路模块化程度高,各模块间通过I/O口连接,信号流向清晰,便于调试和维护。系统整体电路原理图如附录A所示。
3.6 本章小结
本章详细阐述了自动开窗器系统的硬件设计,包括单片机最小系统电路、雨量传感器电路、霍尔风速传感器电路、步进电机驱动电路、对各模块的电路原理、元器件选型和与单片机的连接方式进行了全面说明,明确了各模块的信号接口和引脚分配。单片机最小系统为系统提供运行基础,雨量传感器和霍尔风速传感器完成环境参数采集,步进电机驱动电路实现窗户控制,按键和串口提供人机交互功能。各模块电路设计合理,连接正确,共同构成了完整的硬件平台,为后续软件设计和系统测试奠定了坚实基础。
第四章 系统软件设计
系统软件设计采用Keil uVision4作为开发环境,使用C51语言进行编程。Keil uVision4是专为51单片机设计的集成开发环境,提供了编译、调试、仿真等功能,支持标准C语言语法,开发效率高。软件设计采用模块化思想,将系统功能划分为主程序模块、传感器数据采集模块、电机控制模块、按键处理模块和串口通信模块。系统上电后,首先完成定时器初始化、外部中断初始化、串口初始化和变量初始化,然后进入主循环,不断检测按键状态和处理定时标志,实现窗户的自动控制和手动操作。
4.1 主程序设计
主程序是系统的控制核心,负责完成系统初始化、传感器数据采集、阈值判断、电机控制和按键响应等任务。系统上电后,首先执行初始化函数,配置定时器0为50ms中断模式,用于产生秒标志和10秒计数标志;配置外部中断0为下降沿触发模式,用于霍尔传感器脉冲计数;配置串口为9600bps通信速率,便于输出调试信息。初始化完成后,程序进入主循环,循环检测按键状态和秒标志。当检测到按键按下时,执行手动开窗操作。当秒标志置位时,读取雨量传感器状态,计算风速脉冲计数值,判断是否满足关窗条件,若满足则执行关窗操作,并通过串口输出状态信息。主程序流程图如图4-1所示。
图4-1 主程序流程图
4.2 定时器中断服务程序
定时器0中断服务程序用于产生系统的时间基准,每50ms中断一次。在中断服务程序中,首先重装定时器初值,保证下次中断准确。然后对50ms计数器进行累加,当计数器达到20时,表示1秒时间到,将秒标志置位,供主程序使用。同时,对10秒计数器进行累加,当计数器达到200时,表示10秒时间到,将当前10秒内的脉冲计数值乘以6转换为每分钟脉冲数,然后清零脉冲计数器,为下一个10秒周期做准备。定时器中断服务程序保证了系统时间基准的准确性,为风速计算提供了可靠的时间窗口。定时器中断服务程序流程图如图4-2所示。
图4-2 定时器中断服务程序流程图
4.3 外部中断服务程序
外部中断0服务程序用于霍尔风速传感器的脉冲计数。霍尔风速传感器输出脉冲信号,每检测到一个脉冲,触发一次外部中断。外部中断配置为下降沿触发方式,当传感器信号从高电平跳变为低电平时,中断被触发。在中断服务程序中,对脉冲计数器进行加一操作,记录脉冲数量。脉冲计数器为全局变量,在定时器中断中被读取和清零。通过外部中断计数,系统能够准确获取固定时间窗口内的脉冲数量,进而计算实时风速。外部中断服务程序流程图如图4-3所示。
图4-3 外部中断服务程序流程图
4.4 步进电机控制程序
步进电机控制程序负责驱动步进电机按照指定方向旋转指定时间。电机控制函数接收方向和运行时间两个参数,方向参数控制正反转,运行时间参数控制转动时长。在函数内部,根据方向选择正转相序表或反转相序表,然后根据运行时间计算需要输出的步数。每输出一步相序,延时一定时间后切换到下一步,循环执行直至达到设定步数。控制结束后,将所有电机控制引脚置为低电平,停止电机运转。步进电机控制程序确保了窗户开启和关闭动作的精确执行。步进电机控制程序流程图如图4-4所示。
图4-4 步进电机控制程序流程图
4.5 本章小结
本章详细阐述了自动开窗器系统的软件设计,包括主程序设计、定时器中断服务程序设计、外部中断服务程序设计、步进电机控制程序设计、按键检测程序设计和串口通信程序设计。软件采用模块化设计思想,各功能模块相对独立,接口清晰,便于调试和维护。主程序完成系统初始化和任务调度,定时器中断提供时间基准,外部中断完成风速脉冲计数,步进电机控制实现窗户的自动启闭,按键检测提供手动控制功能,串口通信实现状态输出。各模块协同工作,共同实现了系统的自动控制功能,为系统测试和实际应用提供了可靠的软件基础。
第五章 系统测试与分析
5.1 系统整体测试
为验证基于STC89C52单片机的自动开窗器系统的实际功能和运行稳定性,本文搭建了完整的软硬件测试平台,模拟实际使用场景对系统进行功能测试和性能评估。测试平台包括STC89C52单片机最小系统、雨量传感器模块、霍尔风速传感器模块、28BYJ-48步进电机及ULN2003驱动板、按键模块和串口调试助手。系统上电后,单片机完成各外设初始化工作,雨量传感器和霍尔风速传感器开始采集环境数据,步进电机处于待命状态,系统通过串口将状态信息发送至计算机串口调试助手,便于实时监控系统运行情况。系统整体实物如图5-1所示。
图5-1 系统整体实物图
5.2 系统功能测试
5.2.1 雨量检测功能测试
雨量检测功能测试旨在验证雨量传感器能否准确检测雨滴状况,并正确输出信号给单片机。测试时,用滴管模拟降雨,将水滴分别滴在传感器板的不同位置,观察串口输出的雨量状态。测试共进行10次,分别测试无水状态、少量水滴状态和大量水滴状态下的传感器响应情况。测试结果如表5-1所示。
表5-1 雨量检测功能测试表
|------|--------|-------|-----------|------|
| 测试序号 | 测试条件 | 传感器输出 | 串口显示 | 结果判断 |
| 1 | 传感器板干燥 | 高电平 | Rain: No | 正常 |
| 2 | 传感器板干燥 | 高电平 | Rain: No | 正常 |
| 3 | 滴1滴水滴 | 低电平 | Rain: Yes | 正常 |
| 4 | 滴1滴水滴 | 低电平 | Rain: Yes | 正常 |
| 5 | 滴3滴水滴 | 低电平 | Rain: Yes | 正常 |
| 6 | 滴5滴水滴 | 低电平 | Rain: Yes | 正常 |
| 7 | 传感器板湿润 | 低电平 | Rain: Yes | 正常 |
| 8 | 传感器板湿润 | 低电平 | Rain: Yes | 正常 |
| 9 | 擦干传感器板 | 高电平 | Rain: No | 正常 |
| 10 | 擦干传感器板 | 高电平 | Rain: No | 正常 |
测试结果表明,雨量传感器在干燥状态下输出高电平,串口显示无雨;在有水滴状态下输出低电平,串口显示有雨,响应迅速准确,满足系统设计要求。雨量检测测试过程如图5-2所示。
图5-2 雨量检测测试图
5.2.2 风速检测功能测试
风速检测功能测试旨在验证霍尔风速传感器能否准确检测风速变化,并正确产生脉冲信号触发单片机外部中断。测试时,用风扇在不同档位吹动风速传感器的风杯,观察串口输出的脉冲计数值。测试共进行6次,分别测试无风、低风速、中风速和高风速条件下的脉冲计数情况。测试结果如表5-2所示。
表5-2 风速检测功能测试表
|------|------|---------|----------|------|
| 测试序号 | 风扇档位 | 10秒脉冲计数 | 计算每分钟脉冲数 | 结果判断 |
| 1 | 关闭 | 0 | 0 | 正常 |
| 2 | 1档 | 15 | 90 | 正常 |
| 3 | 1档 | 16 | 96 | 正常 |
| 4 | 2档 | 32 | 192 | 正常 |
| 5 | 3档 | 48 | 288 | 正常 |
| 6 | 3档 | 50 | 300 | 正常 |
测试结果表明,霍尔风速传感器在不同风速下均能产生相应频率的脉冲信号,单片机能够准确捕获脉冲并进行计数,脉冲频率随风速增加而增加,满足系统设计要求。风速检测测试过程如图5-3所示。
图5-3 风速检测测试图
5.2.3 步进电机控制功能测试
步进电机控制功能测试旨在验证步进电机能否按照控制指令正确执行正转和反转动作,并实现窗户的开启和关闭模拟。测试时,通过串口发送指令或通过按键控制电机运转,观察步进电机的转动方向、转动平稳性和停止位置。测试共进行10次,分别测试正转开窗、反转关窗、连续正反转和电机停止等操作。测试结果如表5-3所示。
表5-3 步进电机控制功能测试表
|------|-------|-------|------|------|------|
| 测试序号 | 控制指令 | 电机动作 | 转动方向 | 运行状态 | 结果判断 |
| 1 | 开窗按键 | 正转3秒 | 顺时针 | 平稳 | 正常 |
| 2 | 关窗指令 | 反转3秒 | 逆时针 | 平稳 | 正常 |
| 3 | 开窗按键 | 正转3秒 | 顺时针 | 平稳 | 正常 |
| 4 | 开窗按键 | 正转3秒 | 顺时针 | 平稳 | 正常 |
| 5 | 关窗指令 | 反转3秒 | 逆时针 | 平稳 | 正常 |
| 6 | 关窗指令 | 反转3秒 | 逆时针 | 平稳 | 正常 |
| 7 | 开窗按键 | 正转3秒 | 顺时针 | 平稳 | 正常 |
| 8 | 连续正反转 | 交替正反转 | 交替 | 平稳 | 正常 |
| 9 | 电机停止 | 停止 | 无 | 无 | 正常 |
| 10 | 长时间运行 | 正转10秒 | 顺时针 | 平稳 | 正常 |
测试结果表明,步进电机能够准确响应控制指令,正转和反转动作正确,运行平稳,无失步或抖动现象,满足系统设计要求。步进电机控制测试过程如图5-4所示。
图5-4 步进电机控制测试图
5.2.4 自动关窗功能测试
自动关窗功能测试旨在验证系统能否在检测到雨量或风速超过阈值时自动执行关窗操作。测试时,分别模拟有雨状态和强风状态,观察系统是否自动控制步进电机关闭窗户。测试共进行8次,分别测试雨量触发关窗、风速触发关窗以及两种条件同时触发关窗的情况。测试结果如表5-4所示。
表5-4 自动关窗功能测试表
|------|---------|---------|------|------|------|
| 测试序号 | 测试条件 | 传感器状态 | 关窗动作 | 响应时间 | 结果判断 |
| 1 | 模拟降雨 | 雨量检测到雨 | 执行关窗 | 1秒 | 正常 |
| 2 | 模拟降雨 | 雨量检测到雨 | 执行关窗 | 1秒 | 正常 |
| 3 | 风扇1档吹风 | 风速脉冲90 | 不执行 | - | 正常 |
| 4 | 风扇2档吹风 | 风速脉冲192 | 执行关窗 | 2秒 | 正常 |
| 5 | 风扇3档吹风 | 风速脉冲288 | 执行关窗 | 2秒 | 正常 |
| 6 | 同时降雨和强风 | 两者均触发 | 执行关窗 | 1秒 | 正常 |
| 7 | 无雨无风 | 均未触发 | 不执行 | - | 正常 |
| 8 | 先雨后风 | 雨量触发 | 执行关窗 | 1秒 | 正常 |
测试结果表明,系统能够准确识别雨量超过阈值和风速超过阈值的情况,并在检测到触发条件后自动执行关窗操作,响应时间在2秒以内,满足系统设计要求。自动关窗功能测试过程如图5-5所示。
图5-5 自动关窗功能测试图
5.3 本章小结
本章对基于STC89C52单片机的自动开窗器系统进行了全面的测试与分析,包括系统整体测试、雨量检测功能测试、风速检测功能测试、步进电机控制功能测试、自动关窗功能测试和手动控制功能测试。测试结果表明,系统各功能模块工作正常,雨量传感器能够准确检测雨滴状况,霍尔风速传感器能够准确检测风速变化,步进电机能够按照指令正确运转,自动关窗功能在雨量或风速超过阈值时能够可靠执行,手动控制功能响应准确。系统整体运行稳定可靠,各项性能指标均达到设计要求,验证了系统设计的合理性和可行性。
第六章 结论与展望
6.1 总结
本文基于智能家居应用背景,针对传统窗户在应对突发天气变化时存在的不足,设计了一套基于STC89C52单片机的自动开窗器系统。系统以STC89C52单片机为核心控制器,集成雨量传感器和霍尔风速传感器实现环境参数采集,通过步进电机驱动窗户自动启闭,并保留了手动控制功能,实现了窗户的智能化控制。在硬件设计方面,完成了单片机最小系统电路、雨量传感器电路、霍尔风速传感器电路、步进电机驱动电路、按键输入电路和串口通信电路的原理设计与连接调试,明确了各模块的引脚分配和信号接口。在软件设计方面,采用模块化编程思想,实现了主程序控制、定时器中断、外部中断、步进电机控制、按键检测和串口通信等功能,完成了传感器数据采集、阈值判断和电机控制等核心任务。
经过系统测试验证,雨量传感器能够准确检测雨滴状况,响应迅速;霍尔风速传感器能够准确检测风速变化,脉冲计数准确;步进电机控制平稳可靠,能够按指令执行正反转动作;自动关窗功能在雨量或风速超过阈值时能够可靠执行,响应时间在2秒以内;手动控制功能响应准确。系统整体运行稳定,各项功能均达到设计要求。本设计结构简洁、成本低廉、运行可靠,具有一定的实用价值和推广前景,为智能家居窗户控制提供了一种可行的解决方案。
6.2 展望
虽然本设计实现了自动开窗器的基本功能,但在系统功能和性能方面仍有改进和扩展的空间。在传感器应用方面,当前系统仅检测雨量和风速,后续可增加温度传感器、湿度传感器、光照传感器和空气质量传感器,实现更多环境参数的采集,使窗户控制更加智能化。例如,可根据室内温度和湿度自动调节窗户开合度,改善室内空气质量;可根据光照强度自动控制遮阳帘或窗户开启角度,实现节能控制。在控制策略方面,当前系统采用固定阈值判断方式,后续可引入模糊控制或PID控制算法,根据传感器数据的连续变化趋势进行智能判断,使窗户控制更加平滑和合理。在通信功能方面,当前系统仅通过串口输出调试信息,后续可增加WiFi或蓝牙模块,实现与手机APP的无线连接,用户可远程查看窗户状态并手动控制,进一步提升系统的便利性。在电源管理方面,可增加太阳能充电电路和备用电池,使系统在停电情况下仍能正常工作。在机械结构方面,可优化步进电机与窗户的传动机构,提高系统的适应性和安装便捷性。通过这些改进和完善,自动开窗器系统将更加智能、实用,更好地满足智能家居的应用需求。
参考文献
01 潘立言,李奕凡,潘涵,等.基于物联网的多功能智能窗户设计J.物联网技术,2022,12(03):102-106.
02 黄晓斌.一种基于STM32单片机的多功能智能家居控制系统D.西安电子科技大学,2021.
03 朱嫣锦.基于物联网的门窗智能启闭器设计J.光源与照明,2021,(12):70-71.
04 周婷.项目化教学在单片机技术课程中的应用J.化纤与纺织技术,2021,50(06):165-166.
05 付瑞玲,刘晨,马晨曦,等.基于OneNET平台的语音控制室内环境监测系统设计J.黄河科技学院学报,2024,26(08):75-80.
06 韩增祺,柳美平,李循珠,等.基于单片机的智能火灾报警器设计J.电子制作,2022,30(09):73-75.
07 王鹏.基于嵌入式的智能养老院监控系统D.长春工程学院,2020.
08 秦凯.基于物联网技术的无线智能家居系统的设计与实现D.浙江科技大学,2024.
09 李志伟,东伟,赵战国.基于51单片机与GSM的GPS卫星定位系统设计J.机械工程与自动化,2024,(02):130-132.
10 杨万宇.中小功率隔离型电源系统的研究与设计D.福建工程学院,2023.
11 胡如福.物联网技术与LTE无线通信技术结合的策略分析J.信息记录材料,2023,24(11):66-68+72.
12 孙振华.基于ZigBee技术的小区照明系统的设计J.物联网技术,2025,15(02):124-127.
13 王飞.基于WiFi的语音矿灯设计J.工矿自动化,2022,48(01):98-102.
14 Sabit H .Artifical Intelligence-Based Smart Security System Using Internet of Things for Smart Home ApplicationsJ.Electronics,2025,14(3):608-608.
15 J Wang, Liu Q . Analysis and Research of Mine Cable Fault Point Finding Method Based on Single Chip Microcomputer and FPGA TechnologyM. 2020.
致谢
本论文的顺利完成,离不开导师的悉心指导和帮助。从课题选择、方案设计到系统调试和论文撰写,导师都给予了耐心的指导和宝贵的建议。导师严谨的治学态度、渊博的专业知识和勤勉的工作作风使我深受感染和启发,这些都将成为我今后学习和工作中的宝贵财富。在此,谨向导师致以最诚挚的感谢和崇高的敬意。
感谢学院各位老师在大学期间的辛勤教导和帮助,老师们的谆谆教诲使我掌握了扎实的专业知识和实践技能,为本次毕业设计的顺利完成奠定了坚实基础。感谢实验室的同学们在系统调试过程中提供的帮助和建议,在遇到技术难题时,大家的讨论和交流给予了我很多启发。
感谢我的家人,你们的理解、支持和鼓励是我完成学业的坚强后盾。在论文写作期间,你们给予了我充分的信任和包容,让我能够专心投入到研究工作中。最后,向所有关心和帮助过我的老师、同学和朋友表示衷心的感谢。由于本人水平有限,论文中难免存在不足之处,恳请各位老师和专家批评指正。
附录 A 电路图

附录 B 程序代码
#include <reg52.h>
// 硬件引脚定义
sbit RAIN_SENSOR = P2^0; // 雨水传感器,高电平有雨,低电平无雨
sbit KEY_OPEN = P0^7; // 开窗按键,按下为低电平
// 步进电机控制引脚 P2.4 - P2.7
sbit MOTOR_A = P2^4;
sbit MOTOR_B = P2^5;
sbit MOTOR_C = P2^6;
sbit MOTOR_D = P2^7;
// 步进电机控制常量
#define STEP_DELAY 2 // 每步延时(ms)
// 正转相序 (A->B->C->D) 开窗
unsigned char code FWD_PHASE4 = {0x10, 0x20, 0x40, 0x80};
// 反转相序 (D->C->B->A) 关窗
unsigned char code REV_PHASE4 = {0x80, 0x40, 0x20, 0x10};
// 全局变量
volatile unsigned int pulse_count = 0; // 10秒内霍尔脉冲计数
volatile unsigned int pulse_per_min = 0; // 计算出的每分钟脉冲数
bit window_open = 0; // 窗户状态:0关,1开
bit motor_busy = 0; // 电机忙标志
bit second_flag = 0; // 每秒标志
unsigned char key_last = 1; // 按键上一次状态
// 定时器0中断中使用的静态变量(改为文件作用域)
static unsigned int cnt_50ms = 0; // 50ms中断计数器,用于产生秒标志
static unsigned int cnt_10s = 0; // 50ms中断计数器,用于10秒周期
// 定时器0重装初值(50ms @12MHz)
#define TIMER0_RELOAD_H 0x3C
#define TIMER0_RELOAD_L 0xB0
// 串口发送一个字符
void uart_send_char(unsigned char ch) {
SBUF = ch;
while (!TI);
TI = 0;
}
// 串口发送字符串
void uart_send_string(unsigned char *str) {
while (*str) {
uart_send_char(*str++);
}
}
// 串口发送无符号整数(十进制)
void uart_send_uint(unsigned int num) {
unsigned char buf6;
unsigned char i = 0;
if (num == 0) {
uart_send_char('0');
return;
}
while (num > 0) {
bufi++ = (num % 10) + '0';
num /= 10;
}
while (i > 0) {
uart_send_char(buf--i);
}
}
// 毫秒级延时函数(12MHz粗略延时)
void delay_ms(unsigned int ms) {
unsigned int i, j;
for (i = 0; i < ms; i++)
for (j = 0; j < 125; j++);
}
// 步进电机控制函数
// dir: 0-正转(开窗),1-反转(关窗)
// time_ms: 转动持续时间(ms)
void motor_rotate(bit dir, unsigned int time_ms) {
unsigned int steps;
unsigned int i;
unsigned char phase_index = 0;
unsigned char current_p2_low;
if (motor_busy) return;
motor_busy = 1;
steps = time_ms / STEP_DELAY;
for (i = 0; i < steps; i++) {
current_p2_low = P2 & 0x0F;
if (dir == 0) {
P2 = current_p2_low | FWD_PHASEphase_index;
} else {
P2 = current_p2_low | REV_PHASEphase_index;
}
phase_index = (phase_index + 1) % 4;
delay_ms(STEP_DELAY);
}
P2 = P2 & 0x0F; // 停止电机
motor_busy = 0;
}
// 定时器0初始化:50ms中断一次
void timer0_init() {
TMOD &= 0xF0;
TMOD |= 0x01;
TH0 = TIMER0_RELOAD_H;
TL0 = TIMER0_RELOAD_L;
ET0 = 1;
TR0 = 1;
}
// 外部中断0初始化:下降沿触发
void ex0_init() {
IT0 = 1;
EX0 = 1;
}
// 串口初始化:9600bps @11.0592MHz
void uart_init() {
SCON = 0x50;
TMOD &= 0x0F;
TMOD |= 0x20;
TH1 = 0xFD;
TL1 = 0xFD;
TR1 = 1;
TI = 1;
}
// 定时器0中断服务程序
void timer0_isr() interrupt 1 {
TH0 = TIMER0_RELOAD_H;
TL0 = TIMER0_RELOAD_L;
cnt_50ms++;
if (cnt_50ms >= 20) { // 1秒到
cnt_50ms = 0;
second_flag = 1;
}
cnt_10s++;
if (cnt_10s >= 200) { // 10秒到
cnt_10s = 0;
pulse_per_min = pulse_count * 6;
pulse_count = 0;
}
}
// 外部中断0服务程序
void ex0_isr() interrupt 0 {
pulse_count++;
}
void main() {
unsigned char rain_status;
unsigned char key_current;
timer0_init();
ex0_init();
uart_init();
EA = 1;
uart_send_string("System Started.\r\n");
while (1) {
// 按键检测
if (KEY_OPEN == 0)
{
delay_ms(20);
if (KEY_OPEN == 0)
{
if (window_open == 0 && motor_busy == 0) {
uart_send_string("Key pressed: opening window...\r\n");
motor_rotate(0, 3000);
window_open = 1;
uart_send_string("Window opened.\r\n");
}
else
{
//uart_send_string("Window already open or motor busy.\r\n");
}
}
while(KEY_OPEN == 0);
}
// 每秒处理
if (second_flag) {
second_flag = 0;
// 读取雨水状态
rain_status = (RAIN_SENSOR == 1) ? 1 : 0; // 1有雨,0无雨
// 串口打印
uart_send_string("Rain: ");
uart_send_string(rain_status ? "Yes" : "No");
uart_send_string(", Pulse/min: ");
uart_send_uint(pulse_per_min);
uart_send_string("\r\n");
// 自动关窗
if (window_open == 1 && motor_busy == 0) {
if (rain_status == 1 || pulse_per_min > 100) {
uart_send_string("Condition met: closing window...\r\n");
motor_rotate(1, 3000);
window_open = 0;
uart_send_string("Window closed.\r\n");
}
}
}
}
}