题2:温湿度监控系统设计
功能要求:
1)开机显示时间(小时、分)、时分可修改;
2)用两个滑动变阻器分别模拟温度传感器(测量范
围0-100度)与湿度传感器(0-100%),通过按键
可以在数码管切换显示当前温度值、湿度值;
3)当温度低于20度时,红灯长亮;
4)当湿度高于70%时,黄灯长亮;
5)当湿度正常时,绿灯亮;温度正常时蓝灯亮。
硬件调试:实现以上功能
本实验旨在设计一个温湿度监控系统,通过模拟温度和湿度传感器来测量环境参数,并根据设定的阈值控制不同颜色的指示灯。同时,系统还具备时间显示与修改功能,以满足基本的时钟需求。
时间显示与修改:系统开机后显示当前时间(小时、分钟),并允许用户通过按键修改时间。
温湿度显示:通过两个滑动变阻器分别模拟温度传感器(0-100度)和湿度传感器(0-100%),用户可通过按键在数码管上切换显示当前温度值和湿度值。
指示灯控制:
温度低于20度时,红灯长亮。
湿度高于70%时,黄灯长亮。
湿度在正常范围(≤70%)时,绿灯亮。
温度在正常范围(≥20度)时,蓝灯亮。
系统硬件主要由微控制器、数码管显示模块、滑动变阻器、按键矩阵和指示灯组成。
微控制器:负责读取传感器数据、处理逻辑并控制显示和指示灯。
数码管显示模块:用于显示时间、温度和湿度值。
滑动变阻器:模拟温度和湿度传感器,通过AD转换获取模拟量值。
按键矩阵:用于用户输入,修改时间和切换显示内容。
指示灯:根据温湿度值进行指示。
软件设计主要分为以下几个模块:
初始化模块:初始化各个端口、设置定时器、初始化显示内容。
按键检测模块:检测用户按键输入,并对时间进行修改或切换显示模式。
AD转换模块:获取滑动变阻器的模拟量值,转换为温度和湿度值。
显示模块:根据当前模式,显示时间、温度或湿度值。
指示灯控制模块:根据温湿度值,控制对应的指示灯状态。
数码管连接到微控制器的输出端口,用于显示数值。
滑动变阻器连接到AD转换器通道,用于模拟传感器输入。
按键矩阵连接到微控制器的输入端口,用于用户交互。
指示灯通过微控制器的输出端口控制,显示当前环境状态。
程序采用C语言编写,主要功能模块说明如下:
初始化各个端口、设置定时器并初始化显示内容:
cvoid main( void ) {
DDRA = 0XFF - 0X03;
DDRC |= 0X03;
DDRD = 0XFF;
DDRB = 0X00;
disp[0] = LED_Disbuf[rtc_hour % 100 / 10];
disp[1] = LED_Disbuf[rtc_hour % 10];
disp[2] = LED_Disbuf[rtc_min % 100 / 10];
disp[3] = LED_Disbuf[rtc_min % 10];
SREG = 0x80;
TIMSK |= (1 << TOIE0);
TCCR0 = 0x03;
TCNT0 = 0;
while (1) {
// 主循环
}
}
检测用户按键输入,用于修改时间和切换显示模式:
cint get_key( void ) {
if (PINB != 0XFF) {
if (PINB == 0xff - 0x01) return(1);
if (PINB == 0xff - 0x02) return(2);
// 检测其他按键
}
return(0);
}
获取滑动变阻器的模拟量值,并转换为温度和湿度值:
cvoid AD_GetData( void ) {
ADMUX = (1 << REFS0);
ADCSRA |= (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1);
ADCSRA |= (1 << ADSC);
while (!(ADCSRA & (1 << ADIF)));
ADCSRA |= (1 << ADIF);
ADData0 = ADC;
ADData0 = ((long) ADData0 * 5010 / 1024) / 50;
// 处理湿度传感器数据
}
根据当前模式,显示时间、温度或湿度值:
cif (mode == 0) {
disp[0] = LED_Disbuf[rtc_hour % 100 / 10];
disp[1] = LED_Disbuf[rtc_hour % 10];
disp[2] = LED_Disbuf[rtc_min % 100 / 10];
disp[3] = LED_Disbuf[rtc_min % 10];
} else if (mode == 1) {
disp[1] = LED_Disbuf[ADData0 / 100];
disp[2] = LED_Disbuf[ADData0 % 100 / 10];
disp[3] = LED_Disbuf[ADData0 % 10];
} else if (mode == 2) {
disp[1] = LED_Disbuf[ADData1 / 100];
disp[2] = LED_Disbuf[ADData1 % 100 / 10];
disp[3] = LED_Disbuf[ADData1 % 10];
}
根据温湿度值,控制指示灯的状态:
cif (ADData0 < 20) {
PORTA &= ~0x10; // 红灯亮
PORTA |= 0x20; // 蓝灯灭
} else {
PORTA &= ~0x20; // 红灯灭
PORTA |= 0x10; // 蓝灯亮
}
if (ADData1 > 70) {
PORTA &= ~0x40; // 黄灯亮
PORTA |= 0x80; // 绿灯灭
} else {
PORTA &= ~0x80; // 黄灯灭
PORTA |= 0x40; // 绿灯亮
}
通过调试和运行,系统实现了预期的功能。开机后显示当前时间,并能通过按键修改时间;模拟温度和湿度传感器的数据,并能在数码管上切换显示当前温度和湿度值;根据温湿度值控制指示灯的状态,温度低于20度红灯长亮,湿度高于70%黄灯长亮,湿度正常绿灯亮,温度正常蓝灯亮。
本实验通过设计一个温湿度监控系统,结合了AD转换、按键检测、数码管显示和指示灯控制等多项技术,全面锻炼了硬件和软件设计能力。系统在实际运行中表现稳定,达到了预期效果。
https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?u=bdf8eeb84961492ba2b62f7bfee641ea&tab=BB08J2
本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!