amoBBS 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
查看: 290|回复: 1

基于STC单片机开发的密室专用SDK,分享一个案例

[复制链接]
发表于 2019-5-3 21:06:15 | 显示全部楼层 |阅读模式

有一套密室专用的模块硬件
硬件接口上是包含输入输出接口,以及密室中常用的灯锁接口
再就是像音乐播放,灯光控制等等接口了

二楼直接放个案例看看

 楼主| 发表于 2019-5-3 21:07:15 | 显示全部楼层
2-案例演示-语音版打地鼠
1-游戏玩法:
1-上个机关启动之后,所有的指示灯闪烁3次,开始播放循环播放北京音效,该游戏启动。
2-此时,随机播放一首音效(1-5首其中一个),并且对应的灯箱亮起,
如果,如果在3秒内按下对应的地鼠按键,灯箱熄灭,连续击中N(可以设置)次之后,所有地鼠快速闪烁5次,播放成功音效,电磁锁打开。
3-如果在规定时间内,没有击中对应的地鼠,或者击错地鼠,游戏失败,播放错误音效,需要从头开始。
2-视频演示:

3-程序源码:

#include "user_file.h"
/**********************************************************************************
+---------------------------------------------------------+
                        用户函数部分(user_file.h里面有详细使用介绍)
+---------------------------------------------------------+
-  目前进展:

- 日期    :2018-09-08

- 作者    :意想意创.

- 硬件环境:意想意创-A0001-2.6代黑色盒子-音乐模块。

- 软件版本号:V1.0

- 技术论坛:XXXXXXX

- 备注    :本示例在 TKStudio 开发环境下,用2.6代-音乐模块调试OK。

- Copyright(C):青岛意想意创技术发展有限公司。

- All rights reserved

**********************************************************************************/
MODU_Game_Tim Game_Tim={//游戏计时变量
        0,0,0
};
       
uchar Game_Right_Num=0;       //游戏成功的次数标记

uchar Game_isGo=0;           //游戏流程标记

