基于51单片机的专注力训练游戏机的设计

内容:

人的学习能力中专注力是很重要的一项。现在的小朋友有很多都因为各种原因导致专注力较差。市面上也有很多训练专注力的书籍和玩具,玩具有的价钱太贵,有的设计反而不利于小朋友的专注。本系统要求设计并实现一款既有趣,让小朋友能玩下去,又能提高小朋友的专注力的玩具,而且性价比好。

因此,本系统要求使用单片机或其他控制器件实现一个专注力训练游戏机的设计和实现。要求系统能实现多级别难度,启动后随机亮灯,可语音、按键等方式熄灭相应点亮的灯。要求设计尽可能的方便使用,合理。要求熟悉单片机或其他控制器的原理和设计,熟练掌握C语言或其他编程语言的设计编程,完成时间管理器的软件、硬件设计与实现。整个毕业设计还要求完成相应的英文翻译和毕业设计论文。

1、通过学习掌握程序设计、调试技术。

2、掌握仿真软件的使用方法,并能编辑、编译和下载设计文件。

3、掌握系统搭建实用硬件系统的方法。

要求与数据

要求:

1、 设计并实现一款专注力训练游戏机。要求能随机亮灯,可通过识别语音,按键等不同方式,熄灭相应点亮的灯。

2、 游戏要可设置至少3个不同级别。

3、 游戏的不同级别,要设置不同的亮灯的数量和时间长度等,并逐级提高难度。

4、 游戏功能合理,有吸引性。

5、 游戏过程中播放不同频率的音乐。(可选项)




/**********************************
包含头文件
**********************************/
#include "key.h"


/**********************************
变量定义
**********************************/
uchar chiclet_keyboard_num = 0;				//键值变量


/**********************************
函数定义
**********************************/
/****
*******独立按键扫描函数
*******返回值:键值
*****/
uchar Chiclet_Keyboard_Scan(void)
{
	if(K1 == 0)													//按键K1为低电平
	{
		Delay_function(2);								//2ms消抖
		if(K1 == 0)												//按键K1依然为低电平,此时确认是K1按下
		{
			chiclet_keyboard_num = 1;				//键值设置成1
		}
		while(!K1);												//while死循环,直到抬手跳出
		return chiclet_keyboard_num;			//返回键值
	}

	if(K2 == 0)													//按键K2为低电平
	{
		Delay_function(2);								//2ms消抖
		if(K2 == 0)												//按键K2依然为低电平,此时确认是K2按下
		{
			chiclet_keyboard_num = 2;				//键值设置成2
		}
		while(!K2);												//while死循环,直到抬手跳出
		return chiclet_keyboard_num;			//返回键值
	}

	if(K3 == 0)													//按键K3为低电平
	{
		Delay_function(2);								//2ms消抖
		if(K3 == 0)												//按键K3依然为低电平,此时确认是K3按下
		{
			chiclet_keyboard_num = 3;				//键值设置成3
		}
		while(!K3);												//while死循环,直到抬手跳出
		return chiclet_keyboard_num;			//返回键值
	}
	
	if(K4 == 0)													//按键K3为低电平
	{
		Delay_function(2);								//2ms消抖
		if(K4 == 0)												//按键K3依然为低电平,此时确认是K3按下
		{
			chiclet_keyboard_num = 4;				//键值设置成3
		}
		while(!K4);												//while死循环,直到抬手跳出
		return chiclet_keyboard_num;			//返回键值
	}
	
	if(K5 == 0)													//按键K3为低电平
	{
		Delay_function(2);								//2ms消抖
		if(K5 == 0)												//按键K3依然为低电平,此时确认是K3按下
		{
			chiclet_keyboard_num = 5;				//键值设置成3
		}
		while(!K5);												//while死循环,直到抬手跳出
		return chiclet_keyboard_num;			//返回键值
	}
	
	if(K6 == 0)													//按键K3为低电平
	{
		Delay_function(2);								//2ms消抖
		if(K6 == 0)												//按键K3依然为低电平,此时确认是K3按下
		{
			chiclet_keyboard_num = 6;				//键值设置成3
		}
		while(!K6);												//while死循环,直到抬手跳出
		return chiclet_keyboard_num;			//返回键值
	}
	
	if(K7 == 0)													//按键K3为低电平
	{
		Delay_function(2);								//2ms消抖
		if(K7 == 0)												//按键K3依然为低电平,此时确认是K3按下
		{
			chiclet_keyboard_num = 7;				//键值设置成3
		}
		while(!K7);												//while死循环,直到抬手跳出
		return chiclet_keyboard_num;			//返回键值
	}
	
	if(K8 == 0)													//按键K3为低电平
	{
		Delay_function(2);								//2ms消抖
		if(K8 == 0)												//按键K3依然为低电平,此时确认是K3按下
		{
			chiclet_keyboard_num = 8;				//键值设置成3
		}
		while(!K8);												//while死循环,直到抬手跳出
		return chiclet_keyboard_num;			//返回键值
	}
	
	if(K9 == 0)													//按键K3为低电平
	{
		Delay_function(2);								//2ms消抖
		if(K9 == 0)												//按键K3依然为低电平,此时确认是K3按下
		{
			chiclet_keyboard_num = 9;				//键值设置成3
		}
		while(!K9);												//while死循环,直到抬手跳出
		return chiclet_keyboard_num;			//返回键值
	}
	if(K10 == 0)													//按键K3为低电平
	{
		Delay_function(2);								//2ms消抖
		if(K10 == 0)												//按键K3依然为低电平,此时确认是K3按下
		{
			chiclet_keyboard_num = 10;				//键值设置成3
		}
		while(!K10);												//while死循环,直到抬手跳出
		return chiclet_keyboard_num;			//返回键值
	}
	
	if(K11 == 0)													//按键K3为低电平
	{
		Delay_function(2);								//2ms消抖
		if(K11 == 0)												//按键K3依然为低电平,此时确认是K3按下
		{
			chiclet_keyboard_num = 11;				//键值设置成3
		}
		while(!K11);												//while死循环,直到抬手跳出
		return chiclet_keyboard_num;			//返回键值
	}
	
	if(K12 == 0)													//按键K3为低电平
	{
		Delay_function(2);								//2ms消抖
		if(K12 == 0)												//按键K3依然为低电平,此时确认是K3按下
		{
			chiclet_keyboard_num = 12;				//键值设置成3
		}
		while(!K12);												//while死循环,直到抬手跳出
		return chiclet_keyboard_num;			//返回键值
	}
	if(K13 == 0)													//按键K3为低电平
	{
		Delay_function(2);								//2ms消抖
		if(K13 == 0)												//按键K3依然为低电平,此时确认是K3按下
		{
			chiclet_keyboard_num = 13;				//键值设置成3
		}
		while(!K13);												//while死循环,直到抬手跳出
		return chiclet_keyboard_num;			//返回键值
	}
	
	if(K14 == 0)													//按键K3为低电平
	{
		Delay_function(2);								//2ms消抖
		if(K14 == 0)												//按键K3依然为低电平,此时确认是K3按下
		{
			chiclet_keyboard_num = 14;				//键值设置成3
		}
		while(!K14);												//while死循环,直到抬手跳出
		return chiclet_keyboard_num;			//返回键值
	}
	
	return 0;														//没有按键按下,返回0
}

