找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2720|回复: 6
收起左侧

基于51单片机的跳一跳小游戏 源程序+Proteus仿真电路图

[复制链接]
ID:670227 发表于 2020-1-30 12:50 | 显示全部楼层 |阅读模式
这段时间学习了LCD12864的无字库使用方法,借此设计了一个单片机跳一跳小游戏
主要功能:控制火材人跳动,判断是否跳在地板上。

不多说直接上图:

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
总电图图
硬件电路图.png


游戏电路图:
游戏界面.png


LED控制电路图:
LED控制.png


蜂鸣器电路图:
BGM.png


总流程图:
总流程图.png


游戏界面:
游戏开始界面.png 游戏界面显示.png 游戏结束.png



具体程序附件在里面:
软件.png 硬件仿真图.png
程序.png

单片机源程序如下:
  1. #include "main.h"
  2. unsigned char BGM_choose=1;
  3. //人物,地板的信息
  4. /* ***************************************************** */
  5. extern unsigned char mosaic_j1[3];
  6. extern unsigned char mosaic_width1[3];
  7. extern unsigned char mosaic_j2[3];
  8. extern unsigned char mosaic_width2[3];
  9. extern unsigned char NPC_page,NPC_column;
  10. extern bit NPC_xuli_judge; //判断递增与递减
  11. /* ***************************************************** */

  12. void main()
  13. {
  14. unsigned char i=NOSURE;
  15. LCD12864_winit();           //LCD12864初始化
  16. TOOL_randInit();             //随机数初始化
  17. BGM_init();           //BGM初始化

  18. show_start();                     //开始界面
  19. //按键按下进入游戏
  20. while(!KEY_Scan()==KEY0SURE);
  21.                   
  22. show_youxi();                     //游戏界面

  23. //显示火材人
  24. NPC_page=diban_fir-1;
  25. NPC_column=mosaic_j1[show_judgewei(diban_fir)];
  26. show_NPC(NPC_page,NPC_column,NPC_huo);
  27. //游戏BGM
  28. BGM_choose=2;
  29.         
  30. while(1)
  31. {
  32.         BGM_choose=2;
  33. if(KEY_Scan()==LONGTIME_START)
  34. {
  35.   show_NPC(NPC_page,NPC_column,NPC_dun);             //火材人蹲
  36.   if(KEY0_CLR)
  37.   {
  38.      i=LONGTIME_START;
  39.      while(i!=NOSURE)
  40.          {
  41.            if(i==KEY0_LSURE)
  42.            {
  43.             if(NPC_xuli_judge)   {show_NPC_xuli(xuli_inc);}                 //火材人蓄力
  44.                               else                 {show_NPC_xuli(xuli_desc);}   
  45.            }         
  46.            i=KEY_Scanlongtime();
  47.          }
  48.           show_NPC(NPC_page,NPC_column,NPC_disp);  //火材人消失
  49.           NPC_move();                                                                        //火材人位置移动
  50.           show_NPC(NPC_page,NPC_column,NPC_huo);   //火材人显示
  51.           show_NPC_xuli(xuli_disp);                                   //火材人蓄力消失
  52.           if(!game_judge())                                                       //游戏结束判断
  53.           {
  54.                 BGM_choose=3;                      //BGM3
  55.           game_over();                       //游戏结束显示
  56.           while(KEY_Scan()==NOSURE);
  57.           show_youxi();                                   //游戏界面刷新

  58.                                        //显示火材人
  59.     NPC_page=diban_fir-1;
  60.     NPC_column=mosaic_j1[show_judgewei(diban_fir)];
  61.     show_NPC(NPC_page,NPC_column,NPC_huo);
  62.           }

  63.   }
  64.   else {show_NPC(NPC_page,NPC_column,NPC_huo);}
  65. }   
  66. }
  67. }


  68. //BGM
  69. /* ***************************************************** */
  70. //BGM初始化
  71. void BGM_init()
  72. {
  73.     TMOD=0x21;        //设置定时器0 16位计数
  74.     TL0 =(-1000)%256;                //设置定时初值
  75.     TH0 =(-1000)/256;                //设置定时初值
  76.     EA=1;ET0=1;TR0=1;
  77.           BGM=0;BGM1=0;
  78. }

  79. void BGM_time0(void) interrupt 1
  80. {
  81.         static unsigned char count=0;
  82.   if(BGM_choose==1)           //游戏开始
  83.         {
  84.           TL0 =(-30000)%256;                //设置定时初值
  85.     TH0 =(-30000)/256;                //设置定时初值
  86.                 count++;
  87.                 if(count==10){BGM=0;BGM1=1;}
  88.           if(count==30){BGM=1;BGM1=0;}
  89.                 if(count==38){BGM=0;BGM1=1;}
  90.                 if(count==40){BGM=0;BGM1=0;}
  91.                 if(count==50){BGM=0;BGM1=0;count=0;}
  92.         }               
  93.   if(BGM_choose==2)           //游戏
  94.         {
  95.           TL0 =(-20000)%256;                //设置定时初值
  96.     TH0 =(-20000)/256;                //设置定时初值
  97.                 count++;
  98.                 if(count==10){BGM=0;BGM1=1;}
  99.                 if(count==20){BGM=1;BGM1=0;count=0;}
  100.         }        
  101.         
  102.          if(BGM_choose==3)           //游戏结束
  103.         {
  104.           TL0 =(-50000)%256;                //设置定时初值
  105.     TH0 =(-50000)/256;                //设置定时初值
  106.                 count++;
  107.                 if(count==10){BGM=0;BGM1=1;}
  108.                 if(count==20){BGM=0;BGM1=0;count=0;}
  109.         }
  110. }
复制代码

51hei.png
有什么BUG,欢迎大家提出,一起讨论
单片机跳一跳.rar (2.75 MB, 下载次数: 86)

评分

参与人数 1黑币 +80 收起 理由
admin + 80 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:670227 发表于 2020-1-30 12:52 | 显示全部楼层
程序运行过程中会有3个警告,意思是有的函数没有被用到
没有太大的影响
回复

使用道具 举报

ID:100515 发表于 2020-1-30 21:30 | 显示全部楼层
过年还这么勤奋,赞
回复

使用道具 举报

ID:266007 发表于 2020-1-30 22:45 来自手机 | 显示全部楼层
非常感谢如此有用的教程
回复

使用道具 举报

ID:102293 发表于 2020-2-5 10:40 | 显示全部楼层
学习学习,谢谢楼主分享。辛苦了!
回复

使用道具 举报

ID:654731 发表于 2020-2-5 11:50 | 显示全部楼层
爱上lz,游戏做的很不错
回复

使用道具 举报

ID:546864 发表于 2021-5-19 13:34 来自手机 | 显示全部楼层
NOSURE未定义阿?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表