200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 智能车走迷宫c语言程序 基于51单片机的智能迷宫小车设计 含PCB原理图 源程序...

智能车走迷宫c语言程序 基于51单片机的智能迷宫小车设计 含PCB原理图 源程序...

时间:2023-02-03 17:56:13

相关推荐

智能车走迷宫c语言程序 基于51单片机的智能迷宫小车设计 含PCB原理图 源程序...

#include

#include

#include

#include

#include

#define uchar unsigned char//无符号字符型占用一个字节 范围0~255,

#define uint unsigned int/*无符号整型占用二个字节 范围0~65535*/

#define dataPort P1

uchar bianma1;//编码计数

uint yejinjishu=0; //液晶计数

uchar wang=1;

uchar guo=1;

uchara1=0,a2=0,a3=0,a4=0; //小车方向判断

ucharb1=0,b2=0,b3=0,b4=0;

//电机操作初始化

uchar i=0,j=0; /* 中断计数器 */

uchar m1=0; /* 电机1速度值 */

uchar m2=0; /* 电机2速度值 */

sbit s1=P0^0; /* L298的Input 1 */

sbit s2=P0^1; /* L298的Input 2 */

sbit s3=P0^2; /* L298的Input 3 */

sbit s4=P0^3; /* L298的Input 4 */

sbit en1=P0^4; /* L298的Enable A */

sbit en2=P0^5; /* L298的Enable B */

//寻线 红外接收头 初始化

sbit P2_2=P3^1;

sbit P2_3=P2^3;

sbit P2_4=P2^4;

sbit P2_5=P2^5;

sbit P2_6=P2^6;

sbit P2_7=P2^7;

//按键初始化

sbit markkey=P2^0;

sbit logokey=P2^1;

uchar mark=0;//选线while 标志

uchar logo=0;//最佳路线行走标记

unsigned char idata road[30]; //转向数组

unsigned char code aa[10][4]={"LBL","LBA","ABL","ABA","ABR","RBA","RBR","RBL","LBR"};//数组无需改变 code

unsigned char codea[10][2]={"A","R","R","B","L","L","A","B","B"};

unsigned char idata *p; //地址寄存器 用于字符串操作

//unsigned char idatacun24c02[15];//ram允许情况可以无限添加 记忆数组

// 函数初始化

void KEY();

void line();

void stop();

void youlun();

void zuolun();

void zhizou();

void zhizou1();

void zhizou2();

void ISD1420p(uchar t1,uint t2);

void Run_SNAKE(void);

/********简易延时函数******/

void delay(uint t)

{

for(t;t>0;t--);

}

void DelayUs(uint us)//标准延时 us

{

unsigned char uscnt;

uscnt=us>>1;

while(--uscnt);

}

void DelayMs(uint ms)//标准延时 ms

{

while(--ms)

{

DelayUs(250);

DelayUs(250);

DelayUs(250);

DelayUs(250);

}

}

//595 初始化 串转并

/*sbit sclk=P3^0;

sbit dat=P3^1;

sbit st = P2^1;

void write595(uchar wrdat)

{

uchar sum;

for(sum=0;sum<8;sum++)

{

sclk=0;

dat=wrdat&0x80;

wrdat<<=1;

sclk=1;

}

st=0;

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

st=1;

} */

sbit SDA=P0^6;//sbit dat=P3^1;

sbit SCL=P2^2;//sbit sclk=P3^0;

sbit jiyibiaozhi=P0^7;//st = P2^1;

void write595(uchar wrdat)

{

uchar sum;

for(sum=0;sum<8;sum++)

{

SCL=0;

SDA=wrdat&0x80;

wrdat<<=1;

SCL=1;

}

jiyibiaozhi=0;

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

jiyibiaozhi=1;

}

