|
單片機(jī)的智能迷宮小車(chē)的原理圖和pcb,都是用ad畫(huà)的
0.png (52.05 KB, 下載次數(shù): 140)
下載附件
2017-3-4 03:20 上傳
0.png (62.45 KB, 下載次數(shù): 134)
下載附件
2017-3-4 03:20 上傳
0.png (77.23 KB, 下載次數(shù): 105)
下載附件
2017-3-4 03:21 上傳
0.png (133.25 KB, 下載次數(shù): 131)
下載附件
2017-3-4 03:21 上傳
0.png (83.12 KB, 下載次數(shù): 110)
下載附件
2017-3-4 03:19 上傳
51單片機(jī)的智能迷宮小車(chē)的所有資料下載:
迷宮源程序.zip
(112.56 KB, 下載次數(shù): 157)
2017-3-4 03:23 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
小車(chē)電路圖.zip
(2.37 MB, 下載次數(shù): 134)
2017-3-4 03:23 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
下面是部分代碼預(yù)覽:
- #include<reg52.h>
- #include<stdio.h>
- #include <intrins.h>
- #include<string.h>
- #include<math.h>
- #define uchar unsigned char //無(wú)符號(hào)字符型占用一個(gè)字節(jié) 范圍0~255,
- #define uint unsigned int /*無(wú)符號(hào)整型占用二個(gè)字節(jié) 范圍0~65535*/
- #define dataPort P1
- uchar bianma1; //編碼計(jì)數(shù)
- uint yejinjishu=0; //液晶計(jì)數(shù)
- uchar wang=1;
- uchar guo=1;
- uchar a1=0,a2=0,a3=0,a4=0; //小車(chē)方向判斷
- uchar b1=0,b2=0,b3=0,b4=0;
- //電機(jī)操作初始化
- uchar i=0,j=0; /* 中斷計(jì)數(shù)器 */
- uchar m1=0; /* 電機(jī)1速度值 */
- uchar m2=0; /* 電機(jī)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 標(biāo)志
- uchar logo=0; //最佳路線行走標(biāo)記
- unsigned char idata road[30]; //轉(zhuǎn)向數(shù)組
- unsigned char code aa[10][4]={"LBL","LBA","ABL","ABA","ABR","RBA","RBR","RBL","LBR"};//數(shù)組無(wú)需改變 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允許情況可以無(wú)限添加 記憶數(shù)組
- // 函數(shù)初始化
- 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);
- /********簡(jiǎn)易延時(shí)函數(shù)******/
- void delay(uint t)
- {
- for(t;t>0;t--);
- }
- void DelayUs(uint us) //標(biāo)準(zhǔn)延時(shí) us
- {
- unsigned char uscnt;
- uscnt=us>>1;
- while(--uscnt);
- }
- void DelayMs(uint ms) //標(biāo)準(zhǔn)延時(shí) ms
- {
- while(--ms)
- {
- DelayUs(250);
- DelayUs(250);
- DelayUs(250);
- DelayUs(250);
- }
- }
- //595 初始化 串轉(zhuǎn)并
- /*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; //應(yīng)答標(biāo)志位
- //sbit SDA=P2^1;
- //sbit SCL=P2^0;
- /*------------------------------------------------
- 啟動(dòng)總線
- ------------------------------------------------
- void Start_I2c()
- {
- SDA=1; //發(fā)送起始條件的數(shù)據(jù)信號(hào)
- _Nop();
- SCL=1;
- _Nop(); //起始條件建立時(shí)間大于4.7us,延時(shí)
- _Nop();
- _Nop();
- _Nop();
- _Nop();
- SDA=0; //發(fā)送起始信號(hào)
- _Nop(); //起始條件鎖定時(shí)間大于4μ
- _Nop();
- _Nop();
- _Nop();
- _Nop();
- SCL=0; //鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù)
- _Nop();
- _Nop();
- }
- /*------------------------------------------------
- 結(jié)束總線
- -----------------------------------------------
- void Stop_I2c()
- {
- SDA=0; //發(fā)送結(jié)束條件的數(shù)據(jù)信號(hào)
- _Nop(); //發(fā)送結(jié)束條件的時(shí)鐘信號(hào)
- SCL=1; //結(jié)束條件建立時(shí)間大于4μ
- _Nop();
- _Nop();
- _Nop();
- _Nop();
- _Nop();
- SDA=1; //發(fā)送I2C總線結(jié)束信號(hào)
- _Nop();
- _Nop();
- _Nop();
- _Nop();
- }
- /*----------------------------------------------------------------
- 字節(jié)數(shù)據(jù)傳送函數(shù)
- 函數(shù)原型: void SendByte(unsigned char c);
- 功能: 將數(shù)據(jù)c發(fā)送出去,可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應(yīng)答,并對(duì)
- 此狀態(tài)位進(jìn)行操作.(不應(yīng)答或非應(yīng)答都使ack=0 假)
- 發(fā)送數(shù)據(jù)正常,ack=1; ack=0表示被控器無(wú)應(yīng)答或損壞。
- ------------------------------------------------------------------
- void SendByte(unsigned char c)
- {
- unsigned char BitCnt;
-
- for(BitCnt=0;BitCnt<8;BitCnt++) //要傳送的數(shù)據(jù)長(zhǎng)度為8位
- {
- if((c<<BitCnt)&0x80)SDA=1; //判斷發(fā)送位
- else SDA=0;
- _Nop();
- SCL=1; //置時(shí)鐘線為高,通知被控器開(kāi)始接收數(shù)據(jù)位
- _Nop();
- _Nop(); //保證時(shí)鐘高電平周期大于4μ
- _Nop();
- _Nop();
- _Nop();
- SCL=0;
- }
-
- _Nop();
- _Nop();
- SDA=1; //8位發(fā)送完后釋放數(shù)據(jù)線,準(zhǔn)備接收應(yīng)答位
- _Nop();
- _Nop();
- SCL=1;
- _Nop();
- _Nop();
- _Nop();
- if(SDA==1)ack=0;
- else ack=1; //判斷是否接收到應(yīng)答信號(hào)
- SCL=0;
- _Nop();
- _Nop();
- }
- /*----------------------------------------------------------------
- 字節(jié)數(shù)據(jù)傳送函數(shù)
- 函數(shù)原型: unsigned char RcvByte();
- 功能: 用來(lái)接收從器件傳來(lái)的數(shù)據(jù),并判斷總線錯(cuò)誤(不發(fā)應(yīng)答信號(hào)),
- 發(fā)完后請(qǐng)用應(yīng)答函數(shù)。
- ------------------------------------------------------------------
- unsigned char RcvByte()
- {
- unsigned char retc;
- unsigned char BitCnt;
-
- retc=0;
- SDA=1; //置數(shù)據(jù)線為輸入方式
- for(BitCnt=0;BitCnt<8;BitCnt++)
- {
- _Nop();
- SCL=0; //置時(shí)鐘線為低,準(zhǔn)備接收數(shù)據(jù)位
- _Nop();
- _Nop(); //時(shí)鐘低電平周期大于4.7us
- _Nop();
- _Nop();
- _Nop();
- SCL=1; //置時(shí)鐘線為高使數(shù)據(jù)線上數(shù)據(jù)有效
- _Nop();
- _Nop();
- retc=retc<<1;
- if(SDA==1)retc=retc+1; //讀數(shù)據(jù)位,接收的數(shù)據(jù)位放入retc中
- _Nop();
- _Nop();
- }
- SCL=0;
- _Nop();
- _Nop();
- return(retc);
- }
- /*----------------------------------------------------------------
- 應(yīng)答子函數(shù)
- 原型: void Ack_I2c(void);
-
- ---------------------------------------------------------------
- void Ack_I2c(void)
- {
-
- SDA=0;
- _Nop();
- _Nop();
- _Nop();
- SCL=1;
- _Nop();
- _Nop(); //時(shí)鐘低電平周期大于4μ
- _Nop();
- _Nop();
- _Nop();
- SCL=0; //清時(shí)鐘線,鉗住I2C總線以便繼續(xù)接收
- _Nop();
- _Nop();
- }
- /*----------------------------------------------------------------
- 非應(yīng)答子函數(shù)
- 原型: void NoAck_I2c(void);
-
- ----------------------------------------------------------------
- void NoAck_I2c(void)
- {
-
- SDA=1;
- _Nop();
- _Nop();
- _Nop();
- SCL=1;
- _Nop();
- _Nop(); //時(shí)鐘低電平周期大于4μ
- _Nop();
- _Nop();
- _Nop();
- SCL=0; //清時(shí)鐘線,鉗住I2C總線以便繼續(xù)接收
- _Nop();
- _Nop();
- }
- /*----------------------------------------------------------------
- 向有子地址器件發(fā)送多字節(jié)數(shù)據(jù)函數(shù)
- 函數(shù)原型: bit ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no);
- 功能: 從啟動(dòng)總線到發(fā)送地址,子地址,數(shù)據(jù),結(jié)束總線的全過(guò)程,從器件
- 地址sla,子地址suba,發(fā)送內(nèi)容是s指向的內(nèi)容,發(fā)送no個(gè)字節(jié)。
- 如果返回1表示操作成功,否則操作有誤。
- 注意: 使用前必須已結(jié)束總線。
- ----------------------------------------------------------------
- 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(); //啟動(dòng)總線
- SendByte(sla); //發(fā)送器件地址
- if(ack==0)return(0);
- SendByte(suba); //發(fā)送器件子地址
- if(ack==0)return(0);
-
- SendByte(*s); //發(fā)送數(shù)據(jù)
- if(ack==0)return(0);
- Stop_I2c(); //結(jié)束總線
- DelayMs(1); //必須延時(shí)等待芯片內(nèi)部自動(dòng)處理數(shù)據(jù)完畢
- s++;
- suba++;
- }
- return(1);
- }
- /*----------------------------------------------------------------
- 向有子地址器件讀取多字節(jié)數(shù)據(jù)函數(shù)
- 函數(shù)原型: bit ISendStr(unsigned char sla,unsigned char suba,ucahr *s,unsigned char no);
- 功能: 從啟動(dòng)總線到發(fā)送地址,子地址,讀數(shù)據(jù),結(jié)束總線的全過(guò)程,從器件
- 地址sla,子地址suba,讀出的內(nèi)容放入s指向的存儲(chǔ)區(qū),讀no個(gè)字節(jié)。
- 如果返回1表示操作成功,否則操作有誤。
- 注意: 使用前必須已結(jié)束總線。
- ---------------------------------------------------------------
- bit IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no)
- {
- unsigned char i;
- Start_I2c(); //啟動(dòng)總線
- SendByte(sla); //發(fā)送器件地址
- if(ack==0)return(0);
- SendByte(suba); //發(fā)送器件子地址
- if(ack==0)return(0);
- Start_I2c();
- SendByte(sla+1);
- if(ack==0)return(0);
- for(i=0;i<no-1;i++)
- {
- *s=RcvByte(); //發(fā)送數(shù)據(jù)
- Ack_I2c(); //發(fā)送就答位
- s++;
- }
- *s=RcvByte();
- NoAck_I2c(); //發(fā)送非應(yīng)位
- Stop_I2c(); //結(jié)束總線
- return(1);
- }
- /*------------------------------------------------
- 主函數(shù)
- ------------------------------------------------
- main()
- {
- //bit flag;
- unsigned char i;
- DelayMs(6000);
- ISendStr(0xae,80,dat,5); //寫(xiě)入24c02
- DelayMs(10); //寫(xiě)入后必須延時(shí)等待24c02內(nèi)部
- //燒錄數(shù)據(jù)處理完畢方可繼續(xù)其他操作
- IRcvStr(0xae,80,dat1,5); //從24c02讀出數(shù)據(jù)
- 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) //寫(xiě)命令
- {
- checkBusy();
- rs=0;
- rw=0;
- en=1;
- dataPort=cmd;
- _nop_();
- en=0;
- }
- void writeData(unsigned char adata) //寫(xiě)數(shù)據(jù)
- {
- checkBusy();
- rs=1;
- rw=0;
- en=1;
- dataPort=adata;
- _nop_();
- en=0;
- }
- unsigned char readData(void) //讀數(shù)據(jù)
- {
- unsigned char RData;
- dataPort=0xff;
- checkBusy();
- rs=1;
- rw=1;
- en=0;
- en=1;
- RData=dataPort;
- en=0;
- return RData;
- }
- void ClrGDRAM(void) //顯示用戶(hù)自定義字符
- {
- 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);
- }
-
- /*畫(huà)點(diǎn) 打點(diǎn)位置(x0,y0);color=1,點(diǎn)亮;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個(gè)點(diǎn)合為一個(gè)**/
- 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 //最大長(zhǎng)度
- struct
- {
- uchar X[SNAKE_Max_Long];
- uchar Y[SNAKE_Max_Long];
- uchar Long;
- }Snake; //小車(chē)結(jié)構(gòu)體
- void Init_SNAKE(void)
- {
- uchar sum;
- Snake.Long=2; //定義初始化小車(chē)的長(zhǎng)度
- for(sum=0;sum<Snake.Long;sum++) //將小車(chē)給賦值
- {
- Snake.X[sum]=sum+20;
- Snake.Y[sum]=20;
- }
- for(sum=0;sum<Snake.Long;sum++) //將小車(chē)給畫(huà)出來(lái)
- {
- drawPoint_3(Snake.X[sum],Snake.Y[sum],1);
- }
- }
- void keyscan() //轉(zhuǎn)彎?rùn)z測(cè)
- {
- 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) //小車(chē)運(yùn)動(dòng)方向
- {
- uchar sum=0;
- /***小車(chē)的運(yùn)動(dòng)方向**/
- if(a1==1)
- {
- if(b1==1)
- {
- for(sum=0;sum<Snake.Long-1;sum++) // 向右 //小車(chē)身都是它前一段的小車(chē)身的位置
- {
- 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; //小車(chē)頭向你要求的方向移動(dòng)
- }
- if(b2==1)
- {
- for(sum=0;sum<Snake.Long-1;sum++) //向左 //小車(chē)身都是它前一段的小車(chē)身的位置
- {
- 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; //小車(chē)頭向你要求的方向移動(dòng)
- }
- if(b3==1)
- {
- for(sum=0;sum<Snake.Long-1;sum++) // 向下 //小車(chē)身都是它前一段的小車(chē)身的位置
- {
- 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; //小車(chē)頭向你要求的方向移動(dòng)
- }
- if(b4==1)
- {
- for(sum=0;sum<Snake.Long-1;sum++) // 向上 //小車(chē)身都是它前一段的小車(chē)身的位置
- {
- 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; //小車(chē)頭向你要求的方向移動(dòng)
- }
-
- 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++) // 向下 //小車(chē)身都是它前一段的小車(chē)身的位置
- {
- 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; //小車(chē)頭向你要求的方向移動(dòng)
- }
- if(b2==1)
- {
- for(sum=0;sum<Snake.Long-1;sum++) // 向上 //小車(chē)身都是它前一段的小車(chē)身的位置
- {
- 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; //小車(chē)頭向你要求的方向移動(dòng)
- }
- if(b3==1)
- {
- for(sum=0;sum<Snake.Long-1;sum++) //向左 //小車(chē)身都是它前一段的小車(chē)身的位置
- {
- 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; //小車(chē)頭向你要求的方向移動(dòng)
- }
- if(b4==1)
- {
- for(sum=0;sum<Snake.Long-1;sum++) // 向右 //小車(chē)身都是它前一段的小車(chē)身的位置
- {
- 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; //小車(chē)頭向你要求的方向移動(dòng)
- }
- 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++) // 向上 //小車(chē)身都是它前一段的小車(chē)身的位置
- {
- 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; //小車(chē)頭向你要求的方向移動(dòng)
- }
- if(b2==1)
- {
- for(sum=0;sum<Snake.Long-1;sum++) // 向下 //小車(chē)身都是它前一段的小車(chē)身的位置
- {
- 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; //小車(chē)頭向你要求的方向移動(dòng)
- }
- if(b3==1)
- {
- for(sum=0;sum<Snake.Long-1;sum++) // 向右 //小車(chē)身都是它前一段的小車(chē)身的位置
- {
- 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; //小車(chē)頭向你要求的方向移動(dòng)
- }
- if(b4==1)
- {
- for(sum=0;sum<Snake.Long-1;sum++) //向左 //小車(chē)身都是它前一段的小車(chē)身的位置
- {
- 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; //小車(chē)頭向你要求的方向移動(dòng)
- }
- 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++) //向左 //小車(chē)身都是它前一段的小車(chē)身的位置
- {
- 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; //小車(chē)頭向你要求的方向移動(dòng)
- }
- if(b2==1)
- {
- for(sum=0;sum<Snake.Long-1;sum++) // 向右 //小車(chē)身都是它前一段的小車(chē)身的位置
- {
- 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; //小車(chē)頭向你要求的方向移動(dòng)
- }
- if(b3==1)
- {
- for(sum=0;sum<Snake.Long-1;sum++) // 向上 //小車(chē)身都是它前一段的小車(chē)身的位置
- {
- 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; //小車(chē)頭向你要求的方向移動(dòng)
- }
- if(b4==1)
- {
- for(sum=0;sum<Snake.Long-1;sum++) // 向下 //小車(chē)身都是它前一段的小車(chē)身的位置
- {
- 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; //小車(chē)頭向你要求的方向移動(dòng)
- }
- 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;
- }
- }
- }
-
- }
- /*******************************************
- ********************************************
- *************小車(chē)部分***********************
- ********************************************
- ********************************************/
- /********外部中斷定義*************/
- void ini()
- {
- //EA=1; //全局中斷開(kāi)
- EX0=0; //外部中斷0開(kāi)
- IT0=1; //邊緣觸發(fā)
- //EX1=0; //外部中斷1開(kāi)
- //IT1=1; //電平觸發(fā)
- }
- /*****外部中斷0函數(shù)*****/
- void ini_t0() interrupt 0
- {
- bianma1--;
- }
- /********pwm中斷調(diào)速定義*************/
- void pwm()
- {
- TMOD=0x01; /* 設(shè)定T0的工作模式為2 */
- TH0=(65536-100)/256; /* 裝入定時(shí)器的初值 晶振20MHZ 每100us中斷一次10次(即1MS)為1個(gè)PWM周期*/
- TL0=(65536-100)%256;
- EA=1; /* 開(kāi)總中斷 */
- ET0=1; /* 定時(shí)器0允許中斷 */
- TR0=1; /* 啟動(dòng)定時(shí)器0 */
- PT0=1;//高優(yōu)先級(jí)
- }
- /*****定時(shí)中斷函數(shù)2*****/
- void timer0() interrupt 1 /* T0中斷服務(wù)程序 */
- {
- 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;
- }
- //岔路口 轉(zhuǎn)向記錄
- 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;//關(guān)掉中斷
- ISendStr(0xae,80,cun24c02,15); //寫(xiě)入24c02
- DelayMs(10); //寫(xiě)入后必須延時(shí)等待24c02內(nèi)部
- EA=1;//開(kāi)啟中斷
- }
- // 取出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;//關(guān)掉中斷
- IRcvStr(0xae,80,p,15); //從24c02讀出數(shù)據(jù)
- EA=1;//開(kāi)啟中斷
- } */
-
- /******************************************************
- *******************************************************
- ************ISD1420p語(yǔ)音播報(bào)***************************
- *******************************************************
- *******************************************************/
- sbit playe=P3^0;
- uchar code temp[8]={0x00,0x10,0x20,0x30,0x40,0x50,0x70,0x90};
- /* 0x00//左轉(zhuǎn) 延時(shí)400Ms
- 0x10//右轉(zhuǎn) 延時(shí)400Ms
- 0x20//掉頭 延時(shí)400Ms
- 0x30//直走 延時(shí)400Ms
- 0x40//到達(dá)終點(diǎn) 延時(shí)800Ms
- 0x50//最優(yōu)路徑計(jì)算完畢 延時(shí)1600Ms
- 0x70//最優(yōu)路徑行駛 延時(shí)1600Ms
- 0x90//智能迷宮小車(chē) 延時(shí)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; */
- }
-
-
- /********************************************
- *********************************************
- *****************最優(yōu)路線計(jì)算****************
- *********************************************
- *********************************************/
- 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用于計(jì)數(shù) f內(nèi)層標(biāo)記 f2外層標(biāo)記
- do{
- for(i=0;i<9;i++,f=1)
- {
- do
- {
- j=pq(road,aa[i],1); //選出匹配字符串下標(biāo)
- 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);//判斷本次匹配替換是否結(jié)束,如果否 繼續(xù)匹配并替換
-
- } //for循環(huán)結(jié)束
-
- //*******校驗(yàn)
- for(k=0;k<9;k++)
- {
- j=pq(road,aa[k],1);
- if(j!=-1)
- {
- f2=1;break; //判斷是否仍然有匹配項(xiàng)目,如果有重新執(zhí)行內(nèi)層do~while語(yǔ)句
- }else{f2=0;}
- }//校驗(yàn)for結(jié)束
-
- }while(f2==1); //外層do while 用于校驗(yàn)
-
- return road; //road首地址
- //printf("%s\n",turn2);scanf("%s",c);
- }
-
- /******************************************************
- *******************************************************
- *************小車(chē)路徑處理******************************
- *******************************************************
- *******************************************************/
- /******************路口誤差排除函數(shù)********************/
- uchar you=0;
- ………完整代碼請(qǐng)下載附件………
-
復(fù)制代碼
|
評(píng)分
-
查看全部評(píng)分
|