实验报告:智能小车系统设计与实现
一、背景介绍
本实验旨在设计并实现一个基于STC89C52单片机控制的智能小车系统。该系统通过超声波传感器进行避障,通过红外接收器实现远程控制,同时具备循迹功能。整个系统的核心是单片机,它通过对各种传感器和执行器的控制,实现智能小车的多种功能。
二、硬件介绍
- STC89C52单片机:主控芯片,负责处理所有传感器数据及控制信号。
- 红外接收器:接收遥控器的信号,实现远程控制。
- 超声波传感器:用于检测前方障碍物的距离,进行避障处理。
- 电机及驱动模块:控制小车的运动,包括前进、后退、左转、右转等。
- LCD1602显示屏:用于显示当前小车的状态信息,如距离、按键值等。
- 蜂鸣器:提供声音提示。
三、器件连接
- 红外接收器连接到单片机的P3^3引脚。
- 超声波传感器的Trig和Echo分别连接到P10和P11引脚。
- 电机驱动连接到单片机的P30、P31、P32、P36、P34、P35引脚。
- LCD1602显示屏连接到单片机的P0端口。
- 蜂鸣器连接到P2^4引脚。
四、设计原理
1. 红外接收与解码
红外接收器接收遥控器发出的信号,通过外部中断1(INT1)进行处理,记录脉冲时间并存储在IR_receive_data
数组中。定时器1以256us的周期记录脉冲宽度,通过分析脉冲宽度确定接收的数据位值。解码后,将按键值存储在IR_receive_code
中。
2. 超声波测距
超声波传感器通过发送Trig信号触发测距,Echo信号返回高电平时间用于计算距离。距离计算公式为:
[ \text{距离} = \frac{\text{高电平时间} \times 1.7}{100} ]
3. 电机控制
电机通过H桥电路进行驱动,控制信号分别连接到P3端口,实现前进、后退、左转、右转及停止功能。
4. LCD1602显示
LCD1602显示屏用于显示当前小车状态信息,如距离、按键值等。通过LCD1602_init
初始化后,通过LCD1602_Print
函数进行显示操作。
5. 蜂鸣器提示
蜂鸣器通过PWM控制发出声音提示,主要用于操作确认。
五、电路原理
电路设计包括电源模块、传感器模块、执行器模块及显示模块。每个模块与单片机连接,并通过单片机的I/O口进行数据采集与控制。
六、程序原理
程序包括初始化、主循环及各功能模块的实现。
1. 初始化
包括定时器、外部中断、LCD1602显示屏及各传感器的初始化。
void Init_Timer0() {TMOD &= 0xf0;TMOD |= 0x01; // 设T0为方式1TH0 = 0;TL0 = 0; // 定时器0初始化装载0ET0 = 1; // 允许T0中断EA = 1; // 开启总中断
}void IR_receive_init() {IR_receive_time = 0;IR_receive_flag = 0;IR_receive_bit = 0;IR_receive_OK = 0;IR_receive_end = 0;TMOD |= 0x20; // 设置定时器1为8位自动重装计数TH1 = 0x00;TL1 = 0x00; // 设置定时时间为256usET1 = 1; // 定时器1中断打开EA = 1; // 总中断打开TR1 = 1; // 启动定时器1
}
2. 主循环
主循环主要负责超声波测距、红外信号处理及执行相应的控制操作。
void main(void) {// 初始化LCD1602LCD1602_init();LCD1602_Print(0, 0, "KEY:");LCD1602_Print(0, 1, "Distance:");IR_receive_init(); // 红外解码设置程序int1init(); // 外部中断设置Init_Timer0();while (1) {delay_ms(50);// 测量超声波距离并显示TR0 = 0;TH0 = 0;TL0 = 0;Trig = 1;_nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_();Trig = 0;while (!Echo);TR0 = 1;while (Echo);TR0 = 0;distance = Conut();// 显示距离count = 0;disp[count++] = distance % 1000 / 100 + '0';disp[count++] = distance % 100 / 10 + '0';disp[count++] = distance % 10 / 1 + '0';disp[count++] = 'c'; disp[count++] = 'm';disp[count++] = 0;LCD1602_Print(9, 1, disp);// 按键处理if (IR_receive_OK) {IR_receive_OK = 0;IR_code(); // 红外数据解码if (IR_receive_end) {IR_receive_end = 0;IR_check(IR_receive_code[2]); // 红外按键值处理程序if (KEY == 1) {AUTOMODE = !AUTOMODE; // 自动模式开关} else if (KEY == 2) {forward(); // 前进} else if (KEY == 5) {left(); // 左转} else if (KEY == 6) {stop(); // 停止} else if (KEY == 7) {right(); // 右转} else if (KEY == 10) {backward(); // 后退}beep(); // 蜂鸣器提示IR_receive_init(); // 重新初始化红外接收int1init();}}// 自动模式下的避障与循迹if (AUTOMODE) {Avoid(); // 避障tracking(); // 循迹}}
}
七、实验结果
通过上述设计与实现,小车能够实现红外遥控、超声波避障及自动循迹功能。实验过程中,通过LCD1602实时显示距离及按键状态,方便调试与观察。
八、结论
本实验成功实现了基于STC89C52单片机的智能小车系统,具备红外遥控、超声波避障及自动循迹等功能。通过合理的硬件连接与程序设计,小车能够稳定运行,实现预期功能。进一步优化可以考虑提高传感器精度及增加更多智能功能。
资料
https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2