写一个51单片机小车循迹程序
时间: 2023-08-12 17:06:07 浏览: 168
基于51单片机智能小车循迹程序.doc
好的,以下是一个简单的51单片机小车循迹程序:
```c
#include <reg51.h>
sbit LSA=P2^2; //定义数码管LS138的三个控制端口
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit buzzer=P2^7; //定义蜂鸣器端口
sbit in1=P1^0; //定义L293D的IN1-IN4端口
sbit in2=P1^1;
sbit in3=P1^2;
sbit in4=P1^3;
unsigned char code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f //定义数码管0~9的值
};
unsigned char direction=0; //定义小车行驶方向变量
unsigned char speed=0; //定义小车行驶速度变量
void delay(unsigned int x) //延时函数
{
unsigned int i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void display(unsigned char num) //数码管显示函数
{
LSA=0;
LSB=0;
LSC=0;
P0=table[num];
delay(500);
}
void forward() //小车前进函数
{
in1=0;
in2=1;
in3=0;
in4=1;
}
void backward() //小车后退函数
{
in1=1;
in2=0;
in3=1;
in4=0;
}
void left() //小车左转函数
{
in1=0;
in2=1;
in3=1;
in4=0;
}
void right() //小车右转函数
{
in1=1;
in2=0;
in3=0;
in4=1;
}
void stop() //小车停止函数
{
in1=0;
in2=0;
in3=0;
in4=0;
}
void delay_ms(unsigned int z) //毫秒级延时函数
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main()
{
unsigned char i,j;
while(1)
{
if(P3==0xfe) //左循迹
{
direction=1;
left();
}
else if(P3==0xfd) //中循迹
{
direction=0;
forward();
}
else if(P3==0xfc) //右循迹
{
direction=2;
right();
}
else //无循迹信号
{
stop();
}
if(direction==0) //前进
{
speed=9;
for(i=0;i<10;i++)
{
for(j=0;j<speed;j++)
{
display(j);
delay_ms(10);
}
for(j=speed-2;j>0;j--)
{
display(j);
delay_ms(10);
}
}
}
else if(direction==1) //左转
{
speed=5;
for(i=0;i<6;i++)
{
for(j=0;j<speed;j++)
{
display(j);
delay_ms(10);
}
for(j=speed-2;j>0;j--)
{
display(j);
delay_ms(10);
}
}
}
else if(direction==2) //右转
{
speed=5;
for(i=0;i<6;i++)
{
for(j=0;j<speed;j++)
{
display(j);
delay_ms(10);
}
for(j=speed-2;j>0;j--)
{
display(j);
delay_ms(10);
}
}
}
if(speed==0) //小车停止时蜂鸣器响一声
{
buzzer=1;
delay(500);
buzzer=0;
delay(500);
}
}
}
```
这个程序通过循迹模块获取到循迹信号,根据信号控制小车行驶方向,同时根据行驶方向和速度控制数码管显示和L293D驱动电机,实现小车的循迹行驶。
阅读全文