/*******************************************************

********************************************************

***************24c02部分*********************************

********************************************************

*******************************************************

#define_Nop()_nop_()//定义空指令

bit ack; //应答标志位

//sbit SDA=P2^1;

//sbit SCL=P2^0;

/*------------------------------------------------

启动总线

------------------------------------------------

void Start_I2c()

{

SDA=1; //发送起始条件的数据信号

_Nop();

SCL=1;

_Nop(); //起始条件建立时间大于4.7us,延时

_Nop();

_Nop();

_Nop();

_Nop();

SDA=0; //发送起始信号

_Nop(); //起始条件锁定时间大于4μ

_Nop();

_Nop();

_Nop();

_Nop();

SCL=0; //钳住I2C总线,准备发送或接收数据

_Nop();

_Nop();

}

/*------------------------------------------------

结束总线

-----------------------------------------------

void Stop_I2c()

{

SDA=0; //发送结束条件的数据信号

_Nop(); //发送结束条件的时钟信号

SCL=1; //结束条件建立时间大于4μ

_Nop();

_Nop();

_Nop();

_Nop();

_Nop();

SDA=1; //发送I2C总线结束信号

_Nop();

_Nop();

_Nop();

_Nop();

}

/*----------------------------------------------------------------

字节数据传送函数

函数原型: voidSendByte(unsigned char c);

功能:将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对

此状态位进行操作.(不应答或非应答都使ack=0 假)

发送数据正常,ack=1; ack=0表示被控器无应答或损坏。

------------------------------------------------------------------

voidSendByte(unsigned char c)

{

unsigned char BitCnt;

for(BitCnt=0;BitCnt<8;BitCnt++)//要传送的数据长度为8位

{

if((c<

elseSDA=0;

_Nop();

SCL=1;//置时钟线为高,通知被控器开始接收数据位

_Nop();

_Nop();//保证时钟高电平周期大于4μ

_Nop();

_Nop();

_Nop();

SCL=0;

}

_Nop();

_Nop();

SDA=1;//8位发送完后释放数据线,准备接收应答位

_Nop();

_Nop();

SCL=1;

_Nop();

_Nop();

_Nop();

if(SDA==1)ack=0;

else ack=1; //判断是否接收到应答信号

SCL=0;

_Nop();

_Nop();

}

/*----------------------------------------------------------------

字节数据传送函数

函数原型: unsigned charRcvByte();

功能:用来接收从器件传来的数据,并判断总线错误(不发应答信号),

发完后请用应答函数。

------------------------------------------------------------------

unsigned charRcvByte()

{

unsigned char retc;

unsigned char BitCnt;

retc=0;

SDA=1;//置数据线为输入方式

for(BitCnt=0;BitCnt<8;BitCnt++)

{

_Nop();

SCL=0; //置时钟线为低,准备接收数据位

_Nop();

_Nop(); //时钟低电平周期大于4.7us

_Nop();

_Nop();

_Nop();

SCL=1; //置时钟线为高使数据线上数据有效

_Nop();

_Nop();

retc=retc<<1;

if(SDA==1)retc=retc+1; //读数据位,接收的数据位放入retc中

_Nop();

_Nop();

}

SCL=0;

_Nop();

_Nop();

return(retc);

}

/*----------------------------------------------------------------

应答子函数

原型:void Ack_I2c(void);

---------------------------------------------------------------

void Ack_I2c(void)

{

SDA=0;

_Nop();

_Nop();

_Nop();

SCL=1;

_Nop();

_Nop(); //时钟低电平周期大于4μ

_Nop();

_Nop();

_Nop();

SCL=0;//清时钟线,钳住I2C总线以便继续接收

_Nop();

_Nop();

}

/*----------------------------------------------------------------

非应答子函数

原型:void NoAck_I2c(void);

----------------------------------------------------------------

void NoAck_I2c(void)

{

SDA=1;

_Nop();

_Nop();

_Nop();

SCL=1;

_Nop();

_Nop(); //时钟低电平周期大于4μ

_Nop();

_Nop();

_Nop();

SCL=0;//清时钟线,钳住I2C总线以便继续接收

_Nop();

_Nop();

}

/*----------------------------------------------------------------

向有子地址器件发送多字节数据函数

函数原型: bitISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no);

功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件

地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。

如果返回1表示操作成功,否则操作有误。

注意: 使用前必须已结束总线。

----------------------------------------------------------------

bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no)

{

unsigned char i;

for(i=0;i

{

Start_I2c();//启动总线

SendByte(sla);//发送器件地址

if(ack==0)return(0);

SendByte(suba); //发送器件子地址

if(ack==0)return(0);

SendByte(*s); //发送数据

if(ack==0)return(0);

Stop_I2c();//结束总线

DelayMs(1);//必须延时等待芯片内部自动处理数据完毕

s++;

suba++;

}

return(1);

}

/*----------------------------------------------------------------

向有子地址器件读取多字节数据函数

函数原型: bitISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no);

功能: 从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件

地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。

如果返回1表示操作成功,否则操作有误。

注意: 使用前必须已结束总线。

---------------------------------------------------------------

bit IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no)

{

unsigned char i;

Start_I2c();//启动总线

SendByte(sla);//发送器件地址

if(ack==0)return(0);

SendByte(suba); //发送器件子地址

if(ack==0)return(0);

Start_I2c();

SendByte(sla+1);

if(ack==0)return(0);

for(i=0;i

{

*s=RcvByte(); //发送数据

Ack_I2c();//发送就答位

s++;

}

*s=RcvByte();

NoAck_I2c();//发送非应位

Stop_I2c();//结束总线

return(1);

}

/*------------------------------------------------

主函数

------------------------------------------------

main()

{

//bit flag;

unsigned char i;

DelayMs(6000);

ISendStr(0xae,80,dat,5); //写入24c02

DelayMs(10); //写入后必须延时等待24c02内部

//烧录数据处理完毕方可继续其他操作

IRcvStr(0xae,80,dat1,5);//从24c02读出数据

while(1)

{

for(i=0;i<5;i++) //查表

{

DelayMs(2000);

P1=dat1[i];

}

}

}*/

