天天看點

【嵌入式】用51單片機完成迷宮遊戲

本次實驗為使用51單片機做出一份遊戲來。

目的首先是為了應付期末考試,是以此次實驗會有部分不完整之處。

**  實驗特殊說明:

     此次實驗中除用到LCD12864、藍牙子產品外,還會使用蜂鳴器完成啟動音樂的播放,以及安卓端的APP的控制(不需要APP的可以在源碼中将部分代碼注釋掉)。

一 實驗說明

使用LCD12864完成迷宮遊戲的繪制,要求遊戲開始時生成迷宮圖案,圖案中有牆和路,要求入口和出口村子能通行的路。要求玩家從左上角誕生,出口位于右下角,要求使用藍牙子產品完成與單片機的連接配接,利用自己制作的APP完成對玩家的操控。使用四個獨立按鍵分别控制人在迷宮中“上、下、左、右”行走操作,直至走到出口,遊戲勝利。

二 實驗要求

  1. 使用LCD12864點陣顯示迷宮和人。
  2. 使用藍牙HC-05實作移動端與單片機的連接配接。
  3. 使用蜂鳴器實作遊戲開始時的背景音樂。
  4. 使用獨立按鍵實作按鍵對玩家的控制。

三 部分源碼

#include <REG52.H>
#include <INTRINS.H>    
 

sbit Beep =  P1^5; 
#define LCDPORT P0//資料引腳

#define uchar unsigned char
#define uint unsigned int

 
sbit LCD12864_RS  =  P2^6; //RS控制引腳
sbit LCD12864_RW  =  P2^5; //RW控制引腳
sbit LCD12864_EN  =  P2^7; //EN控制引腳
sbit LCD12864_PSB  =  P1^2;  //模式選擇引腳,ST7920控制器,1為8位并行接口,0為串行接口

sbit wela    =  P2^6;
sbit dula    =  P2^7;
//開場顯示
uchar code welcome[] = {"**迷宮**"};
uchar code tip_one[] = {"任意鍵啟動遊戲"};

//閉場顯示
uchar code bye[]={"恭喜逃離"};
uchar code tip_two[]={"任意鍵重新開機遊戲"};

// 對按鍵進行定義
sbit k1=P3^1;	 //定義P31口是k1
sbit k2=P3^0; 
sbit k3=P3^2;
sbit k4=P3^3;

uint is_Blue=0;//用來記錄藍牙資料
uint numx_up;//記錄x軸坐标  player[0][0]/8
uint numy_up;//記錄y軸坐标  player[0][1]
uint loca_up=0;//記錄目前是x坐标的第幾位 (7-player[0][0]%8)
uchar Ordata_up;//用來和資料進行與的值

uint numx_down;//記錄x軸坐标  player[0][0]/8
uint numy_down;//記錄y軸坐标  player[0][1]
uint loca_down=0;//記錄目前是x坐标的第幾位 (7-player[0][0]%8)
uchar Ordata_down;//用來和資料進行與的值

uint ok_move=0;//移動允許
uint direct_t=3;

uint is_destination=0;//目的地檢測函數,到達目的地 為1,沒有 為0;

uint is_open=0;//是否開啟遊戲函數
uint step=0;//用來記錄步數,在LED屏上顯示
uint is_stopMusic=0;
unsigned char n=0;  //n為節拍常數變量    
unsigned char code music_tab[] ={   
0xff,
                    0x39,0x30,0x33,0x30,0x30,0x20,0x30,0x20,0x33,0x20,0x39,0x20,0x33,0x10,
                    0x30,0x10,0x33,0x20,0x30,0x30,0x40,0x30,0x33,0x20,0x39,0x20,0x40,0x20,0x00,
};   
   
void int0()  interrupt 1   //采用中斷0 控制節拍    
{  TH0=0xd8;   
   TL0=0xef;   
   n--;   
}   
   
void delay_Sound (unsigned char m)   //控制頻率延時    
{   
 unsigned i=3*m;   
 while(--i);   
}   
   
void delayMs_Sound(unsigned char a)  //豪秒延時子程式    
{   
  while(--a);                  //采用while(--a) 不要采用while(a--); 
}  

 
void LCD12864_Init(void);  //LCD12864初始化函數
void LCD12864_WriteInfomation(unsigned char ucData,bit bComOrData);   //向LCD12864寫入資料,bComOrData為1時寫入的是資料,0時寫入的是指令
void LCD12864_CheckBusy(void);//忙檢測函數
void LCD12864_DisplayImage(unsigned char code *ucImage,uint direction);
void Delay(unsigned int uiCount);
void ronghe();//融合函數
void OpenGame();
void ClearScreen();
void main();
void LEDDisplayTheEnd();
void delay_1(uint i);
 void 	UsartInit();
   

void Sound()
{
  unsigned char p,m;   //m為頻率常數變量    
  unsigned char i=0;   
 
 TMOD&=0x0f;   
  TMOD|=0x01;   
 TH0=0xd8;
  TL0=0xef;   
  IE=0x82;   
  
  TR0=0;
  
play:   
   while(1)   
    {   

      
    a: p=music_tab[i];   
       if(p==0x00)       { i=0, delayMs_Sound(1000); goto play;}     //如果碰到結束符,延時1秒,回到開始再來一遍    
       else if(p==0xff)  { i=i+1;delayMs_Sound(100),TR0=0; goto a;}  //若碰到休止符,延時100ms,繼續取下一音符    
            else         {m=music_tab[i++], n=music_tab[i++];}  //取頻率常數 和 節拍常數    
             TR0=1;                                             //開定時器1    
           while(n!=0) Beep=~Beep,delay_Sound(m);                         //等待節拍完成, 通過P1口輸出音頻(可多聲道哦!)    
       TR0=0;                                             //關定時器1
	      OpenGame();
		 if(is_open==1)
		 {
			 UsartInit();
			 is_open=0;
	        //lcd_init();
			is_stopMusic=1;
			 return;
			//break;
		 }
	       
    }   
	
	
}

