都在强撑罢了 发表于 2024-6-5 22:00:42

Proteus 仿真89c51设计晾衣架

被单片机课程设计逼疯,三个人连夜查材料编程序做仿真失败n次,心碎了......
智能晾衣架设计
设计要求
(1)电机的转动是通过继电器控制的;
(2)开机初始时为智能模式,通过光敏自动识别光线强弱(白天或夜晚),采用DHT11温湿度传感器检测空气的湿度,数码管显示湿度值;
(3)当湿度小于80%时,电机会相应的白天伸出或夜晚收回衣架,碰触相应的限位行程开关,停止转动。如果外面的湿度达到80%以上时,即使是白天衣架也会自动收回。
(4)在实际应用中行程开关安装在晾衣架的上下限位处,当晾衣架上升或下降到极限时,会碰触行程开关(设计中只是模拟,需要用手碰触),行程开关会给单片机信号,从而防止过卷,安全无误;
(5)当按下遥控板上的切换按键,实现智能模式与手动模式的切换。手动模式按一下伸出或收回键电机相应的转动,再按一下停止,晾衣架到限位即手动碰触行程开关会停止转动。

FishC 发表于 2024-6-5 22:01:07

这个智能晾衣架设计的要求听起来是挺复杂的,但是我们可以一步一步来解决。首先,我们需要编写程序控制单片机,然后通过继电器控制电机的转动。

Step 1:配置 IO 端口
首先,我们需要配置 IO 端口用来控制继电器和行程开关。假设我们将继电器控制引脚接到 P2.0 端口,行程开关引脚接到 P3.0 和 P3.1 端口。那么我们需要在程序一开始就进行配置:

sbit relay = P2^0; // 继电器控制引脚
sbit limit_up = P3^0; // 上限位行程开关
sbit limit_down = P3^1; // 下限位行程开关

Step 2:配置 DHT11 温湿度传感器
接下来,我们需要配置 DHT11 温湿度传感器。这里我使用了一个已经封装好的 DHT11 库,你可以在网上搜索并下载这个库。下载好后,将库文件添加到 Proteus 中,并在程序中引入该库。

#include <DHT11.h> // 引入 DHT11 库

sbit DHT11_DAT=P2^7; // DHT11 数据引脚连接到 P2.7

DHT11 DHT11_obj; // 创建一个 DHT11 对象

Step 3:初始化程序
接下来,我们需要编写初始化程序,用于配置串口、继电器等。

void Init()
{
    EA = 1; // 允许全局中断
    TMOD = 0x20; // 设置计时器1为8位自动重载模式
    TH1 = 0xFD; // 波特率设置
    TCON = 0x69; // 启动计数器1
    PCON = 0x00; // 波特率不加倍
    SCON = 0x50; // 串口工作方式1
}

void main()
{
    Init(); // 初始化程序

    // 这里编写其他代码...
}

Step 4:读取光敏传感器和 DHT11 传感器数据
为了实现光敏自动识别光线强弱、检测空气湿度等功能,我们需要读取光敏传感器和 DHT11 传感器的数据。这里就不具体编写读取传感器数据的代码,你可以自行查找相关资料。

Step 5:编写自动模式和手动模式的代码
根据设计要求,我们需要分别编写自动模式和手动模式的代码。

在自动模式下,根据光敏传感器和 DHT11 传感器的数据判断是否需要伸出或收回晾衣架。

void AutoMode()
{
    while (1) {
      // 读取光敏传感器和 DHT11 传感器数据

      if (光线强度是白天 && 湿度小于80%) {
            // 控制晾衣架伸出
            relay = 1;
      } else {
            // 控制晾衣架收回
            relay = 0;
      }
    }
}

在手动模式下,通过按下遥控板上的按钮来控制晾衣架的转动。

void ManualMode()
{
    while (1) {
      if (按下伸出按钮) {
            // 控制晾衣架伸出
            relay = 1;
      } else if (按下收回按钮) {
            // 控制晾衣架收回
            relay = 0;
      }
    }
}

Step 6:处理行程开关信号
最后,我们需要编写处理行程开关信号的代码。当晾衣架达到极限位置时,行程开关会触发,从而发送信号给单片机停止转动。

void LimitSwitchInterrupt() interrupt 0
{
    if (limit_up == 0 || limit_down == 0) {
      // 行程开关触发,停止转动
      relay = 0;
    }
}

以上就是初步的代码框架,你可以根据实际情况进行修改和完善。希望能够帮助到你!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: Proteus 仿真89c51设计晾衣架