1 系统功能介绍
本设计基于51单片机STC89C52,构建了一套汽车自动照明灯控制系统。系统集成了光敏电阻光照检测、超声波距离测量、手动与自动模式切换、远近光灯控制等功能,旨在实现白天关闭灯光、夜间自动开启远光灯,并根据前方障碍物距离自动切换近光灯和远光灯,保障驾驶安全,同时支持手动控制远近光灯。
系统主要功能包括:
- 通过光敏电阻检测环境光照强度,白天灯光关闭,夜晚自动开启远光灯,光照阈值可调节。
- 支持自动模式和手动模式两种控制方式,通过拨动开关切换,且有指示灯显示当前模式。
- 自动模式下,利用超声波模块检测前方障碍物距离,距离小于30cm自动切换近光灯,超过30cm切换远光灯。
- 手动模式下,支持按键控制远光灯与近光灯的切换。
- 系统通过4颗高亮白色LED模拟汽车灯光,黄绿LED作为模式指示灯,便于用户判断当前状态。
2 系统电路设计
2.1 单片机最小系统电路
本系统核心采用STC89C52单片机,配置如下:
单片机负责采集传感器数据、处理逻辑及控制灯光和指示灯。
2.2 光照检测模块(光敏电阻电路)
该模块由光敏电阻(LDR)与电位器组成分压电路,将光照强度转换为电压信号输入单片机的ADC口。通过调整电位器,用户可设置光照强度阈值,灵敏度调节方便。
主要组成:
系统通过单片机ADC采集此电压值,判断是否进入夜晚模式。
2.3 超声波测距模块(HC-SR04)
HC-SR04超声波模块用于测量前方物体距离,核心结构包括:
通过测量Echo脉冲宽度计算距离。单片机通过IO口控制Trig引脚,测量Echo脉冲时间,实现距离测量。
2.4 LED灯控制电路
- 远光灯与近光灯均由两颗白色高亮LED组成,共4颗白灯模拟。
- 采用单片机IO口直接驱动或通过三极管开关控制LED通断。
- 黄绿LED用于指示当前系统模式(自动或手动),其中黄灯亮表示自动模式,绿灯亮表示手动模式。
2.5 模式选择拨动开关及按键电路
- 拨动开关用于切换自动/手动模式,开关信号通过IO口读取,切换时对应指示灯点亮。
- 手动模式下,两个独立按键用于切换远光灯与近光灯。
- 按键采用上拉电阻设计,结合软件去抖动。
2.6 电源电路
系统统一采用5V直流电源,供单片机及传感器、LED使用。电源设计考虑滤波与抗干扰,保证系统稳定运行。
3 程序设计
3.1 系统初始化
系统启动时完成:
- 初始化单片机IO口,设置光敏电阻ADC输入、超声波控制IO、LED灯控制端口、按键和开关输入端口。
- 初始化定时器,用于超声波脉冲计时和按键消抖。
- 默认设置为自动模式,点亮对应指示灯。
void System_Init(void) {
ADC_Init();
LED_Init();
Ultrasonic_Init();
Key_Init();
Mode_Switch_Init();
Timer_Init();
Set_Auto_Mode();
}
3.2 光照检测与判断
读取ADC采集的光敏电阻电压值,与预设阈值比较。光照强度高于阈值,判定为白天,关闭灯;低于阈值,判定为夜晚,进入自动远光灯模式。
#define LIGHT_THRESHOLD 500 // 示例阈值
unsigned int Read_Light(void) {
return ADC_Read(LDR_CHANNEL);
}
bit Is_Night(void) {
if(Read_Light() < LIGHT_THRESHOLD) return 1;
else return 0;
}
3.3 超声波测距功能
通过控制Trig引脚发出10us脉冲,等待Echo引脚响应,通过计时计算距离。
#define SOUND_SPEED 340 // m/s
unsigned int Measure_Distance(void) {
unsigned int pulse_width;
unsigned int distance_cm;
Trig = 1;
delay_us(10);
Trig = 0;
pulse_width = Get_Echo_Pulse_Width();
distance_cm = (pulse_width * SOUND_SPEED) / (2 * 10000); // 计算距离cm
return distance_cm;
}
3.4 自动模式远近光灯切换
自动模式下:
- 先检测是否为夜晚(光敏电阻判定)
- 若夜晚,打开远光灯
- 测量距离,距离小于30cm时切换为近光灯;超过30cm切换为远光灯。
void Auto_Light_Control(void) {
if(Is_Night()) {
unsigned int dist = Measure_Distance();
if(dist < 30) {
Close_Far_Light();
Open_Near_Light();
} else {
Open_Far_Light();
Close_Near_Light();
}
} else {
Close_Far_Light();
Close_Near_Light();
}
}
3.5 手动模式控制
手动模式时:
- 按键1切换为远光灯
- 按键2切换为近光灯
- 根据按键状态控制LED灯的开关。
void Manual_Light_Control(void) {
if(Key1_Pressed()) {
Open_Far_Light();
Close_Near_Light();
}
if(Key2_Pressed()) {
Close_Far_Light();
Open_Near_Light();
}
}
3.6 模式切换处理
通过拨动开关检测模式,切换自动或手动模式,同时点亮对应的指示灯。
void Mode_Switch_Handler(void) {
if(Switch == AUTO_MODE) {
Set_Auto_Mode();
} else {
Set_Manual_Mode();
}
}
void Set_Auto_Mode(void) {
Auto_Mode = 1;
LED_Auto_On();
LED_Manual_Off();
}
void Set_Manual_Mode(void) {
Auto_Mode = 0;
LED_Auto_Off();
LED_Manual_On();
}
3.7 主循环程序
主循环检测模式,执行对应灯光控制。
void main(void) {
System_Init();
while(1) {
Mode_Switch_Handler();
if(Auto_Mode) {
Auto_Light_Control();
} else {
Manual_Light_Control();
}
delay_ms(100);
}
}
4 总结
本系统利用STC89C52单片机结合光敏电阻和超声波传感器,实现了汽车照明灯光的智能控制。通过光照传感实现昼夜自动判断,通过超声波传感实现前方障碍物距离检测,自动调节远近光灯,提升驾驶安全性。同时系统支持手动模式,满足驾驶者个性化需求。系统结构简洁,功能实用,具有良好的稳定性和扩展性,适合在智能汽车辅助驾驶领域应用。
186