
课程设计题三十五:风扇模拟控制系统设计
设计内容:1、3个独立按键分别控制“自然风”、“睡眠风”、“常风”,(三者的区别是直流电机的停歇时间不同),并在数显管上显示出区别
2、每种类型风可以根据按下独立按键次数分为4个档的风力调节。
3、设计风扇的过热保护,用继电器实现。即当风扇运行一段时间后,暂停10秒。
4、其他创新内容(如报警提示)
按键1
1234档位
按键2 5678档位
按键3 9 10 11 12档位


本实验旨在设计一个模拟风扇控制系统,该系统通过三个独立按键来控制不同类型的风(自然风、睡眠风和常风),并且能够在数码管上显示风速档位。每种类型的风可以根据按键次数调节为四个档位。此外,还设计了风扇的过热保护功能,通过继电器实现,当风扇运行一段时间后暂停10秒。系统还增加了报警提示功能,当风扇运行时间过长时会发出报警。
单片机: 使用51单片机(AT89S51)。
继电器: 用于控制风扇的通断,实现过热保护功能。
数码管: 用于显示当前风速档位。
按键: 三个独立按键用于选择不同的风类型,并调节风速档位。
蜂鸣器: 用于在风扇运行时间过长时发出报警。
按键连接: 按键1、2、3分别连接到P1.5、P1.6、P1.7。
继电器: 继电器控制引脚连接到P3.6。
数码管: 段选引脚连接到P0,位选引脚连接到P2。
蜂鸣器: 蜂鸣器控制引脚连接到P3.7。
风扇控制系统的电路设计中,主要部分包括按键输入、数码管显示、继电器控制和蜂鸣器报警。
按键输入: 三个按键用于选择不同的风类型,并通过短按多次实现风速档位的调节。
数码管显示: 数码管用于显示当前的风速档位。通过定时器中断刷新显示内容。
继电器控制: 通过继电器实现风扇的开关控制,定时器中断用于实现过热保护功能,即风扇运行一段时间后暂停10秒。
蜂鸣器报警: 当风扇连续运行时间超过设定值时,蜂鸣器发出报警提示用户。
程序主要包括以下几个模块:
按键扫描: 检测按键状态,根据按键次数调节风速档位。
定时器中断: 通过定时器中断实现PWM控制风扇速度、刷新数码管显示和过热保护功能。
风速调节: 根据按键选择和档位调整PWM占空比,实现不同风速控制。
过热保护: 通过定时器中断计时,控制继电器实现风扇的定时暂停功能。
报警提示: 通过定时器中断计时,当风扇连续运行时间过长时触发蜂鸣器报警。
按键扫描函数 KeySscan 用于检测按键状态,返回相应的按键编号。
c展开代码unsigned char KeySscan(void) {
    if (key_01 == 0) {
        delay_ms_key(10);
        if (key_01 == 0) {
            while (key_01 == 0);
            return 1;
        }
    }
    if (key_02 == 0) {
        delay_ms_key(10);
        if (key_02 == 0) {
            while (key_02 == 0);
            return 2;
        }
    }
    if (key_03 == 0) {
        delay_ms_key(10);
        if (key_03 == 0) {
            while (key_03 == 0);
            return 3;
        }
    }
    return 0;
}
定时器1和定时器0的初始化设置用于生成PWM波形和计时。
c展开代码void init_timer1(void) {
    TMOD |= 0x10; // 定时器1为工作方式1 16bit
    TH1 = (65536 - 500) / 256;
    TL1 = (65536 - 500) % 256;
    ET1 = 1; // 开定时器1中断
    TR1 = 1; // 开定时器
    EA = 1; // 开总开关
    TMOD |= 0x01;
    TH0 = (65536 - 4000) / 256;
    TL0 = (65536 - 4000) % 256;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
}
根据按键选择和档位调整PWM占空比,实现不同风速控制。
c展开代码void main() {
    u8 key;
    u8 fengli = 1;
    RELAY = 1; // 打开风扇
    BEEP = 1; // 关闭蜂鸣器
    init_timer1();
    ENA_PWM_data = fengli * 7;
    seg_disp[2] = fengli / 10;
    seg_disp[3] = fengli % 10;
    while (1) {
        key = KeySscan();
        if (key != 0) {
            if (key == 1) {
                if (fengli <= 4) {
                    fengli++;
                    if (fengli > 4) {
                        fengli = 1;
                    }
                } else {
                    fengli = 1;
                }
            } else if (key == 2) {
                if ((fengli <= 8) && (fengli >= 5)) {
                    fengli++;
                    if (fengli > 8) {
                        fengli = 5;
                    }
                } else {
                    fengli = 5;
                }
            } else if (key == 3) {
                if (fengli >= 9) {
                    fengli++;
                    if (fengli > 12) {
                        fengli = 9;
                    }
                } else {
                    fengli = 9;
                }
            }
            ENA_PWM_data = fengli * 7;
            seg_disp[2] = fengli / 10;
            seg_disp[3] = fengli % 10;
        }
    }
}
定时器1的中断服务程序用于生成PWM波形控制风速。
c展开代码void timer1_server(void) interrupt 3 {
    TH1 = (65536 - 500) / 256;
    TL1 = (65536 - 500) % 256;
    pwm_count++;
    if (pwm_count == 100) {
        pwm_count = 0;
        ENA = 1;
    }
    if (ENA_PWM_data == pwm_count) {
        ENA = 0;
    }
}
通过定时器中断实现过热保护功能和报警提示。
c展开代码void T1_time() interrupt 1 {
    TH0 = (65536 - 4000) / 256;
    TL0 = (65536 - 4000) % 256;
    jishi++;
    if (jishi == 250) {
        jishi = 0;
        if (ifg == 1) {
            guanbi_time++;
            if (guanbi_time == 10) {
                ifg = 0;
                RELAY = 1;
                guanbi_time = 0;
            }
        } else {
            time_sec++;
            if (time_sec == 15) {
                ifg = 1;
                RELAY = 0;
                time_sec = 0;
            }
        }
        all_time_sec++;
        if (all_time_sec > 30) {
            BEEP = 0;
        }
    }
    jishua = (jishua + 1) % 12;
    P0 = ~0x00;
    if (jishua == 0) {
        P2 = 0x01;
        P0 = ~LEDData[seg_disp[0]];
    } else if (jishua == 1) {
        P2 = 0x02;
        P0 = ~LEDData[seg_disp[1]];
    } else if (jishua == 2) {
        P2 = 0x04;
        P0 = ~LEDData[seg_disp[2]];
    } else if (jishua == 3) {
        P2 = 0x08;
        P0 = ~LEDData[seg_disp[3]];
    }
}
本实验通过设计风扇模拟控制系统,学习了51单片机的基本操作,掌握了按键扫描、PWM控制、定时器中断、数码管显示和继电器控制等技术。通过实现不同类型的风速控制、过热保护和报警提示功能,增强了对单片机应用开发的理解和实践
bash展开代码https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2


本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!