/*****************************************************

******************************************************

**********************12864部分***********************

******************************************************

*****************************************************/

sbit rs=P3^7;

sbit rw=P3^6;

sbit en=P3^5;

sbit psb=P3^4;

sbit rst=P3^3;

uchar key1=1,key2=1,key3=1,key4=1;

void checkBusy(void) //判忙

{

rs=0;

rw=1;

en=1;

dataPort=0xff;

while(dataPort & 0x80);

en=0;

}

void writeCommand(unsigned char cmd) //写命令

{

checkBusy();

rs=0;

rw=0;

en=1;

dataPort=cmd;

_nop_();

en=0;

}

void writeData(unsigned char adata) //写数据

{

checkBusy();

rs=1;

rw=0;

en=1;

dataPort=adata;

_nop_();

en=0;

}

unsigned char readData(void) //读数据

{

unsigned char RData;

dataPort=0xff;

checkBusy();

rs=1;

rw=1;

en=0;

en=1;

RData=dataPort;

en=0;

return RData;

}

void ClrGDRAM(void) //显示用户自定义字符

{

unsigned char x,y;

for(y=0;y<64;y++)

for(x=0;x<16;x++)

{

writeCommand(0x34);

writeCommand(y+0x80); //行地址

writeCommand(x+0x80); //列地址

writeCommand(0x30);

writeData(0x00);

writeData(0x00);

}

//writeCommand(0x30);

}

void LcmInit(void) //12864初始化

{

writeCommand(0x30);

DelayMs(50);

writeCommand(0x01);

DelayMs(50);

writeCommand(0x06);

DelayMs(50);

writeCommand(0x0c);

ClrGDRAM();

psb=1;

}

/* 清屏*/

void ClrScreen()

{

writeCommand(0x01);

DelayMs(15);

}

/*画点打点位置(x0,y0);color=1,点亮;color=0,擦除*/

void drawPoint(unsigned char x,unsigned char y,unsigned char color)