unsigned char player[2][2]={//玩家誕生點
 0,2,1,3
 //120,28,121,29//測試用資料
};

unsigned char code migong[64][16]={//地圖

0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x03,0x00,0xC0,0x00,0x00,0x00,0x33,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x03,0x00,0xC0,0x00,0x00,0x00,0x33,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x03,0x0C,0xCF,0xFC,0xFF,0xFF,0xF3,0xF3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,	
0x03,0x0C,0xCF,0xFC,0xFF,0xFF,0xF3,0xF3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xC0,0x0C,0xCC,0x0C,0xC0,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xC0,0x0C,0xCC,0x0C,0xC0,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xCF,0xFC,0xCC,0xCC,0xCF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xCF,0xFC,0xCC,0xCC,0xCF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xCC,0x3C,0xC0,0xCC,0xCF,0x0C,0x0C,0xCF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xCC,0x3C,0xC0,0xCC,0xCF,0x0C,0x0C,0xCF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xCC,0x30,0xFF,0xCC,0xCC,0x0C,0xCC,0xCF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xCC,0x30,0xFF,0xCC,0xCC,0x0C,0xCC,0xCF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xC0,0x30,0x00,0x0C,0xCC,0xFC,0xCC,0xCF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xC0,0x30,0x00,0x0C,0xCC,0xFC,0xCC,0xCF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0x0C,0xCC,0xFC,0xCC,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0x0C,0xCC,0xFC,0xCC,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xC0,0x00,0x00,0x0C,0xCC,0x00,0xCC,0xCF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xC0,0x00,0x00,0x0C,0xCC,0x00,0xCC,0xCF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xC3,0xFF,0x3F,0xFC,0xCC,0xFF,0xCC,0xCF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xC3,0xFF,0x3F,0xFC,0xCC,0xFF,0xCC,0xCF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xC3,0x00,0x00,0x00,0x00,0xC0,0x0C,0xCF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xC3,0x00,0x00,0x00,0x00,0xC0,0x0C,0xCF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xC3,0x3F,0xC3,0xFF,0xC3,0xCF,0x3F,0xCF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xC3,0x3F,0xC3,0xFF,0xC3,0xCF,0x3F,0xCF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xC3,0x30,0xC3,0x03,0x03,0x0C,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xC3,0x30,0xC3,0x03,0x03,0x0C,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xCF,0xF0,0x03,0x33,0x33,0x3C,0x3F,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xCF,0xF0,0x03,0x33,0x33,0x3C,0x3F,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xCC,0x33,0x3F,0x33,0x33,0x30,0x30,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xCC,0x33,0x3F,0x33,0x33,0x30,0x30,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xCC,0x33,0x30,0x33,0x33,0x33,0xF3,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xCC,0x33,0x30,0x33,0x33,0x33,0xF3,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xCC,0x03,0x03,0xF0,0x33,0x00,0x03,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xCC,0x03,0x03,0xF0,0x33,0x00,0x03,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xCC,0xFF,0xFF,0xFC,0xF3,0xFC,0xFF,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xCC,0xFF,0xFF,0xFC,0xF3,0xFC,0xFF,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xCC,0x00,0x00,0x0C,0xF0,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xCC,0x00,0x00,0x0C,0xF0,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xCC,0xFF,0xFF,0xCC,0xF3,0xFF,0xFF,0xF3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xCC,0xFF,0xFF,0xCC,0xF3,0xFF,0xFF,0xF3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xCC,0xFF,0x00,0xCC,0xF3,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xCC,0xFF,0x00,0xCC,0xF3,0x00,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xC0,0xC0,0x3C,0xCC,0xF3,0x3F,0xFF,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xC0,0xC0,0x3C,0xCC,0xF3,0x3F,0xFF,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xCF,0xFC,0xCC,0xF3,0x30,0x03,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xCF,0xFC,0xCC,0xF3,0x30,0x03,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xC0,0x0F,0xF0,0x0C,0xF3,0x33,0xF3,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xC0,0x0F,0xF0,0x0C,0xF3,0x33,0xF3,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xCF,0xFF,0xFF,0xFC,0xF3,0x33,0x33,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xCF,0xFF,0xFF,0xFC,0xF3,0x33,0x33,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xCC,0x00,0x00,0x00,0xF3,0x33,0x03,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xCC,0x00,0x00,0x00,0xF3,0x33,0x03,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xCF,0xFF,0xFF,0xFC,0xF3,0x33,0xFF,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xCF,0xFF,0xFF,0xFC,0xF3,0x33,0xFF,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xCC,0x00,0xC0,0x00,0xF3,0x30,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xCC,0x00,0xC0,0x00,0xF3,0x30,0x00,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xCC,0xFF,0xFC,0xFC,0xF3,0x33,0xFF,0xF3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xCC,0xFF,0xFC,0xFC,0xF3,0x33,0xFF,0xF3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xC0,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xC0,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	
};
           

四  最終實作

【嵌入式】用51單片機完成迷宮遊戲

完整代碼及實驗報告,實驗錄屏請在公衆号背景回複:迷宮

擷取。

CSDN資源下載下傳連結:https://download.csdn.net/download/weixin_40874586/10977104

如果失效,請在背景留言,12小時之内會回複。

公衆号:選甚春秋

【嵌入式】用51單片機完成迷宮遊戲

繼續閱讀