寻迹避障程序
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit RM1=P0^0;
sbit RM2=P0^1;//右电机
sbit LM1=P0^2;
sbit LM2=P0^3;//左电机
sbit bzh=P2^6;
sbit RAD=P0^6;//红外接收右电机转
sbit LBD=P0^7;//红外接收左电机转
sbit rs=P3^5;// LCD的RS
sbit rw=P3^6;// LCD的R/W
sbit en=P3^7;// LCD的E
void lcd_string(uchar *strpoint);
void delay(uint a)
{ uint b,c;
for(b=a;b>0;b--)
for(c=120;c>0;c--);
}
uchar i=0;
void checkbusy()//检查LCD忙
{ uchar dat;
rs=0; //rs=1为数据,=0为命令.
rw=1; //rw=1为读,=0为写.
do
{
P1=0x00;
en=1; //E信号下降沿锁存DB7~DBO
dat=P1; //读入P1的值
en=0; //锁存
dat=0x80 & dat; //BUSY:1内部在工作,0正常状态
}while(!(dat==0x00));rw=0;
}
void sentcom(uchar com)
{ checkbusy(); //检查Busy
rs=0;
en=0;
P1=com;
delay(5);
en=1;
delay(5);
en=0;
}
void sentdata(uchar date) //写数据
{
checkbusy();
rs=1;
en=0;
P1=date;
delay(5);
en=1;
delay(5);
en=0;
}
//初始化 LCM
void lcd_init()
{
sentcom(0x38);//功能设置,一次送8位数据,基本指令集
sentcom(0x0C);//0000,1100 整体显示,游标off,游标位置off
sentcom(0x01);//0000,0001 清DDRAM
sentcom(0x02);//0000,0010 DDRAM地址归位
sentcom(0x80);//1000,0000 设定DDRAM 7位地址000,0000到地址计数器AC
}
void lcd_string(char*strpoint)//在当前显示位置显示LCD字符串
{ register i=0;
while(strpoint[ i]!=0){
sentdata(strpoint[ i]);
i++;
}
}
void stop()
{
lcd_init();
sentcom(0x80);
lcd_string("现代创新实训室 ");//C编译系统本省也具有转换功能,所以也可以这样写
sentcom(0x90);
lcd_string("寻迹避障一体小车");
sentcom(0x88);
lcd_string("--指导:");
sentcom(0x98);
lcd_string("--设计: ");
}
void tracing()
{
sentcom(0x80);
lcd_string("现代创新实训室 ");
sentcom(0x90);
lcd_string("--指导:");
sentcom(0x88);
lcd_string("--设计: ");
sentcom(0x98);
lcd_string(" 小车寻迹中---");
}
void bypass()
{
sentcom(0x80);
lcd_string("现代创新实训室 ");
sentcom(0x90);
lcd_string("--指导:");
sentcom(0x88);
lcd_string("--设计: ");
sentcom(0x98);
lcd_string(" 小车避障中---");
}
void find()
{tracing();
while(bzh==1)
{ if(LBD&&RAD==1)
{
RM1=1;LM1=1;
RM2=0;LM2=0;
}
if(RAD==0)
{
RM1=0;LM1=1;
RM2=0;LM2=0;
if(LBD==0)
{
RM1=1;LM1=1;
RM2=0;LM2=0;
delay(i);
}
}
if(LBD==0)
{
RM1=1;LM1=0;
RM2=0;LM2=0;
if(RAD==0)
{
RM1=1;LM1=1;
RM2=0;LM2=0;
delay(i);
}
}
}
}
void bizhan()
{ bypass();
if(bzh==0)
{
RM1=1;LM1=0;
RM2=0;LM2=1;
delay(100);
}
}
void main()
{ stop();
delay(2000);
while(1)
{
find();
bizhan();
}
}
来自基于51单片机制作的避障寻迹小车 |