{

unsigned char row,collum,cbite;

unsigned char tempH,tempL;

writeCommand(0x34);

writeCommand(0x36);

collum=x>>4;

cbite=x&0x0f;

if(y<32)

row=y;

else

{row=y-32;

collum+=8;

}

writeCommand(0x80+row);

writeCommand(0x80+collum);

readData();

tempH=readData();

tempL=readData();

writeCommand(0x80+row);

writeCommand(0x80+collum);

if (color)

{

if(cbite<8)

{

tempH|=(1<

}

else

{

tempL|=(1<

}

}

else

{

if(cbite<8)

{

tempH&=~(1<

}

else

{

tempL&=~(1<

}

}

writeData(tempH);

writeData(tempL);

writeCommand(0x30);

}

/**3X3个点合为一个**/

void drawPoint_3(unsigned char x,unsigned char y, unsigned char color)

{

drawPoint(x,y,color);

drawPoint(x+1,y,color);

drawPoint(x-1,y,color);

drawPoint(x+1,y-1,color);

drawPoint(x,y-1,color);

drawPoint(x-1,y-1,color);

drawPoint(x-1,y+1,color);

drawPoint(x,y+1,color);

drawPoint(x+1,y+1,color);

}

void QCRAM()//清楚RAM

{

uchar x,y;

uchar color=0;

for(x=0;x<=128;x++)

for(y=0;y<=80;y++)

drawPoint(x,y,color);

}

#define SNAKE_Max_Long 20 //最大长度

struct

{

uchar X[SNAKE_Max_Long];

uchar Y[SNAKE_Max_Long];

uchar Long;

}Snake; //小车结构体

void Init_SNAKE(void)

{

uchar sum;

Snake.Long=2; //定义初始化小车的长度

for(sum=0;sum

{

Snake.X[sum]=sum+20;

Snake.Y[sum]=20;

}

for(sum=0;sum

{

drawPoint_3(Snake.X[sum],Snake.Y[sum],1);

}

}

void keyscan() //转弯检测

{

if(!key1||!key2||!key3||!key4)

{

Run_SNAKE();

if(key1==0)

{

key1=1;

a1=0;

a2=0;

a3=0;

a4=1;

}

if(key2==0)

{

key2=1;

a1=1;

a2=0;

a3=0;

a4=0;

}

if(key3==0)

{

key3=1;

a1=0;

a2=1;

a3=0;

a4=0;

}

if(key4==0)

{

key4=1;

a1=0;

a2=0;

a3=1;

a4=0;

}

}

}

void Run_SNAKE(void) //小车运动方向

{

uchar sum=0;

/***小车的运动方向**/

if(a1==1)

{

if(b1==1)

{

for(sum=0;sum

{

Snake.X[sum]=Snake.X[sum+1];

Snake.Y[sum]=Snake.Y[sum+1];

}

Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]+0;

Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]+1; //小车头向你要求的方向移动

}

if(b2==1)

{

for(sum=0;sum

{

Snake.X[sum]=Snake.X[sum+1];

Snake.Y[sum]=Snake.Y[sum+1];

}

Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]+0;

Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]-1; //小车头向你要求的方向移动

}

if(b3==1)

{

for(sum=0;sum

{

Snake.X[sum]=Snake.X[sum+1];

Snake.Y[sum]=Snake.Y[sum+1];

}

Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]-1;

Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]+0; //小车头向你要求的方向移动

}

if(b4==1)

{

for(sum=0;sum

{

Snake.X[sum]=Snake.X[sum+1];

Snake.Y[sum]=Snake.Y[sum+1];

}

Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]+1;

Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]+0; //小车头向你要求的方向移动

}

if(!key1||!key2||!key3||!key4)

{

if(b1==1)

{

b1=0;

b2=1;

b3=0;

b4=0;

}

else if(b2==1)

{

b1=1;

b2=0;

b3=0;

b4=0;

}

else if(b3==1)

{

b1=0;

b2=0;

b3=0;

b4=1;

}

else if(b4==1)

{

b1=0;

b2=0;

b3=1;

b4=0;

}

}

}

if(a2==1)

{

if(b1==1)

{

for(sum=0;sum

{

Snake.X[sum]=Snake.X[sum+1];

Snake.Y[sum]=Snake.Y[sum+1];

}

Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]-1;

Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]+0; //小车头向你要求的方向移动

}

if(b2==1)

{

for(sum=0;sum

{

Snake.X[sum]=Snake.X[sum+1];

Snake.Y[sum]=Snake.Y[sum+1];

}

Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]+1;

Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]+0; //小车头向你要求的方向移动

}

if(b3==1)

{

for(sum=0;sum

{

Snake.X[sum]=Snake.X[sum+1];

Snake.Y[sum]=Snake.Y[sum+1];

}

Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]+0;

Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]-1; //小车头向你要求的方向移动

}

if(b4==1)

{

for(sum=0;sum

{

Snake.X[sum]=Snake.X[sum+1];

Snake.Y[sum]=Snake.Y[sum+1];

}

Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]+0;

Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]+1; //小车头向你要求的方向移动

}

if(!key1||!key2||!key3||!key4)

{

if(b1==1)

{

b1=0;

b2=0;

b3=0;

b4=1;

}

else if(b2==1)

{

b1=0;

b2=0;

b3=1;

b4=0;

}

else if(b3==1)

{

b1=1;

b2=0;

b3=0;

b4=0;

}

else if(b4==1)

{

b1=0;

b2=1;

b3=0;

b4=0;

}

}

}

if(a3==1)

