往期内容
课设毕设分享:基于单片机的风扇控制器设计 (AT89C52、Proteus、Keil)一、初期准备+单片机最小系统(时钟电路、复位电路)手把手教学如何做一份高分课设
文章目录
前言
本文记录了通过使用Proteus8.17、KeilC51、AT89C52单片机进行课程设计:基于单片机的风扇控制器设计
声明:本文章在编写过程中,我始终致力于尊重并保护所有原创内容及其知识产权。然而,由于信息来源的多样性和复杂性,可能存在个别内容未明确标注出处、存在事实性错误或无意中侵犯了他人的知识产权的情况。对于任何可能存在的上述问题,我深感歉意,并在此提前向受影响的作者表示最诚挚的歉意。我始终秉持着尊重原创、维护知识产权的原则,绝无意侵犯任何人的合法权益。一旦收到您的反馈,我将立即核实并在第一时间内对文章进行修改。这包括但不限于补充相关引用信息、更正错误内容或删除涉嫌侵权的内容。再次感谢您的关注与支持,期待与您共同营造一个更加美好的知识共享空间。新手文章诸多不足,还望海涵
一、课设要求
1.基本要求
一、设计基础目标
我们的目标是设计一个能够根据环境温度自动调节风扇开关的控制器,同时提供手动控制选项。以下是各模块的具体需求:
二、硬件组成
基本硬件:
8051单片机。
时钟电路和复位电路。
温度传感器(推荐使用LM35)。
继电器驱动电路。
风扇电机。
按键输入模块。
显示模块(采用LED或LCD)。
三、软件设计
请编写控制程序,确保能够至少完成温度读取、风扇控制和显示功能。并且绘制软件流程图。
四、仿真与调试
请使用Proteus软件构建整个电路并进行仿真。
五、可选扩展功能
如果时间允许,自行定义扩展功能:
2.方案设定
首先进行前期准备工作
配置环境
Proteus8.17(该版本的优势在于其中含有更多ST的单片机,在日后的记录分享里将进行展示)
Keil5 C51版本(使用MDK版本无法驱动51内核的单片机)
Visio(该软件是为绘制程序流程图的)
绘制思维导图
功能要求分析
本课设项目旨在设计一种基于 AT89C52 单片机的智能风扇控制器,此项目的主要功能需求体现在多方面,不仅涵盖环境监测、设备控制,还考虑了用户互动与安全防护。为了有效满足功能需求,系统将由多个模块协同工作,具体功能要求如下:
(1)环境监测反馈功能
(2)风扇自动调节功能
(3)功能模式选择功能
(4)风扇摇头控制功能
(5)加热模块控制功能
(6)全局紧急停止功能
(7)高温上限设置功能
(8)声光报警提示功能
综上所述,本课设项目的功能设计将热舒适性与用户体验放在首位,通过多种功能的灵活组合,为用户提供一个高效、智能、贴心的环境调节方案。确保了功能的全面性与操作的简便性,更进一步提升了现代智能家居的实际应用价值。
大致方案设计
本课设项目的目标是设计一个基于 AT89C52 单片机的智能风扇控制器,以实现对环境温湿度的高效管理和控制。
为此,系统整体方案设计分为三种主要的运行模式:自动监测控制模式、手动控制模式以及高温报警设置模式。
二、DHT11温湿度传感器
最小系统已经在前面的文章中绘制完成,本文紧跟之前的文章
课设毕设分享:基于单片机的风扇控制器设计 (AT89C52、Proteus、Keil)一、初期准备+单片机最小系统(时钟电路、复位电路)手把手教学如何做一份高分课设
1.DHT11
DHT11温湿度传感器是一款低成本且高效的环境监测设备,具备简单的电路结构及易于使用的特性。它通常有三个引脚:VCC供电引脚、GND接地引脚,以及用于数据传输的SDA引脚。DHT11采用单总线通信协议,这意味着所有数据通过这一根SDA线传送,并且在这一过程中使用的是半双工模式,即在数据传输的同一时刻只能单向传输。其通信方式与IIC(Inter-Integrated Circuit)协议类似,二者都依赖时钟信号确保数据的同步传输。
在电路设计中,SDA线通过上拉电阻连接到电源VCC,确保在空闲状态下保持高电平,这对于数据传输至关重要,如图3-3所示。当DHT11需要发送数据时,它会通过改变SDA线的电平状态向主控制器发出信号,从而开始数据传输。这种简单而有效的设计不仅提高了温湿度测量的准确性,还确保了信号的稳定性与可靠性,使得DHT11在家居自动化、气象监测等应用场合中得到广泛使用。
驱动程序
DHT11 温湿度传感器采用单总线协议进行数据传输,每次通信传输总计 40 位数据。这 40 位数据可以分为三个部分:前 16 位用于表示湿度,中间 16 位表示温度,最后 8 位为校验位。在读取数据时,单片机必须一次性接收这 40 位信息
在接收到数据后,首先会对校验位进行验证。只有在校验成功的情况下,才可以确定这次读取的温度和湿度值是准确的并可供使用。若校验失败,可能是由于时序错误,或者传感器本身存在问题,此时应丢弃这次读取的结果,无需进行数据处理。这样确保了获取的温湿度数据的可靠性,提高了系统的稳定性和精准性。
三、程序代码
#include "main.h"
#include "reg52.h"
#include "typedef.h"
#include "drvdht11.h"
#include "oled.h"
#include "intrins.h"
#include "delay.h"
#include "key.h"
#include "relay.h"
u8 temp_val, humi_val; // 定义温度和湿度值的全局变量
u8 temp_up = 40;
u8 temp_down = 30;
u8 temp_turn = 40;
// 函数:delay_10us
// 功能:实现10微秒的延时
void delay_10us(void)
{
_nop_(); // 执行NOP指令,延时
_nop_(); // 重复NOP指令以增加延时
_nop_();
_nop_();
_nop_();
_nop_();
}
// 函数:dht11_start
// 功能:启动与DHT11传感器的通信,发送起始信号
void dht11_start(void)
{
DHT11_IO = 1; // 先将DHT11_IO设置为高电平
delay_10us(); // 延时10微秒
DHT11_IO = 0; // 拉低DHT11_IO线,开始通信
delay_ms(20); // 保持低电平至少20毫秒
DHT11_IO = 1; // 然后拉高DHT11_IO线
delay_10us(); // 延时10微秒
delay_10us(); // 再延时10微秒
delay_10us(); // 再延时10微秒
delay_10us(); // 再延时10微秒
}
// 函数:dht11_stop
// 功能:结束与DHT11传感器的通信
void dht11_stop(void)
{
delay_10us(); // 延时10微秒
delay_10us(); // 再延时10微秒
delay_10us(); // 再延时10微秒
delay_10us(); // 再延时10微秒
delay_10us(); // 再延时10微秒
DHT11_IO = 1; // 拉高DHT11_IO线,结束通信
}
// 函数:dht11_data_get
// 功能:从DHT11传感器读取一个字节的数据
// 返回值:返回读取到的字节数据
uint8_t dht11_data_get(void)
{
uint8_t i, dat = 0; // 定义循环计数器i和数据变量dat
for (i = 0; i < 8; i++) // 循环8次以读取一个字节
{
while (!DHT11_IO); // 等待DHT11_IO变为高电平
dat <<= 1; // 数据左移一位,为新读入的位腾出空间
delay_10us(); // 延时10微秒,准备读取数据
// 延时50us,若DHT11_IO还为高则说明数据为1, 否则为0
delay_10us();
delay_10us();
delay_10us();
delay_10us();
if (DHT11_IO) // 判断DHT11_IO是高还是低
dat++; // 数据为1时,将dat加1,接收数据1
while (DHT11_IO); // 等待DHT11_IO变为低电平
}
return dat; // 返回读取到的数据
}
// 函数:TEM_CON
// 功能:根据温度值控制风扇的运行模式
void TEM_CON()
{
if(temp_turn<temp_down)
{
temp_turn=temp_down;
}
// 根据读取到的温度值控制风扇的运行状态
if(temp_val > temp_turn) {
BUZZER_CON(10); // 温度大于40°C,触发蜂鸣器
FAN_control(4); // 启动风扇4
} else if(temp_val > temp_down) {
FAN_control(3); // 温度大于30°C,启动风扇3
} else if(temp_val > 25) {
FAN_control(2); // 温度大于25°C,启动风扇2
} else if(temp_val > 20) {
FAN_control(1); // 温度大于20°C,启动风扇1
} else if(temp_val > 15){
FAN_control(0); // 温度低于20°C,关闭所有风扇
}
else{
FAN_control(2); // 温度低于15°C,启动风扇2
HOT = 1; // 启动加热状态,吹暖风
LEDPINK = 0; // 粉灯亮
}
OLED_ShowString(48, 4, "AUTO "); // 在OLED显示"自动"
}
// 函数:dht11_data_read
// 功能:读取DHT11传感器的数据,并显示在OLED上
void dht11_data_read(void)
{
uint8_t buf[5]; // 数据缓冲区,用于存储读取到的5个字节数据
dht11_start(); // 启动DHT11传感器通信
if(!DHT11_IO) { // 检查DHT11_IO是否为低电平,表示传感器准备好发送数据
while(!DHT11_IO); // 等待DHT11_IO变为高电平,表示传感器发送数据
// 延时80微秒,准备读取数据
delay_10us();
delay_10us();
delay_10us();
delay_10us();
delay_10us();
delay_10us();
delay_10us();
delay_10us();
// 读取温湿度数据
buf[0] = dht11_data_get(); // 湿度值低字节
buf[1] = dht11_data_get(); // 湿度值高字节
buf[2] = dht11_data_get(); // 温度值低字节
buf[3] = dht11_data_get(); // 温度值高字节
buf[4] = dht11_data_get(); // 校验和
dht11_stop(); // 结束通信
// 数据校验
// 如果数据校验和正确,将获取的温湿度值赋给全局变量
if ((buf[0] + buf[1] + buf[2] + buf[3]) == buf[4])
{
temp_val = buf[2]; // 提取温度值
humi_val = buf[0]; // 提取湿度值
}
// 在OLED上显示温度和湿度值
OLED_ShowNum(48, 0, temp_val, 2, 16); // 显示温度
OLED_ShowNum(48, 2, humi_val, 2, 16); // 显示湿度
}
}
程序流程图如下
四、总体演示效果
提前将基础的原理图展示出来作为分享。作为提前预告督促自己尽快爆肝。
总结
经过一个充实而忙碌的夜晚,我满怀热情地撰写了一篇关于单片机课设的文章,虽然已尽力详尽,但深知文章中仍不免有诸多省略和未及细讲之处。对于那些在阅读过程中仍感意犹未尽、存有疑问的同学,建议大家不妨拓宽视野,多阅读几篇来自不同作者、风格各异的优秀文章。相信通过多角度、多层次的学习,你们定能集百家之长从而对单片机有更加深入和全面的理解。
在此,我的初衷不仅是为初学者提供一份学习路上的指引,也是对自己学习历程的一次回顾与总结。通过分享,我希望能激发更多人对单片机技术的兴趣,共同探索这片充满挑战与机遇的领域。
为了保持内容的连贯性和避免不必要的重复,我计划在未来的博客中,对于本文中已提及但未深入展开的话题,将通过链接的方式引导大家回到本文进行查阅。同时,我也将不断优化和完善文章内容,力求为大家提供更加准确、全面、易于理解的学习资源。
下期预告——关于OLED显示屏驱动的学习分享。
感谢大家的关注与支持