本次實驗為使用51單片機做出一份遊戲來。
目的首先是為了應付期末考試,是以此次實驗會有部分不完整之處。
** 實驗特殊說明:
此次實驗中除用到LCD12864、藍牙子產品外,還會使用蜂鳴器完成啟動音樂的播放,以及安卓端的APP的控制(不需要APP的可以在源碼中将部分代碼注釋掉)。
一 實驗說明
使用LCD12864完成迷宮遊戲的繪制,要求遊戲開始時生成迷宮圖案,圖案中有牆和路,要求入口和出口村子能通行的路。要求玩家從左上角誕生,出口位于右下角,要求使用藍牙子產品完成與單片機的連接配接,利用自己制作的APP完成對玩家的操控。使用四個獨立按鍵分别控制人在迷宮中“上、下、左、右”行走操作,直至走到出口,遊戲勝利。
二 實驗要求
- 使用LCD12864點陣顯示迷宮和人。
- 使用藍牙HC-05實作移動端與單片機的連接配接。
- 使用蜂鳴器實作遊戲開始時的背景音樂。
- 使用獨立按鍵實作按鍵對玩家的控制。
三 部分源碼
#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,
};
四 最終實作
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPn5ENVRkTzcGRNBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL4QzMyQzMxgTM2IjMwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
完整代碼及實驗報告,實驗錄屏請在公衆号背景回複:迷宮
擷取。
CSDN資源下載下傳連結:https://download.csdn.net/download/weixin_40874586/10977104
如果失效,請在背景留言,12小時之内會回複。
公衆号:選甚春秋