{

if(b1==1)

{

for(sum=0;sum

{

Snake.X[sum]=Snake.X[sum+1];

Snake.Y[sum]=Snake.Y[sum+1];

}

Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]+1;

Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]+0; //小车头向你要求的方向移动

}

if(b2==1)

{

for(sum=0;sum

{

Snake.X[sum]=Snake.X[sum+1];

Snake.Y[sum]=Snake.Y[sum+1];

}

Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]-1;

Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]+0; //小车头向你要求的方向移动

}

if(b3==1)

{

for(sum=0;sum

{

Snake.X[sum]=Snake.X[sum+1];

Snake.Y[sum]=Snake.Y[sum+1];

}

Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]+0;

Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]+1; //小车头向你要求的方向移动

}

if(b4==1)

{

for(sum=0;sum

{

Snake.X[sum]=Snake.X[sum+1];

Snake.Y[sum]=Snake.Y[sum+1];

}

Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]+0;

Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]-1; //小车头向你要求的方向移动

}

if(!key1||!key2||!key3||!key4)

{

if(b1==1)

{

b1=0;

b2=0;

b3=1;

b4=0;

}

else if(b2==1)

{

b1=0;

b2=0;

b3=0;

b4=1;

}

else if(b3==1)

{

b1=0;

b2=1;

b3=0;

b4=0;

}

else if(b4==1)

{

b1=1;

b2=0;

b3=0;

b4=0;

}

}

}

if(a4==1)

{

if(b1==1)

{

for(sum=0;sum

{

Snake.X[sum]=Snake.X[sum+1];

Snake.Y[sum]=Snake.Y[sum+1];

}

Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]+0;

Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]-1; //小车头向你要求的方向移动

}

if(b2==1)

{

for(sum=0;sum

{

Snake.X[sum]=Snake.X[sum+1];

Snake.Y[sum]=Snake.Y[sum+1];

}

Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]+0;

Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]+1; //小车头向你要求的方向移动

}

if(b3==1)

{

for(sum=0;sum

{

Snake.X[sum]=Snake.X[sum+1];

Snake.Y[sum]=Snake.Y[sum+1];

}

Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]+1;

Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]+0; //小车头向你要求的方向移动

}

if(b4==1)

{

for(sum=0;sum

{

Snake.X[sum]=Snake.X[sum+1];

Snake.Y[sum]=Snake.Y[sum+1];

}

Snake.X[Snake.Long-1]=Snake.X[Snake.Long-2]-1;

Snake.Y[Snake.Long-1]=Snake.Y[Snake.Long-2]+0; //小车头向你要求的方向移动

}

if(!key1||!key2||!key3||!key4)

{

if(b1==1)

{

b1=1;

b2=0;

b3=0;

b4=0;

}

else if(b2==1)

{

b1=0;

b2=1;

b3=0;

b4=0;

}

else if(b3==1)

{

b1=0;

b2=0;

b3=1;

b4=0;

}

else if(b4==1)

{

b1=0;

b2=0;

b3=0;

b4=1;

}

}

}

}

/*******************************************

********************************************

*************小车部分***********************

********************************************

********************************************/

/********外部中断定义*************/

void ini()

{

//EA=1; //全局中断开

EX0=0; //外部中断0开

IT0=1; //边缘触发

//EX1=0; //外部中断1开

//IT1=1; //电平触发

}

/*****外部中断0函数*****/

void ini_t0() interrupt 0

{

bianma1--;

}

/********pwm中断调速定义*************/

void pwm()

{

TMOD=0x01; /* 设定T0的工作模式为2 */

TH0=(65536-100)/256; /* 装入定时器的初值 晶振20MHZ 每100us中断一次10次(即1MS)为1个PWM周期*/

TL0=(65536-100)%256;

EA=1; /* 开总中断 */

ET0=1; /* 定时器0允许中断 */

TR0=1; /* 启动定时器0 */

PT0=1;//高优先级

}

/*****定时中断函数2*****/

void timer0() interrupt 1 /* T0中断服务程序 */

{

i++;

j++;

if(i<=m1) en1=1;

else en1=0;

if(j<=m2) en2=1;

else en2=0;

if(i==100){i=0;}

if(j==100){j=0;}

TH0=(65536-100)/256;

TL0=(65536-100)%256;

}

//岔路口 转向记录

void crossing(uchar save)

