基于51单片机的贪吃蛇游戏设计_单片机制作小游戏

基于51单片机的贪吃蛇游戏设计_单片机制作小游戏基于51单片机的贪吃蛇游戏前言:这篇文章是我当时制作完成后写的总结,已经过去了一段时间,苦于找不到实物的图片,就把全文都粘贴到了下面。今天是11月2日,昨天我完成了我的贪吃蛇的制作。那个战线一个多月,让我煞费苦心的工作。在这一过程中,学到了许多新知识,也认识了许多新朋友,无论星火杯结果如何,它都将成为我的大学生涯,甚至一生中宝贵的财富。所以我决定将我学到的,想到的都写下来,给将来的

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

基于51单片机的贪吃蛇游戏

打死不学硬件,本文已停止更新

前言:

这篇文章是我当时制作完成后写的总结,已经过去了一段时间,苦于找不到实物的图片,就把全文都粘贴到了下面。
今天是11月2日,昨天我完成了我的贪吃蛇的制作。那个战线一个多月,让我煞费苦心的工作。在这一过程中,学到了许多新知识,也认识了许多新朋友,无论星火杯结果如何,它都将成为我的大学生涯,甚至一生中宝贵的财富。所以我决定将我学到的,想到的都写下来,给将来的自己一份美好的回忆。这次总结的内容主要是进入西电来学到的一些硬件知识,主要包括51单片机基础知识(最小系统、LED流水灯、蜂鸣器、独立按键、数码管显示),Protues仿真(以贪吃蛇为例),Keil的使用(贪吃蛇程序的分析),最后是贪吃蛇制作的基本步骤。

一、51单片机基础

1、单片机介绍

单片机是在一块硅片上集成了微处理器、储存器及各种输入输出接口的芯片。目前单片机种类众多,笔者在制作贪吃蛇的时候用的是STC89C52RC。但只要学会一种,其它的都可以轻松搞定。

2、单片机引脚介绍

这里写图片描述
上图为STC89C52RC引脚图,共四十引脚,可按照其功能将其分为三类:电源和时钟引脚(VCC、GND、XTAL1、XTAL2),编程控制引脚和I/O口引脚(P0、P1、P2、P3)。
注:①P0口内部没有上拉电阻,不能正常输出高\低电平,使用时务必外接上拉电阻(10KΩ)②P3.0为串行输入口(RXD,第10脚),P3.1为串行输出口(TXD,第11脚)

3、单片机最小系统

这里写图片描述
指用最少的元件组成的单片机可以工作的系统。对51系列单片机来说,最小系统一般应该包括:单片机、晶振电路、复位电路。如上方电路图。

4、LED流水灯

//常用预处理命令
typedef unsigned char u8;
typedef unsigned int u16;
#define LED  P0
//包含头文件
#include<intrins.h>	
//实现函数
led=_crol_(led,1);
led=_cror_(led,1);

Jetbrains全家桶1年46,售后保障稳定

###5.蜂鸣器
蜂鸣器可分为电磁式蜂鸣器(通过高低电平控制)和压电式蜂鸣器(通过脉冲触发)两种。原理:改变单片机引脚输出波形的频率,可以调整控制蜂鸣器音调,产生各种不同音色、音调的声音。改变输出电平的高低电平占空比,可以控制蜂鸣器的声音大小。

###6.数码管动态扫描
原理:轮流向各位数码管送出字形码指令,利用发光管的余晖和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。
##二、Protues仿真(以贪吃蛇为例)
###1.在Protues中用到的命令
1N4003——二极管
AT89C52——单片机
BUTTON——按键
MATRIX-8×8-RED——红色8×8点阵
RES——电阻
POWER——电源
GROUND——接地
###2.LED点阵
笔者在焊接时用的是2088BS(一种共阳极点阵),若是想要区分共阴、共阳可用万用表测量。共阳极电路如右下图所示,如果想要位于(1,1)的灯亮,只需要将⑨设置为高电平,将⑬设置为低电平。进一步想让对角线亮起来,可利用动态扫描。这里写图片描述
这里写图片描述

注:点阵的行列引脚分布是乱序的,焊接时一定要仔细,可用杜邦线连接试验。

3.电路图

这里写图片描述

分析:该电路由单片机,8*8点阵,一个电阻,四个二极管和四个按键组成。点阵的16个引脚分别和单片机的P1端口、P2端口相连,通过程序控制高低电平的变化,实现点阵的变化。四个二极管相当于下拉电阻,当按键未按下时,P3口直接经过二极管接地,控制P3口为低电平。按键按下后,电流通过按键进入单片机,使单片机变为高电平,当单片机检测到高电平的时候,会做出相应反应。实现贪吃蛇游戏。

三、Keil的使用(贪吃蛇程序的分析)

