题目 8 :智能台灯控制器
基于单片机设计智能台灯控制器,要求可以调节 LED 灯的亮度,实现定时开启与关闭,
根据光照自动开启与关闭功能。
具体要求如下:
(1)通过 PWM 功能调节 LED 灯亮度,亮度由高到低可分为 3 档,通过按键进行调节
并对当前档位进行指示。
(2)具有手动开启和关闭功能。
(3)能够显示并修改当前时间(如时分显示)
(4)可设置自动开启和关闭的时间,当到达开启时间时,LED 自动开启;当到达关闭
时间时,LED 自动关闭。
(5)通过光敏电阻感知外界光照条件,在光照模式开启的情况下,光照较低则 LED 自
动点亮,光照较高,LED 自动熄灭。(LED 开启和关闭的光照阈值尽量能够由用户定义)
可添加符合题目背景的其它功能。
智能台灯控制器
1 分为 定时开关机的自动模式、手动模式、光敏电阻控制模式,使用按键1切换模式,每个模式都有对应显示,可以方便看出当前是什么模式。三种模式平行存在,无包含关系。还有一个修改当前时间模式平行。
2 单片机采用定时器走时,有时分秒的时间显示,可以按键修改时分秒,设置当前的时间。
3 定时开关机的自动模式功能解释:按键设置开机时间点和关机时间点,当当前的时间处于时间段内小灯点亮,否则小灯熄灭。
4 手动模式功能解释:按键可以调节档位,也有相对应显示。
5 光敏电阻控制模式功能解释:光敏电阻检测到的电压来控制台灯亮度。
光照较低则 LED 自动点亮,光照较高,LED 自动熄灭
6 LED 开启和关闭的光照阈值能够由用户定义
7 按键规划
K1 切换模式:自动模式 手动模式 光敏电阻控制模式
K5 进入或者退出修改当前时间模式
定时开关机的自动模式下按键功能:
K2 切换选项
K3 加法
K4 减法
手动模式下按键功能:
K2 无作用
K3加档位
K4 减档位
光敏电阻控制模式下按键功能:
K2 无作用
K3 加光照阈值
K4 减光照阈值
修改当前时间模式下按键功能:
K2 切换选项
K3 加法
K4 减法
这段代码是一个基于AVR单片机的项目,用于实现LCD显示、ADC0832数据采集、PWM控制和按键输入功能。下面我将对其主要功能和实现方法进行详细介绍。
项目简介
该项目的核心功能包括:
- LCD显示:用于显示当前时间、模式和相关参数。
- ADC0832数据采集:通过ADC0832芯片采集模拟信号。
- PWM控制:用于调节输出PWM信号的占空比。
- 按键输入:实现多种模式切换和参数设置。
LCD显示功能
LCD显示模块用于显示各种信息,包括当前时间、模式状态和传感器数据。代码中通过SetCurPosition
函数设置LCD光标位置,LCD_write_com
和LCD_write_str
函数用于发送指令和字符串到LCD。LCD显示部分的代码示例如下:
void display(void) {
// 省略部分代码...
if (mode == 0) {
// 显示当前时间
// 省略部分代码...
} else if (mode == 1) {
// 显示手动模式
// 省略部分代码...
} else if (mode == 2) {
// 显示光强模式
// 省略部分代码...
} else if (mode == 3) {
// 显示时间设置模式
// 省略部分代码...
}
}
ADC0832数据采集
ADC0832是一个8位模数转换器,用于将模拟信号转换为数字信号。通过SPI协议与单片机进行通信。数据采集的核心函数是Get_AD_Result
,其实现如下:
unsigned char Get_AD_Result(unsigned char ch) {
// 省略部分代码...
return dat1; // 返回转换结果
}
PWM控制
PWM控制部分用于调节输出信号的占空比,从而控制连接设备的工作状态。通过设置OCR1A
寄存器来调整占空比。设置PWM占空比的函数如下:
void setPWM(unsigned int zhankongbi) {
OCR1A = zhankongbi; // 设置占空比
}
按键输入
按键输入部分用于实现模式切换和参数设置。通过读取PINF寄存器的值来检测按键状态,并根据按键的不同执行相应操作。按键检测的核心函数如下:
unsigned char getkey(void) {
// 省略部分代码...
return 0; // 返回按键值
}
主控制逻辑
主控制逻辑位于main
函数中,通过无限循环不断检测按键输入,更新显示和控制输出。其主要逻辑如下:
void main(void) {
system_init(); // 系统初始化
while (1) {
unsigned char key = getkey();
// 根据按键值更新模式和参数
if (key) {
// 省略部分代码...
}
display(); // 更新显示
contorl(); // 控制输出
}
}
具体功能实现
- 时间显示和设置:通过定时器中断更新当前时间,并通过按键设置定时时间。
- 自动模式:根据预设时间范围控制输出状态。
- 手动模式:用户通过按键手动设置输出状态。
- 光强模式:通过ADC0832采集光强信号,根据设定阈值控制输出状态。
通过这种模块化的设计,该项目能够实现多种模式下的灵活控制和显示功能,适用于需要多种输入输出控制的嵌入式系统应用。
资源:
https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?u=bdf8eeb84961492ba2b62f7bfee641ea&tab=BB08J2