历史上的今天
今天是:2025年01月31日(星期五)
2020年01月31日 | 基于51单片机的跳一跳小游戏 源程序
2020-01-31 来源:51hei
这段时间学习了LCD12864的无字库使用方法,借此设计了一个单片机跳一跳小游戏
主要功能:控制火材人跳动,判断是否跳在地板上。
不多说直接上图:
仿真原理图如下
总电图图
游戏电路图:
LED控制电路图:
蜂鸣器电路图:
总流程图:
游戏界面:

单片机源程序如下:
#include "main.h"
unsigned char BGM_choose=1;
//人物,地板的信息
/* ***************************************************** */
extern unsigned char mosaic_j1[3];
extern unsigned char mosaic_width1[3];
extern unsigned char mosaic_j2[3];
extern unsigned char mosaic_width2[3];
extern unsigned char NPC_page,NPC_column;
extern bit NPC_xuli_judge; //判断递增与递减
/* ***************************************************** */
void main()
{
unsigned char i=NOSURE;
LCD12864_winit(); //LCD12864初始化
TOOL_randInit(); //随机数初始化
BGM_init(); //BGM初始化
show_start(); //开始界面
//按键按下进入游戏
while(!KEY_Scan()==KEY0SURE);
show_youxi(); //游戏界面
//显示火材人
NPC_page=diban_fir-1;
NPC_column=mosaic_j1[show_judgewei(diban_fir)];
show_NPC(NPC_page,NPC_column,NPC_huo);
//游戏BGM
BGM_choose=2;
while(1)
{
BGM_choose=2;
if(KEY_Scan()==LONGTIME_START)
{
show_NPC(NPC_page,NPC_column,NPC_dun); //火材人蹲
if(KEY0_CLR)
{
i=LONGTIME_START;
while(i!=NOSURE)
{
if(i==KEY0_LSURE)
{
if(NPC_xuli_judge) {show_NPC_xuli(xuli_inc);} //火材人蓄力
else {show_NPC_xuli(xuli_desc);}
}
i=KEY_Scanlongtime();
}
show_NPC(NPC_page,NPC_column,NPC_disp); //火材人消失
NPC_move(); //火材人位置移动
show_NPC(NPC_page,NPC_column,NPC_huo); //火材人显示
show_NPC_xuli(xuli_disp); //火材人蓄力消失
if(!game_judge()) //游戏结束判断
{
BGM_choose=3; //BGM3
game_over(); //游戏结束显示
while(KEY_Scan()==NOSURE);
show_youxi(); //游戏界面刷新
//显示火材人
NPC_page=diban_fir-1;
NPC_column=mosaic_j1[show_judgewei(diban_fir)];
show_NPC(NPC_page,NPC_column,NPC_huo);
}
}
else {show_NPC(NPC_page,NPC_column,NPC_huo);}
}
}
}
//BGM
/* ***************************************************** */
//BGM初始化
void BGM_init()
{
TMOD=0x21; //设置定时器0 16位计数
TL0 =(-1000)%256; //设置定时初值
TH0 =(-1000)/256; //设置定时初值
EA=1;ET0=1;TR0=1;
BGM=0;BGM1=0;
}
void BGM_time0(void) interrupt 1
{
static unsigned char count=0;
if(BGM_choose==1) //游戏开始
{
TL0 =(-30000)%256; //设置定时初值
TH0 =(-30000)/256; //设置定时初值
count++;
if(count==10){BGM=0;BGM1=1;}
if(count==30){BGM=1;BGM1=0;}
if(count==38){BGM=0;BGM1=1;}
if(count==40){BGM=0;BGM1=0;}
if(count==50){BGM=0;BGM1=0;count=0;}
}
if(BGM_choose==2) //游戏
{
TL0 =(-20000)%256; //设置定时初值
TH0 =(-20000)/256; //设置定时初值
count++;
if(count==10){BGM=0;BGM1=1;}
if(count==20){BGM=1;BGM1=0;count=0;}
}
if(BGM_choose==3) //游戏结束
{
TL0 =(-50000)%256; //设置定时初值
TH0 =(-50000)/256; //设置定时初值
count++;
if(count==10){BGM=0;BGM1=1;}
if(count==20){BGM=0;BGM1=0;count=0;}
}
}
史海拾趣
|
2008年英特尔杯大学生电子设计竞赛—嵌入式系统专题邀请赛一等奖作品 本帖最后由 paulhyde 于 2014-9-15 09:01 编辑 参赛学校杭州电子科技大学 指导教师申兴发 参赛队员张斌吴积冰陈宁 作品题目 (中英文对照)嵌入式自主跟踪系统-球童机器人 Embedded Autonomous Tracking System -Caddie Ro ...… 查看全部问答> |
|
假设DAC使用了一个反相运算放大器,C1=C2,A(0)=1000,若VREF=1V,问DAC在最怀情况下的最大精度? 反相放大器的环路增益=0.5×1000=500,因此增益误差为1/501=0.002。增益误差应该小于±0.5LSB,表示为: 增益误差=0.002… 查看全部问答> |
|
我在做写入flash的时候写入的是113个字节的数据,A段的从1000开始写的!!! 我把要写入的数据建立在一个结构里了!!! 可是写完以后读的时候总是后写入的两个读出的是0;如果写入的少的话,比如我写50个字节那么 就有最后1个读出是0;我想问问 ...… 查看全部问答> |
|
用F149驱动继电器结合驱动380V三相电机 利用两极继电器 中间采用光耦驱动第一级继电器 第一级继电器再控制第二级380继电器 上高压电时继电器结合 电机转 然后单片机就死机 求助!!!… 查看全部问答> |
|
这个开发板是去年在淘宝上买的,放那里一直没动,最近想学了,所以拿出来看看,在百度文库里有这个开发板的详细介绍,下面是地址http://wenku.baidu.com/view/0878e189680203d8ce2f249a.html单片机的型号是STC 90C516RD+郭天祥视频教程里面的程序下 ...… 查看全部问答> |
|
使用DTC进行ADC10转换后如何将存入RAM中的数据提取出来? 我用的芯片是G2553,使用DTC进行单通道多次转换后将数据存入RAM,现在准备将RAM中的内容提取出来,应是用什么方法?设数组取首地址0x200? 另外,如果我使用的是序列通道多次转换(32次),A1,A2,DTC将结果存入RAM中,0x200-0x400中存放的是A2的 ...… 查看全部问答> |




