设计一份基于51单片机运用避障和红外模块实现自动循迹的小车程序
时间: 2024-05-11 18:19:09 浏览: 153
6、ZY08-C循迹、红外避障、遥控综合程序.rar_51单片机 循迹避障 红外遥控_zy08-c_红外遥控小车
5星 · 资源好评率100%
好的,下面是一个基于51单片机的小车程序,可以实现避障和自动循迹功能。这个程序需要使用一个红外模块和一个超声波模块。
首先,我们需要定义一些常量和变量。这些常量和变量将用于控制小车的运动。
```c
#include <reg51.h>
#define LED P2
#define IN1 P1_0
#define IN2 P1_1
#define IN3 P1_2
#define IN4 P1_3
#define ENA P1_4
#define ENB P1_5
sbit IR = P3^2;
sbit TRIG = P3^3;
sbit ECHO = P3^4;
unsigned int distance = 0;
```
接下来,我们需要初始化各个模块和引脚。这个程序中我们使用 P1_0 到 P1_5 来控制小车的电机, P2 来控制 LED 灯, P3_2 来接收红外模块的信号, P3_3 和 P3_4 分别接超声波模块的 TRIG 和 ECHO 引脚。
```c
void init() {
TMOD = 0x01;
TH0 = 0xFC;
TL0 = 0x67;
ET0 = 1;
TR0 = 1;
IT0 = 1;
EX0 = 1;
IT1 = 1;
EX1 = 1;
IR = 1;
}
```
在初始化函数中,我们设置了计时器 T0 的工作模式为模式 1,使其每隔一段时间就会中断,从而实现超声波模块的测距。我们还设置了外部中断 0 和外部中断 1,用于接收红外模块的信号,以实现避障功能。
接下来是计时器 T0 的中断服务函数,用于实现超声波模块的测距。
```c
void timer0() interrupt 1 {
TH0 = 0xFC;
TL0 = 0x67;
distance = 0;
TRIG = 1;
delay(10);
TRIG = 0;
while (!ECHO);
while (ECHO) {
distance++;
delay(1);
}
distance = distance / 58;
}
```
在这个函数中,我们设置了计时器 T0 的中断触发时间为 50us。当 T0 中断时,我们将超声波模块的 TRIG 引脚拉高,延时 10us 后再将其拉低。接着,我们等待超声波模块的 ECHO 引脚变为高电平,开始计时。当 ECHO 引脚变为低电平时,我们计算出测量得到的距离。
下面是外部中断 0 的中断服务函数,用于实现避障功能。
```c
void external0() interrupt 0 {
IN1 = 1;
IN2 = 0;
IN3 = 1;
IN4 = 0;
delay(300);
IN1 = 0;
IN2 = 0;
IN3 = 0;
IN4 = 0;
}
```
在这个函数中,我们将小车的电机设置为向左转,然后延时一段时间后停止电机的运转,从而实现避障功能。
下面是外部中断 1 的中断服务函数,用于实现自动循迹功能。
```c
void external1() interrupt 2 {
if (IR) {
IN1 = 1;
IN2 = 0;
IN3 = 0;
IN4 = 1;
} else {
IN1 = 0;
IN2 = 1;
IN3 = 1;
IN4 = 0;
}
}
```
在这个函数中,我们根据红外模块的信号判断小车应该向左转还是向右转,然后设置小车的电机运转方向。
最后,我们需要实现一个延时函数,用于控制小车的运动。
```c
void delay(unsigned int t) {
unsigned int i, j;
for (i = 0; i < t; i++) {
for (j = 0; j < 2000; j++);
}
}
```
这个函数将延时 t 个单位时间,每个单位时间是一个循环。在这个循环中,我们执行了 2000 次空循环,从而实现了一个大约为 1ms 的延时。
整个程序的主函数如下:
```c
void main() {
init();
while (1) {
if (distance < 20) {
IN1 = 1;
IN2 = 0;
IN3 = 1;
IN4 = 0;
delay(300);
IN1 = 0;
IN2 = 0;
IN3 = 0;
IN4 = 0;
} else {
IN1 = 1;
IN2 = 0;
IN3 = 0;
IN4 = 1;
}
}
}
```
在这个主函数中,我们首先调用了初始化函数,然后进入一个无限循环。在这个循环中,我们首先判断超声波模块测量得到的距离,如果距离小于 20cm,就调用避障函数,否则调用自动循迹函数。
阅读全文