/*==============================
功能:这是一个串口接受函数,接受到的数据都在buf中配合S(uchar *buf,uchar len)使用
参数:发送的数据和数据长度;
返回:无;
===============================*/
void UART_ReceiveBuffer(uchar *buf,uchar len)
{
        /*下面这个历程,接受到什么数据,在转发出去的功能*/
   UART1_SendBuffer(buf,len);
}
/*==============================
功能://这是一个1毫秒的中断函数;
参数:无;
返回:无;
===============================*/
void PF_Tim0_1msIT(void)
{
        Game_ADD_Tim();
        return ;
}
/***************************************

功能:游戏启动函数;
参数:无;
返回:成功1,失败0;
***************************************/
uchar Game_Star(void)//游戏启动函数
{
        uchar i=0;
        for(i=0;i<3;i++){            //游戏启动之后,所有灯箱闪烁三次
                OutSet(0xFF,ENABLE);
                delay_ms(500);
                OutSet(0xFF,DISABLE);
                delay_ms(500);
        }                        
        return 1;
}
/***************************************
功能:游戏随机播放音效函数;
参数:无;
返回:返回随机的音乐编号;
***************************************/
uchar Game_Rand_Music(void)//音乐随机播放音效函数
{
        uchar Value=0;
        while(1){
                Value=rand()%6; //随机数值应该比实际需要的数值大1
                if(Value!=NO){
                        Music_Play(Value); //播放对应的音效
                        return Value;
                }
        }
       
}
/***************************************
功能:游戏按键值比对函数;
参数:无;
返回:成功返回1,失败返回2;
***************************************/
uchar Game_Key_ComPare(uchar Value) //游戏按键比对函数;
{
        uchar i=0;      
        static uchar Key_Index[5]={0,0,0,0,0};  
        for(i=1;i<=5;i++){                                          //扫描5个地鼠按键
                if((Read_Input(i)==1) && (Key_Index[i-1]==NO)){           //如果有按键按下
                        Key_Index[i-1]=YES;
                        if(i==Value){
                                return 1;
                        }
                        else{
                                return 2;
                        }
                }
                else if((Read_Input(i)==0) && (Key_Index[i-1]==YES)){
                        Key_Index[i-1]=NO;
                }
        }
        return 0;
}
/***************************************
功能:地鼠在线定时器函数;
参数:无;
返回:无;
***************************************/
uchar Game_ADD_Tim(void)//游戏计时函数;
{
        if(Game_Tim.Star==YES){
                if(++Game_Tim.Sec>=1000){
                        Game_Tim.Sec=NO;
                        if(++Game_Tim.Cnt>=GAME_TIME){
                                Game_Tim.Star=second;Game_Tim.Cnt=Game_Tim.Sec=NO;  //GAME_TIME秒计时函数
                        }
                }
        }
        return 1;
}
/***************************************
功能:游戏流程执行函数;
参数:无;
返回:成功返回1,失败返回2;
***************************************/
uchar Game_result(void)//游戏效果执行函数
{
        static uchar Index=0;
        static uchar Music_Num=0;
        uchar Sta=0;
        if(Index==NO){
                Music_Num=Game_Rand_Music(); //随机播放一首音效
                OutSet(Music_Num,ENABLE);      //打开对用的灯箱
                Game_Tim.Star=YES;Game_Tim.Sec=Game_Tim.Cnt=NO; //打开按键定时器函数
                Index=YES;
        }
        else if(Index==YES){
                Sta=Game_Key_ComPare(Music_Num); //按键值和随机的音效值进行比较
                if(Sta==YES){                        //表示此次按键按对
                        Game_Tim.Star=Game_Tim.Cnt=Game_Tim.Sec=NO;
                        Index=NO;
                        return 1;
                }
                else if(Sta==second){                //表示是此次按键按错
                        Index=NO;
                        Game_Tim.Star=Game_Tim.Cnt=Game_Tim.Sec=NO;
                        return 2;
                }
        }
        if(Game_Tim.Star==second){
                Game_Tim.Star=Game_Tim.Cnt=Game_Tim.Sec=NO;
                Index=NO;return 2;
        }
        return 0;
}
/***************************************
功能:游戏正确效果执行函数;
参数:无;
返回:成功1次返回1,全部成功返回2,;
***************************************/
uchar Game_Right(void)//游戏正确结果执行函数
{
        uchar i=0;
        Game_Right_Num++;
        /*======游戏过关效果=======*/
        if(Game_Right_Num>=GAME_TURE_NUM){             //游戏过关之后
                Music_Play(6);                          //游戏过关之后,播放成功音效,并且让所有的地鼠闪烁5次
                LockSet(POWEROPEN);                     //打开电磁锁
                for(i=0;i<5;i++){
                        OutSet(0xFF,ENABLE);
                        delay_ms(300);
                        OutSet(0xFF,DISABLE);
                        delay_ms(300);
                }     
                return 2;   
        }
        /*=======击中一次地鼠效果=======*/
        OutSet(0xFF,DISABLE);                      //关闭正确的灯箱
        return 1;
}
/***************************************
功能:游戏错误执行函数;
参数:无;
返回:执行完毕返回1,失败返回0;
***************************************/
uchar Game_Wrong(void)//游戏错误效果执行函数
{
        static uchar Index=0;
        Game_Right_Num=NO;                        //清空地鼠的连击次数
        OutSet(0xFF,DISABLE);                    //所有灯箱的灯熄灭
       
        if(Index==NO){
                Music_Play(7);                     //播放错误的地鼠音效  
                Index=YES;
        }
        else if((Index==YES) && (Music_Read_FeedBack()==1)){  //等待错误的效果执行完毕
                Index=NO;
                return 1;
        }
        return 0;
       
}
/***************************************
功能:这是一个执行一次的任务;
参数:无;
返回:无;
***************************************/
void Master_Setup()
{
        Game_Star();         //游戏启动函数
}
/**************************************
功能:这是一个循环函数;
参数:无;
返回:无;
PS:1-上个机关启动之后,所有的指示灯闪烁3次,开始播放循环播放北京音效,该游戏启动。
2-此时,随机播放一首音效(1-5首其中一个),并且对应的灯箱亮起,
如果,如果在3秒内按下对应的地鼠按键,灯箱熄灭,连续击中N(可以设置)次之后,所有地鼠快速闪烁5次,播放成功音效,电磁锁打开。
3-如果在规定时间内,没有击中对应的地鼠,或者击错地鼠,游戏失败,播放错误音效,需要从头开始。
**************************************/
void Master_Loop()
{
        uchar Sta=0;
        switch (Game_isGo)
        {
                case 0:
                        Game_isGo=Game_result(); //游戏结果函数
                        break;
                case 1:
                        Sta=Game_Right();
                        if(Sta==YES){
                                Game_isGo=NO;
                        }
                        else if(Sta==second){
                                Game_isGo=3;
                        }
                        break;
                case 2:
                        if(Game_Wrong())Game_isGo=NO;
                        break;
        default:
                break;
        }
       
       
}
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|阿莫电子论坛(原ourAVR/ourDEV) ( 公安备案:44190002001997(交互式论坛) 工信部备案:粤ICP备09047143号 )

GMT+8, 2019-7-21 19:57

阿莫电子论坛, 原"中国电子开发网"

© 2004-2018 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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