尋跡避障程序
#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單片機制作的避障尋跡小車 |