1. 系统功能介绍
本设计基于STC89C52单片机,构建一套红外避障车辆高速汽车测速仪表系统。该系统通过红外避障传感器检测人体运动过程,计算并显示人体反应速度。主要功能包括:
- 利用两个红外避障传感器分别检测人体通过起点和终点的时间点,通过时间差计算人体反应速度(默认距离1米);
- 当第一个红外避障传感器检测到障碍物时,蜂鸣器发出提示音;
- LCD1602液晶显示当前检测到的人体反应速度,实时反馈结果;
- 系统具备稳定的供电和控制功能,保证测量数据的准确与实时显示。
本系统结构简单实用,适用于交通安全监测、人员运动速度测试等场景。
2. 系统电路设计
系统电路设计围绕STC89C52单片机展开,配合红外避障传感器、LCD1602液晶显示模块、蜂鸣器报警电路及电源模块,完成测速仪表的功能需求。以下将逐一详细介绍各个模块的电路设计。
2.1 STC89C52单片机核心电路
STC89C52单片机作为系统的控制核心,承担红外传感器数据采集、速度计算、LCD数据显示及蜂鸣器控制的任务。
- 电源部分采用稳定的5V直流供电,确保单片机正常工作;
- 采用12MHz晶振,确保系统时钟精确,满足测速的时间精度需求;
- 复位电路设计简单可靠,保证单片机能在断电后正确初始化;
- I/O口分配合理,确保与传感器、显示器和蜂鸣器的正常接口通讯。
2.2 红外避障传感器电路
系统采用两个红外避障传感器模块,分别作为起点和终点检测传感器。
- 传感器工作电压为5V,直接连接电源模块;
- 传感器输出信号线接至单片机对应的外部中断或普通I/O口,实现实时检测;
- 电路中配备必要的滤波电容和限流电阻,避免干扰影响测量准确性;
- 传感器位置固定,间距1米,保证计算速度的基础参数准确。
2.3 LCD1602液晶显示模块
LCD1602用于实时显示人体反应速度信息。
- 使用5V供电,接口采用标准并行数据通信;
- 接口线连接至单片机的GPIO口,通过程序控制显示内容;
- 显示内容包含速度值及相关提示信息,方便用户直观查看;
- 设计背光控制电路,保证显示效果在不同光照环境下均清晰可见。
2.4 蜂鸣器报警电路
蜂鸣器用于检测到起点红外避障时发出提示音。
- 蜂鸣器直接连接至单片机I/O口,通过软件控制通断;
- 电路中配备限流电阻保护蜂鸣器及单片机端口;
- 蜂鸣器声音清晰,能有效提示用户起点检测成功。
2.5 电源电路设计
3. 程序设计
程序设计包括传感器数据采集、中断处理、速度计算、LCD显示和蜂鸣器控制五大模块,代码逻辑清晰,功能模块划分合理,确保系统运行稳定且响应迅速。
3.1 传感器数据采集模块
- 通过轮询或中断方式检测两个红外避障传感器状态;
- 第一个传感器检测到障碍物时,记录时间戳并触发蜂鸣器;
- 第二个传感器检测到人体通过时,记录时间戳。
volatile unsigned long startTime = 0;
volatile unsigned long endTime = 0;
volatile bit startDetected = 0;
volatile bit endDetected = 0;
void Sensor1_ISR(void) interrupt 0 // 外部中断0处理函数
{
if (P3_2 == 0) // 传感器信号有效
{
startTime = Timer_Read();
startDetected = 1;
Buzzer_On();
}
}
void Sensor2_ISR(void) interrupt 2 // 外部中断1处理函数
{
if (P3_3 == 0) // 传感器信号有效
{
endTime = Timer_Read();
endDetected = 1;
}
}
3.2 速度计算模块
- 利用两个时间戳计算通过时间间隔;
- 根据固定距离1米,计算人体反应速度(单位m/s);
- 处理异常数据,保证显示结果合理有效。
float Calculate_Speed(void)
{
unsigned long timeInterval = endTime - startTime; // 时间差,单位根据定时器设定
if(timeInterval == 0) return 0;
float timeSec = timeInterval * TIMER_UNIT; // 定时器单位转换为秒
float speed = DISTANCE / timeSec; // 速度计算,距离除以时间
return speed;
}
3.3 LCD显示模块
- 实时刷新速度数据至LCD1602;
- 显示格式美观,支持单位显示和异常提示;
- 显示其他辅助信息,如“检测中”、“请通过传感器”等。
void LCD_Display_Speed(float speed)
{
char buf[16];
LCD_Clear();
LCD_ShowString(0,0,"Speed(m/s):");
sprintf(buf,"%.2f", speed);
LCD_ShowString(1,0,buf);
}
3.4 蜂鸣器控制模块
- 蜂鸣器只在第一个传感器触发瞬间鸣叫,提示开始检测;
- 使用定时器控制蜂鸣器鸣叫时间,防止长鸣;
void Buzzer_On(void)
{
P1_0 = 1; // 假设蜂鸣器连接P1.0
Delay_ms(200);
P1_0 = 0;
}
3.5 主程序流程设计
- 初始化所有硬件模块和中断;
- 主循环等待传感器触发事件;
- 触发完成后计算速度并显示;
- 复位状态等待下一轮检测。
void main(void)
{
System_Init();
while(1)
{
if(startDetected && endDetected)
{
float speed = Calculate_Speed();
LCD_Display_Speed(speed);
startDetected = 0;
endDetected = 0;
}
}
}
4. 代码完整示例
#include <reg52.h>
#include <stdio.h>
#define TIMER_UNIT 0.001 // 定时器单位,示例为1ms
#define DISTANCE 1.0 // 传感器间距,单位米
volatile unsigned long startTime = 0;
volatile unsigned long endTime = 0;
volatile bit startDetected = 0;
volatile bit endDetected = 0;
void Timer_Init(void);
unsigned long Timer_Read(void);
void Buzzer_On(void);
void LCD_Display_Speed(float speed);
void System_Init(void);
void Sensor1_ISR(void) interrupt 0
{
if(P3_2 == 0)
{
startTime = Timer_Read();
startDetected = 1;
Buzzer_On();
}
}
void Sensor2_ISR(void) interrupt 2
{
if(P3_3 == 0)
{
endTime = Timer_Read();
endDetected = 1;
}
}
float Calculate_Speed(void)
{
unsigned long timeInterval = endTime - startTime;
if(timeInterval == 0) return 0;
float timeSec = timeInterval * TIMER_UNIT;
float speed = DISTANCE / timeSec;
return speed;
}
void main(void)
{
System_Init();
while(1)
{
if(startDetected && endDetected)
{
float speed = Calculate_Speed();
LCD_Display_Speed(speed);
startDetected = 0;
endDetected = 0;
}
}
}
void System_Init(void)
{
Timer_Init();
// LCD, buzzer, sensor IO初始化代码
EA = 1;
EX0 = 1; // 外部中断0使能
EX1 = 1; // 外部中断1使能
}
void Buzzer_On(void)
{
P1_0 = 1;
Delay_ms(200);
P1_0 = 0;
}
void LCD_Display_Speed(float speed)
{
char buf[16];
LCD_Clear();
LCD_ShowString(0, 0, "Speed(m/s):");
sprintf(buf, "%.2f", speed);
LCD_ShowString(1, 0, buf);
}
// 其他硬件驱动及延时函数省略
5. 总结
基于STC89C52单片机的红外避障车辆高速汽车测速仪表设计,充分利用了红外传感技术和单片机高速计时能力,实现了对人体反应速度的准确测量和实时显示。系统结构简单,设计合理,硬件接口明确,软件模块功能清晰,响应速度快。蜂鸣器提示功能增强了系统的交互性,LCD显示模块让测速结果一目了然。整体方案稳定可靠,具有较强的实用价值,适用于交通安全、运动训练等领域。
191