{

if(save=='A'){strcat(road,"A");}

if(save=='B'){strcat(road,"B");}

if(save=='R'){strcat(road,"R");}

if(save=='L'){strcat(road,"L");}

if(save=='D'){strcat(road,"D");}

if(save=='0'){strcat(road,"\0");}

}

//记忆路径播音

void boyin(uchar save)

{

if(save=='A'){stop();ISD1420p(3,1200);}

if(save=='B'){stop();ISD1420p(2,1200);}

if(save=='R'){stop();ISD1420p(1,1200);}

if(save=='L'){stop();ISD1420p(0,1200);}

if(save=='D'){stop();while(!markkey){logokey=0;DelayMs(3000) ;logokey=1;guo=0;}ISD1420p(2,1200);}

}

/*// 存入24c02

void cunru24c02()

{

uchar sum=0;

while(*p)

{

if(*p=='A')cun24c02[sum]=0x01;

if(*p=='B')cun24c02[sum]=0x02;

if(*p=='R') cun24c02[sum]=0x03;

if(*p=='L') cun24c02[sum]=0x04;

p++;

sum++;

}

cun24c02[sum]=0;

EA=0;//关掉中断

ISendStr(0xae,80,cun24c02,15); //写入24c02

DelayMs(10); //写入后必须延时等待24c02内部

EA=1;//开启中断

}

// 取出24c02

void quchu24c02()

{

uchar sum=0;

while(cun24c02[sum])

{

if(cun24c02[sum]==0x01)strcat(p,"A");

if(cun24c02[sum]==0x02)strcat(p,"B");

if(cun24c02[sum]==0x03) strcat(p,"R");

if(cun24c02[sum]==0x04) strcat(p,"L");

sum++;

}

strcat(p,"\0");

EA=0;//关掉中断

IRcvStr(0xae,80,p,15);//从24c02读出数据

EA=1;//开启中断

} */

/******************************************************

*******************************************************

************ISD1420p语音播报***************************

*******************************************************

*******************************************************/

sbit playe=P3^0;

uchar code temp[8]={0x00,0x10,0x20,0x30,0x40,0x50,0x70,0x90};

/* 0x00//左转 延时400Ms

0x10//右转 延时400Ms

0x20//掉头 延时400Ms

0x30//直走 延时400Ms

0x40//到达终点 延时800Ms

0x50//最优路径计算完毕延时1600Ms

0x70//最优路径行驶延时1600Ms

0x90//智能迷宫小车 延时1600Ms */

void ISD1420p(uchar t1,uint t2)

{

playe=1;

write595(temp[t1]);

playe=0;

DelayMs(t2);

DelayMs(t2);

playe=1;

/* P1=0;

playe=1;

P1=temp[t1];

playe=0;

DelayMs(t2);

DelayMs(t2);

P1=0;

playe=1; */

}

/********************************************

*********************************************

*****************最优路线计算****************

*********************************************

*********************************************/

int pq(char s1[],char s2[],char ee)

{

int opo=0;

int w=0;

int i;

int k;

int j;

for(i=0;s1[i];i++)

{

j=i;

for(k=0;s2[k];k++)

if(s1[j]&&s1[j]==s2[k])j++;

else break;

if(!s2[k])

{

opo=i;

w++;

if(ee==1)break;

}

}

if(w==1)return opo;

else return -1;

}

char* str_text(){

int j,i,k,f=1,f2=1;//i用于计数f内层标记 f2外层标记

do{

for(i=0;i<9;i++,f=1)

{

do

{

j=pq(road,aa[i],1);//选出匹配字符串下标

if(j==-1)break;

else

{ road[j]=a[i][0];

while(road[j+3]){road[j+1]=road[j+3];j++;}

road[j+1]='\0';

}

}while(1);//判断本次匹配替换是否结束,如果否 继续匹配并替换

}//for循环结束

//*******校验

for(k=0;k<9;k++)

{

j=pq(road,aa[k],1);

if(j!=-1)

{

f2=1;break;//判断是否仍然有匹配项目,如果有重新执行内层do~while语句

}else{f2=0;}

}//校验for结束

}while(f2==1); //外层do while 用于校验

return road;//road首地址

//printf("%s\n",turn2);scanf("%s",c);

}

/******************************************************

*******************************************************

*************小车路径处理******************************

*******************************************************

*******************************************************/

/******************路口误差排除函数********************/

uchar you=0;

………完整代码请下载附件………

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。