#include "main.h"
#include "key.h"
#include "Time.h"
#include "uart.h"
#include <stdlib.h>


/**********************************
变量定义
**********************************/
uchar key_num = 0;										//按键标志位
uint time_num = 0;										//计时变量
uchar x=13;									//随机数

uint time=0;									//时间变量
uchar num=5;
uchar num_1=1;									//判断错误变量
uchar num_2=1;									//判断错误变量
uchar num_3=1;									//判断错误变量
uchar num_4=1;									//判断错误变量
uchar num_5=1;									//判断错误变量
uchar num_6=1;									//判断错误变量
uchar num_7=1;									//判断错误变量
uchar num_8=1;									//判断错误变量
uchar num_9=1;									//判断错误变量
uchar num_10=1;									//判断错误变量
uchar num_11=1;									//判断错误变量
uchar num_12=1;									//判断错误变量
uchar state=0;									//开始变量
uchar state_time=4;									//难度变量
uint i=0;									//次数变量
bit state_min=0;									//简单难度变量播报标志位
bit state_mind=0;									//中断难度变量播报标志位
bit state_max=0;									//高难度变量播报标志位
bit state_over=0;									//高难度变量播报标志位
extern uint time_1s;

extern uchar uart_num,uart_buf[30],uart_time;		//串口接收相关变量
extern bit uart_rx_flag=1;						    //串口接收标志位
/**********************************
函数声明
**********************************/
void Delay_function(uint x);					//延时函数
void Monitor_function(void);					//监测函数
void Manage_function(void);						//处理函数
void Timer1_Init(void);		                    //1毫秒@11.0592MHz

/****
*******	主函数 
*****/
void main()
{
	Timer0Init();									//定时器0初使化函数
	Uart_Init();									//串口初始化函数
	Timer1_Init();									//定时器1初始化
	
	while(1)
	{

		Monitor_function();								//监测函数
		Manage_function();								//处理函数
		
		Delay_function(10);								//延时10ms
		time_num++;												//计时变量+1
		if(time_num > 5000)
		{
			time_num = 0;
		}
	}
}

/****
*******	延时 x ms函数
*****/
void Delay_function(uint x)
{
	uint m,n;
	for(m=x;m>0;m--)
	for(n=110;n>0;n--);
}

/****
*******按键函数
*****/

void Timer1() interrupt 3
{
	key_num = Chiclet_Keyboard_Scan();	//按键扫描
	if(key_num != 0)										//有按键按下
	{
		switch(key_num)
		{
			case 1:													//按键1
				LED_1=1;												//关1
				num_1--;
				num--;
			break;

			case 2:													//按键2
				LED_2=1;												//关2
				num_2--;
				num--;
			break;

			case 3:													//按键3
				LED_3=1;												//关3
				num_3--;
				num--;
			break;
			
			case 4:													//按键3
				LED_4=1;                                               //关4
				num_4--;
				num--;
			break;
			
			case 5:													//按键3
				LED_5=1;                                               //关5
				num_5--;
				num--;
			break;
			
			case 6:													//按键3
				LED_6=1;                                               //关6
				num_6--;
				num--;
			break;
			
			case 7:													//按键3
				LED_7=1;                                               //关7
				num_7--;
				num--;
			break;
			
			case 8:													//按键3
				LED_8=1;                                               //关8
				num_8--;
				num--;
			break;
			
			case 9:													//按键3
				LED_9=1;                                               //关9
				num_9--;
				num--;
			break;
			
			case 10:													//按键3
				LED_10=1;                                               //关10
				num_10--;

image.png

image.png

image.png

 

 文章借鉴于此纷传

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值