当前位置 博文首页 > 无水wangyang:【嵌入式】用51单片机完成迷宫游戏

    无水wangyang:【嵌入式】用51单片机完成迷宫游戏

    作者:[db:作者] 时间:2021-09-06 13:30

    本次实验为使用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,
    	
    };

    四? 最终实现

    ?

    完整代码及实验报告,实验录屏请在公众号后台回复:迷宫

    获取。

    CSDN资源下载链接:https://download.csdn.net/download/weixin_40874586/10977104

    如果失效,请在后台留言,12小时之内会回复。

    公众号:选甚春秋

    ?

    cs
    下一篇:没有了