#include<reg51.h>
#define uchar unsigned char
#define SNAKE 20                 //最大长度
#define TIME 500000            //显示延时时间
#define SPEED 71               //速度控制
sbit keyenable=P3^6;			//方向使能
sbit up=P3^3;      
sbit down=P3^1;
sbit right=P3^2;
sbit left=P3^4;
uchar x[SNAKE+1];
uchar y[SNAKE+1];          
uchar time,n,i,e;              //延时时间,当前蛇长,通用循环变量,当前速度		
char addx,addy;                 //位移偏移量
void delay(char MS){while(MS--);}
bit knock()//判断碰撞
{
	bit k;
	k=0;
	if(x[1]>7||y[1]>7) 
	      k=1;                             //撞墙
	for(i=2;i<n;i++)
	  if((x[1]==x[i])&(y[1]==y[i]))
		  k=1;                            //撞自己
	return k;
}
void turnkey()//上下左右键位处理
{
	if(keyenable)
	{
		if(left){addy=0;if(addx!=1)addx=-1; else addx=1;}
		if(right){addy=0;if(addx!=-1)addx=1; else addx=-1;}
		if(up){addx=0;if(addy!=-1)addy=1; else addy=-1;}
		if(down){addx=0;if(addy!=1)addy=-1; else addy=1;}
	}
}
uchar mux(uchar temp) //乘方程序
{
	if(temp==7) return 128;
	if(temp==6) return 64;
	if(temp==5) return 32;
	if(temp==4) return 16;
	if(temp==3) return 8;
	if(temp==2) return 4;
	if(temp==1) return 2;
	if(temp==0) return 1;
	return 0;
}
void timer0(uchar k)//显示程序
{
	while(k--)
	{
		for(i=0;i<SNAKE+1;i++)
		{
			P2=mux(x[i]);
			P1=255-mux(y[i]);
			turnkey();                     //上下左右键位处理
			delay(TIME);                   //显示延迟
			P2=0x00;P1=0xff;
		}
	}
} 
void main(void)
{
	e=SPEED;
 	P0=0x00;P1=0xff;
 	P2=0x00;P3=0x00;
	while(1)       
 	{
 		for(i=3;i<SNAKE+1;i++)  x[i]=100;
		for(i=3;i<SNAKE+1;i++)  y[i]=100;					         //初始化
 		x[0]=4;y[0]=4;                                          //果子                            
 		n=3;                                                  //蛇长 n=-1
 		x[1]=1;y[1]=0;                                          //蛇头
 		x[2]=0;y[2]=0;                                          //蛇尾1
 		addx=0;addy=0;                                        //位移偏移
 		while(1){if(keyenable)break;timer0(1);}
 		while(1)         
  		{
		  	timer0(e);
   			if(knock()){e=SPEED;break;}                            //判断碰撞
        	if((x[0]==x[1]+addx)&(y[0]==y[1]+addy))                  //是否吃东西
           	{
			   n++;
		   	   if(n==SNAKE+1)
		   	   {
				  n=3;e=e-10;
		   	      for(i=3;i<SNAKE+1;i++) x[i]=100;
           	      for(i=3;i<SNAKE+1;i++) y[i]=100;
		   	   }
           	   x[0]=x[n-2];
           	   y[0]=y[n-2];
           	}
    		for(i=n-1;i>1;i--)
			   {x[i]=x[i-1];y[i]=y[i-1];}     
    		x[1]=x[2]+addx;
			y[1]=y[2]+addy;                     //移动
  		}						
 	}			
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/226775.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(5)


相关推荐

  • 手把手实现Java图书管理系统(附源码)_图书管理系统项目背景

    手把手实现Java图书管理系统(附源码)_图书管理系统项目背景基于JavaWeb开发的图书管理系统实现功能数据库运行环境图书馆作为一种信息资源的集散地,图书和用户借阅资料繁多,包含很多的信息数据的管理,现今,有很多的图书馆都是初步开始使用,甚至尚未使用计算机进行信息管理。图书馆信息管理作为计算机应用的一个分支,有着手工管理无法比拟的优点,如检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点很大程度的提高了管理图书馆信息的工作效率,节省了大量资金,方便了师生对图书的借阅和归还。图书馆管理系统代表了图书馆管理的信息化,不仅是体现图书馆现代化形

  • android之存储篇_SQLite存储方式「建议收藏」

    SQLite是一种转为嵌入式设备设计的轻型数据库,其只有五种数据类型,分别是:    NULL: 空值    INTEGER: 整数    REAL: 浮点数    TEXT: 字符串    BLOB: 大数据  在SQLite中,并没有专门设计BOOLEAN和DATE类型,因为BOOLEAN型可以用INTEGER的0和1代替true和false,而DATE类型则可以拥有特

  • 小数和二进制的转换_进制转换表

    小数和二进制的转换_进制转换表1.小数用二进制如何表示首先,给出一个任意实数,整数部分用普通的二进制便可以表示,这里只说小数部分如何表示例如0.6文字描述该过程如下:将该数字乘以2,取出整数部分作为二进制表示的第1位;然后再将小数部分乘以2,将得到的整数部分作为二进制表示的第2位;以此类推,知道小数部分为0。特殊情况:小数部分出现循环,无法停止,则用有限的二进制位无法准确表示一个小数,这也是在编程语言中表

    2022年10月31日
  • js取数组截取

    js取数组截取splice()会删除选定的数组,slice()只会进行选定,pop选定最后一个元素删除并返回最后一个元素的值,length函数判断数组的长度,使用slice选取单个值的时候记得返回的是一个数组类型。constarr=[1,2,7,2,6,0,3,1,5,7,8,9,45,12,34,0,56,12,2]//slice()方法constsliceArr…

  • Java回调机制详解[通俗易懂]

    Java回调机制详解[通俗易懂]网上关于Java回调的文章一抓一大把,但是看完总是云里雾里,不知所云,特别是看到抓取别人的代码走两步时,总是现眼。于是自己决定写一篇关于Java机制的文章,以方便大家和自己更深入的学习Java回调机制。

  • 【强化学习】DDPG(Deep Deterministic Policy Gradient)算法详解[通俗易懂]

    【强化学习】DDPG(Deep Deterministic Policy Gradient)算法详解[通俗易懂]http://www0.cs.ucl.ac.uk/staff/d.silver/web/Teaching.html引自ReinforcementLearning:AnIntroduction强化学习名著2018新编版DPG论文http://www0.cs.ucl.ac.uk/staff/d.silver/web/Applications_files/determinis…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号