|
单片机的智能迷宫小车的原理图和pcb,都是用ad画的
51单片机的智能迷宫小车的所有资料下载:
迷宫源程序.zip
(112.56 KB, 下载次数: 157)
小车电路图.zip
(2.37 MB, 下载次数: 134)
下面是部分代码预览:
- #include<reg52.h>
- #include<stdio.h>
- #include <intrins.h>
- #include<string.h>
- #include<math.h>
- #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<<BitCnt)&0x80)SDA=1; //判断发送位
- 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<no;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<no-1;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<<(7-cbite));
- }
- else
- {
- tempL|=(1<<(15-cbite));
- }
- }
- else
- {
- if(cbite<8)
- {
- tempH&=~(1<<(7-cbite));
- }
- else
- {
- tempL&=~(1<<(15-cbite));
- }
- }
- 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.Long;sum++) //将小车给赋值
- {
- Snake.X[sum]=sum+20;
- Snake.Y[sum]=20;
- }
- for(sum=0;sum<Snake.Long;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.Long-1;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.Long-1;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.Long-1;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.Long-1;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.Long-1;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.Long-1;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.Long-1;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.Long-1;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.Long-1;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.Long-1;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.Long-1;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.Long-1;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.Long-1;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.Long-1;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.Long-1;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.Long-1;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;
- ………完整代码请下载附件………
-
复制代码
|
评分
-
查看全部评分
|