智能车走迷宫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;
uchar a1=0,a2=0,a3=0,a4=0; //小车方向判断
uchar b1=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 code a[10][2]={"A","R","R","B","L","L","A","B","B"};
unsigned char idata *p; //地址寄存器 用于字符串操作
//unsigned char idata cun24c02[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();
}
/*----------------------------------------------------------------
字节数据传送函数
函数原型: void SendByte(unsigned char c);
功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
此状态位进行操作.(不应答或非应答都使ack=0 假)
发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
------------------------------------------------------------------
void SendByte(unsigned char c)
{
unsigned char BitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++) //要传送的数据长度为8位
{
if((c<
else SDA=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 char RcvByte();
功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
发完后请用应答函数。
------------------------------------------------------------------
unsigned char RcvByte()
{
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();
}
/*----------------------------------------------------------------
向有子地址器件发送多字节数据函数
函数原型: bit ISendStr(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);
}
/*----------------------------------------------------------------
向有子地址器件读取多字节数据函数
函数原型: bit ISendStr(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;
………完整代码请下载附件………
智能车走迷宫c语言程序,基于51单片机的智能迷宫小车设计 含PCB原理图 源程序...相关推荐
- 单片机遥控车c语言程序,基于51单片机的无线遥控小车设计[附发射接收程序]
/***************************************************************/ /*[基于51单片机的无线遥控小车设计] 作者王*茹 */ /*** ...
- protues里报警c语言程序,基于51单片机的智能火灾报警系统-(Proteus仿真图+源程序+论文)...
摘要 近些年来,因火灾造成的人民生命和财产损失的事件时有发生,对于火灾的防控情况不容乐观.除了对于火灾隐患的排查和人们防灾减灾意识提升之外,利用科技手段对火灾进行实时监控报警十分必要而且非常有效.国内 ...
- 压力传感器与51单片机C语言程序,基于51单片机的智能压力传感器设计
图1 硅压力传感器的电路图 功能多是智能压力传感器的重要特点,可采用两种方式执行: ①所选功能的指令由用户通过键盘发出:② 自动式,已编制好的数据采集与处理程序工作由内部功能控制程序协调,或者外部信号 ...
- c51单片机音乐门铃C语言程序,基于51单片机的无线音乐门铃设计
include #define sound_amount 5 // 歌曲的数量 sbit pause=P2^5; // 播放 暂停 sbit speaker=P2^7; // 无源蜂鸣器 // uns ...
- 共阳极数码时钟c语言程序,基于51单片机C语言数字钟程序.doc
基于51单片机C语言数字钟程序 基于51单片机C语言数字钟程序 数字电子钟的设计 一. 绪论 (一)引言 20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地 ...
- 基于51单片机的光照强度检测c语言程序,基于51单片机光照强度检测报告.doc
基于51单片机光照强度检测报告 课程设计报告 课程名称: 智能仪器课程设计 题 目: 基于51单片机的光照强度 摘要 光敏电阻测光强度系统,该系统可以自动检测光照强度的强弱并显示让人们知道此时光照强度 ...
- 湿度控制c语言程序,基于51单片机的湿度控制系统设计.doc
基于51单片机的湿度控制系统设计 基于51单片机的湿度控制系统设计 摘要 关键词:单片机:湿度传感器:ADC0832数模转换 目 录 序 言1 第一章 系统的整体设计方案2 1.1设计内容2 1.2系 ...
- 51单片机的电子钟c语言程序,基于51单片机的电子钟C语言程序
基于单片机C语言的电子钟程序代码与仿真 基于51单片机的电子钟C语言程序: 程序代码 #include #include #define uchar unsigned char #define uin ...
- 74hc164驱动数码管c语言程序,基于51单片机的74HC164驱动数码管显示程序与仿真
基于51单片机的74HC164驱动数码管显示程序与仿真 基于51单片机的74HC164驱动一位数码管显示程序与仿真 #include #include #define uchar unsigned c ...
最新文章
- stm32时钟树讲解
- 安装网页图形界面管理Linux
- android特效按钮点击效果
- iOS如何在iTunes网站查看并下载APP的dsym文件
- (篇一)作为一个程序猿,这些C语言实例你必须会!
- mac搭建apace和php开发环境
- 软件开发,维护与支持的困惑
- 利用自定义注解实现权限验证
- Django学习笔记7
- mac bigsur 360极速浏览器闪退问题解决方法
- arcgis js平滑线工具_Arcgis中文字体、平滑线插件使用说明
- Rasa课程、Rasa培训、Rasa面试系列之:Rasa客户案例Dialogue公司
- 离开马云后,20位阿里人的区块链创业路
- js柯里化的认识(本文转载自https://www.zhangxinxu.com/wordpress/2013/02/js-currying),觉得很有用就记下了
- H3C-云计算技术专题培训(分享七)
- SpringBoot项目目录结构(工程结构)
- 专访 PMC,开源项目 Apache Pulsar 如何挑战 Kafka?
- AD中对PCB的滴泪和敷铜操作
- Python学习笔记(六)Python基础_数据类型——字符串
- 机智云助力中国电信上线物联网开放平台白色家电行业使能套件
热门文章
- exit(0)和_exit(0)区别
- 从大一统视角理解扩散模型(Diffusion Models)
- 激光灯 | 大致几种通讯方式
- 利用TPOT自动完成机器学习
- Stanford公开课机器学习---week2-2.Matlab/Octave 快速教程
- Moving Swiftly(从OC切换到Swift)
- Maven报错org.apache.jasper.JasperException: Unable to compile class for JSP
- 视频全程回放 | 2018贵阳数博会 - 央视对话栏目:《把脉区块链》
- python 多项式求系数_多项式系数的计算
- setsockopt的使用