课程设计题三十五:风扇模拟控制系统设计
设计内容: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
用于检测按键状态,返回相应的按键编号。
cunsigned 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波形和计时。
cvoid 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占空比,实现不同风速控制。
cvoid 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波形控制风速。
cvoid 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;
}
}
通过定时器中断实现过热保护功能和报警提示。
cvoid 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控制、定时器中断、数码管显示和继电器控制等技术。通过实现不同类型的风速控制、过热保护和报警提示功能,增强了对单片机应用开发的理解和实践
bashhttps://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2
本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!