|
單片機的智能迷宮小車的原理圖和pcb,都是用ad畫的
0.png (52.05 KB, 下載次數: 140)
下載附件
2017-3-4 03:20 上傳
0.png (62.45 KB, 下載次數: 134)
下載附件
2017-3-4 03:20 上傳
0.png (77.23 KB, 下載次數: 105)
下載附件
2017-3-4 03:21 上傳
0.png (133.25 KB, 下載次數: 131)
下載附件
2017-3-4 03:21 上傳
0.png (83.12 KB, 下載次數: 110)
下載附件
2017-3-4 03:19 上傳
51單片機的智能迷宮小車的所有資料下載:
迷宮源程序.zip
(112.56 KB, 下載次數: 157)
2017-3-4 03:23 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
小車電路圖.zip
(2.37 MB, 下載次數: 134)
2017-3-4 03:23 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
下面是部分代碼預覽:
- #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;
- ………完整代碼請下載附件………
-
復制代碼
|
評分
-
查看全部評分
|