💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
>[info]## **3-第一篇:硬件篇**.............................................................. >[info]实践出真知,实验平台必不可少!本篇将介绍我们用来开发的硬件平台。 通过该篇的介绍,你将了解我们Smart模块的硬件资源以及外设接口。 >[info]### **3.1-实验平台介绍:** >[info]#### **3.1.1-意想意创Smart模块-资源初窥**...................................................... >[info]①-硬件平台................................................................................................. ![](https://box.kancloud.cn/2334f1c516e9c2cbba3abae1a3bb33f4_554x242.png) >[info]#### **3.1.2意想意创Smart模块-资源说明**....................................................... ![](https://box.kancloud.cn/a9a4c2ce6469e8996e19a1a206158dbd_554x495.png) ***** ***** >[info]## **4-第二篇:软件篇**................................................................................. >本篇我们在软件开发平台TKStudio上介绍意想意创Smart模块。 >[info]### **4.1-开发环境:TKStudio以及工程文件以介绍**................................ > ①-TKstudio下载地址: ②-工程文件下载地址: ③-工程文件夹介绍: ![](https://box.kancloud.cn/13d6423e66a4b67c7d4be11241c605b7_554x109.png) >[info]### **4.2-user_file文件**............................................................................ ![](https://box.kancloud.cn/cd6cc4c4b91cb244c15c76f02954268a_478x242.png) PS:用户自己所编写的程序都是在这个.c文件下。其他的文件无需操作,如果操作了其他文件夹可能会造成未知的错误。 >[info]## **5-第三篇:API接口介绍**............................................................... >意想意创Smart模块API接口都是用C标准语言实现的。 API接口有对模块的区分。比如:音乐模块就有播放音乐的API接口,当然其他模块是不能使用的。 ***** ***** >[info]### **5.1-Master_Setup函数**................................................................... >·PS:程序初始化函数,模块上电时,该函数只执行一次。 ·语法: void Master_Setup(void)       ·参数: | 参数 | 释义 | | --- | --- | | void | void:没有参数 | >[info]·返回值:无;       ·实例: void Master\_Setup()  //模块初始化让小灯亮500毫秒 {   LedSet(ENABLE);     //打开小灯   delay_ms(500);      //延时500毫秒   LedSet(DISABLE);      //所有输出打开 } ***** ***** >[info]### **5.2-Master_Loop函数**................................................................................... >·ps:循环函数,用户主要的函数都会在此函数里完成。 ·语法: void Master_Loop(void) ·参数: | 参数 | 释义 | | --- | --- | | void | void:没有参数 | >[info]·返回值:无; ·实例: void Master\_Loop()  //当输入1有信号的时候,输出1输出。 { if(Read_Input(1)==1){ OutSet(1,ENABLE); } } ***** ***** >[info]### **5.3-delay_ms函数** ...................................................................................... >·PS:毫秒级延时函数,最大延时65535毫秒。 ·语法: void delay\_ms(unsigned int ms); //延时函数 ·参数 | 参数 | 释义 | | --- | --- | | ms| ms:毫秒延时。可填写(1-65535)毫秒 | >[info]·返回值:无; ·实例: uchar i=0; for(i=0;i<3;i++)//小灯1秒闪一次一共闪烁3秒 { LedSet(ENABLE);     //打开小灯 delay_ms(500);      //延时500毫秒   LedSet(DISABLE);      //所有输出打开 delay_ms(500);    } ***** ***** >[info]### **5.4-Read_Input函数**................................................................................... >·PS:输入口读取状态函数; ·语法:  uchar Read_Input(uchar Num_IO) ·参数 | 参数 | 释义 | | --- | --- | | Num_IO| Num_IO:输入口端口号。 | | | 基础主控:(1-5)。 | | | 高级主控: (1-10)。  | | | 超级主控(1-12)。 | | | 廿级主控(1-20)。 | | | 根据硬件输入口数量而定 | >[info]返回:对应口有信号输入的时候,返回1。对应输入口没有信号输入的时候,返回0。    ·实例: if((Read\_Input(1)==1)  &&  ((Read\_Input(2)==1)){     //输入1,2同时有信号,打开电磁锁。 LockSet(POWEROPEN); } ***** ***** >[info]### **5.5-LedSet函数**.................................................................................................. >·PS:模块指示灯状态设置函数。 ·语法:  void LedSet(uchar Sta);//设置小灯状态 ·参数 | 参数 | 释义 | | --- | --- | | Sta| Sta: LEDOPEN,打开小灯 | | | Sta: LEDCLOSED,关闭小灯 | >[info]·返回:无; ·实例: LedSet(LEDOPEN);     //打开小灯 ***** ***** >[info]### **5.6-LedDisable函数**....................................................... >·PS:关闭模块指示灯函数 ·语法:  void LedDisable(void);//关闭小灯 ·参数 | 参数 | 释义 | | --- | --- | | void | void:没有参数 | >[info]·返回:无; ·实例: LedDisable();     //关闭小灯 ***** ***** >[info]### **5.7-LedEnable函数**......................................................................... >·PS:打开模块指示灯函数 ·语法:  void LedEnable(void);//关闭小灯 ·参数 | 参数 | 释义 | | --- | --- | | void | void:没有参数 | >[info]·返回:无; ·实例: LedEnable();     //关闭小灯 ***** ***** >[info]### **5.8-OutSet函数**............................................................. >·PS:模块输出口设置函数。 ·语法:  void OutSet(uchar Num,uchar Sta);//关闭小灯 ·参数 | 参数 | 释义 | | --- | --- | | Num| Num:输出口端号。 | | | 基础主控(1-5)。| | | 高级主控(1-10)。| | | 超级主控(1-12)。 | | | 廿级主控(1-20)。 | | | 255:对应所有输出口。 | | | 根据硬件输出口定。 | | Sta | Sta:DISABLE-相应口不输出。| | | Sta:ENABLE-相应口输出。| >[info]·返回:无; ·实例: OutSet(1,ENABLE);delay\_ms(1000); OutSet(2,ENABLE);delay\_ms(1000); OutSet(3,ENABLE);delay\_ms(1000); OutSet(4,ENABLE);delay\_ms(1000); OutSet(5,ENABLE);delay\_ms(1000);//一秒动作一个输出口 ***** ***** >[info]### **5.9-OutDisable函数**...................................................... >·PS:关闭模块输出口函数 ·语法:  void OutDisable(uchar Num);//关闭输出口 ·参数 | 参数 | 释义 | | --- | --- | | Num| Num:输出口端号。 | | | 基础主控(1-5)。| | | 高级主控(1-10)。| | | 超级主控(1-12)。 | | | 廿级主控(1-20)。 | | | 255:对应所有输出口。 | | | 根据硬件输出口定。 | >[info]·返回:无; ·实例: OutDisable(1);     //关闭输出口1 ***** ***** >[info]### **5.10-OutEnable函数**.......................................................................................... >·PS:打开模块输出口函数 ·语法: void OutEnable(uchar Num);//打开输出 ·参数 | 参数 | 释义 | | --- | --- | | Num| Num:输出口端号。 | | | 基础主控(1-5)。| | | 高级主控(1-10)。| | | 超级主控(1-12)。 | | | 廿级主控(1-20)。 | | | 255:对应所有输出口。 | | | 根据硬件输出口定。 | >[info]·返回:无; ·实例: OutEnable(255);     //打开所有的输出口。 ***** ***** >[info]### **5.11-LockSet函数**............................................................................................... >·PS电磁锁状态设置函数。 ·语法: void LockSet(uchar Sta);//灯锁口状态设置 ·参数 | 参数 | 释义 | | --- | --- | | Sta | Sta:POWEROPEN,    关闭电磁锁口,打开灯口; | | | Sta:POWERCLOSED, 打开电磁锁口,关闭灯口; | >[info]·返回:无; ·实例: LockSet(POWEROPEN);     //关闭电磁锁,打开灯口 ***** ***** >[info]### **5.12-LockClose函数**......................................................... >·PS:电磁锁关闭函数。 ·语法:  void LockClose(void);//关闭电磁锁函数 ·参数 | 参数 | 释义 | | --- | --- | | void | void:没有参数 | >[info]·返回:无; ·实例: LockClose();     //关闭电磁锁,打开灯口 ***** ***** >[info]### **5.13-LockOpen函数**............................................................................................. >·PS:打开电磁锁函数。 ·语法: void LockOpen(void);//关闭电磁锁函数 ·参数 | 参数 | 释义 | | --- | --- | | void | void:没有参数 | >[info]·返回:无; ·实例: LockOpen();     //打开电磁锁口,关闭灯口。 ***** ***** >[info]### **5.14-UART\_ReceiveBuffer函数**........................................................ >·PS:串口接受函数。(和UART1_SendBuffer配套使用) ·语法: void UART\_ReceiveBuffer(uchar *buf,uchar len);//串口接受函数 ·参数 | 参数 | 释义 | | --- | --- | | buf| buf:接收到的数据缓存。| | len| len:接收到的数据长度。| >[info]·返回:无; ·实例: void UART_ReceiveBuffer(uchar \*buf,uchar len) {      uchar i=0;          /*下面这个例程,接受到什么数据,在转发出去的功能*/          UART1_SendBuffer(buf,len); } ***** ***** >[info]### **5.15-UART1_SendBuffer函数**............................................................. >·PS:串口发送函数。(和UART\_ReceiveBuffer配套使用) ·语法:  void UART1_SendBufferr(uchar *buf,uchar len);   //串口发送数组函数 ·参数 | 参数 | 释义 | | --- | --- | | buf| buf:需要发送的数据缓存。| | len| len:需要发送的数据长度 。| >[info]·返回:无; ·实例: uchar Arry\[5\]={1,2,3,4,5}; UART1\_SendBuffer(Arry,sizeof(Arry)); //把Arry发送出去。 ***** ***** >[info]### **5.16-UART1_SendData函数**.......................................... >·PS:串口单字节发送函数。 ·语法: void UART1_SendData(uchar dat); //串口发送单字节函数。 ·参数 | 参数 | 释义 | | --- | --- | | dat| dat:需要发送的数据| >[info]·返回:无; ·实例: uchar a=1; UART1_SendData(a);  //发送数据 ***** ***** >[info]### **5.17-Music_Play函数**........................................................................ >·PS:音乐播放函数。(音乐模块,音乐主控独有函数,其他模块不能使用) ·语法:  Music_Play(uchar PlayerNum); //播放音乐函数 ·参数 | 参数 | 释义 | | --- | --- | | PlayerNum| PlayerNum:音乐编号(1-255)| >[info]·返回:无; ·实例:  Music_Play(1);  //播放音乐1 ***** ***** >[info]### **5.18-Music_Read_FeedBack函数**........................................................ >·PS:音乐播完反馈函数。(音乐模块,音乐主控独有函数,其他模块不能使用) ·语法: uchar Music_Read_FeedBack(void);///播放音乐函数 ·参数 | 参数 | 释义 | | --- | --- | | void | void:没有参数 | >[info]·返回:当前音乐播放完毕返回1,没有播放完成返回0; ·实例:  If( Music\_Read_FeedBack(1)==1){     //当前音乐播放完毕,输出1口输出 OutSet(1,ENABLE); } ***** ***** >[info]### **5.19-PF_Tim0_1msIT函数**............................................................. >·PS:1毫秒定时器函数。 ·语法:  void PF_Tim0_1msIT(void);//1毫秒定时器函数 ·参数 | 参数 | 释义 | | --- | --- | | void | void:没有参数 | >[info]·返回:无; ·实例:  void PF\_Tim0\_1msIT(void) {   static uint t=0; If(++t>=1000){ LockSet(POWEROPEN);    //计时1秒打开电磁锁 } } ***** ***** >[info]### **5.20-Light_Function函数**........................................................................... >·PS:超级主控输入端灯效函数。(超级主控独有函数,其他模块不能使用) ·语法:  void Light\_Function(uchar Num,uchar Sta);//超级主控效果等函数 ·参数 | 参数 | 释义 | | --- | --- | | Num| 效果灯编号(1-12)| | | 1-输入1的灯。 | | | 2-输入2的灯。 | | | 3-输入3的灯。 | | | 4-输入4的灯。 | | | 5-输入5的灯。 | | | 6-输入6的灯。 | | | 7-输入7的灯。 | | | 8-输入8的灯。 | | | 9-输入9的灯。 | | | 10-输入10的灯。| | | 11-输入12的灯。| | | 12-输入12的灯。| |Sta|Sta:DISABLE-不亮 | | | Sta:ENABLE-亮 | >[info]·返回:无; ·实例:     If(Read_Input(1)==1){          //当输入1有信号的时候,输入1效果灯亮。没有信号的时候输入1,效果灯灭 Light\_Function(1,ENABLE); } else{ Light_Function(1,DISABLE); } ***** ***** >[info]### **5.21-Read\_User_Confign函数**.................................................................. >·PS:读取用户配置函数。 ·语法:            uchar *Read_User_Config(void);              //读取用户配置函数 ·参数 | 参数 | 释义 | | --- | --- | | void | void:没有参数 | >[info]·返回:读取到的有效数据; ·实例:   uchar len=0;uchar *P=NULL; uchar i=0; P=Read_User_Config(); while(*(P+len)!=0){         //有效数据不为0, len++;               //读取到的数据长度 } UART1_Send(P,len);        //发送出接受的数据 ***** ***** >[info]### **5.22-DigitronDisplay函数**.................................................................. >·PS:数码管显示函数,只能在点阵主控-数码管SDK中调用。 ·语法:            void DigitronDisplay(unsigned char wei,unsigned char value);//数码管显示函数 ·参数 | 参数 | 释义 | | --- | --- | | void | void:没有参数 | >[info]·返回:读取到的有效数据; ·实例:下面这个历程,实现了输入1234有信号的时候,数码管对应显示 uchar i=0; for(i=0;i<4;i++){ if(Read_Input(i+1)==1){ DigitronDisplay(i+1,i+1); } } ***** ***** >[info]### **5.23-Set_rgb_AllColour函数**.................................................................. >·PS:七彩灯显示函数,只能在七彩灯SDK中调用。 ·语法:            void Set_rgb_AllColour(uchar colour,uchar Value); //七彩灯显示函数 ·参数 | 参数 | 释义 | | --- | --- | | colour | 选择颜色 | | | RGB_RED //红色 | | | RGB_GREEN //绿色 | | | RGB_BLUE //蓝色 | | | RGB_YELLOW //黄 | | | RGB_PURPLE //紫 | | | RGB_CYAN //青 | | | RGB_WHITE //白 | | Value | 0-0xFF; //0为熄灭,0xFF为最亮 | >[info]·返回:读取到的有效数据; ·实例:显示红色。 Set_rgb_AllColour(RGB_RED,0xFF); //红色 ***** ***** >[info]### **5.24-void Ws2812_SetPixelColor**.................................................................. >·PS:可控灯画点函数,只能在可控灯SDK中调用。 ·语法:            void Ws2812_SetPixelColor(unsigned int num,unsigned char r,unsigned char g,unsigned char b);//可控灯画点函数 ·参数 | 参数 | 释义 | | --- | --- | | num| 灯珠位置 (0-99)| | r | 红色 (0-255) | | g | 绿色 (0-255) | | b | 蓝色 (0-255) | >[info]·返回:无; ·实例:显示红色。 Ws2812_SetPixelColor(0,255,0,0); //设置一个灯珠红色 ***** ***** >[info]### **5.25-Ws2812_Show**.................................................................. >·PS:可控灯刷新函数,只能在可控灯SDK中调用。 ·语法:        void Ws2812_Show(void); //可控灯刷新函数 ·参数 | 参数 | 释义 | | void | void:没有参数 | >[info]·返回:无; ·实例:显示红色。 Ws2812_SetPixelColor(0,255,0,0); //设置一个灯珠红色 Ws2812_Show();//让颜色显示 ***** ***** >[info]## **6-第四篇:实战篇**............................................................... >[info]### **1-案例演示-手印机关** >[info]**1-游戏玩法:** ①\-触摸传感器摸一下(一共5个触摸感应),一个灯亮。 ②\-5个按照顺序(1,2,3,4,5的顺序)都摸对之后,一个电磁锁断电,游戏结束,触摸无效。 ③\-5个都摸完之后,但是顺序不对,所有的灯都熄灭,重新触摸。 **2-视频演示:** >[info] **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 **********************************************************************************/ uchar Game_isGo=0; //游戏流程变量 uchar Index[5]={0}; uchar Order[5]={1,2,3,4,5}; //需要比对的顺序 uchar Order_Len=0; //触摸的次数 /*============================== 功能:这是一个串口接受函数,接受到的数据都在buf中配合S(uchar *buf,uchar len)使用 参数:发送的数据和数据长度; 返回:无; ===============================*/ void UART_ReceiveBuffer(uchar *buf,uchar len) { uchar i=0; /*下面这个历程,接受到什么数据,在转发出去的功能*/ UART1_SendBuffer(buf,len); } /*============================== 功能:这是一个1毫秒的中断函数; 参数:无; 返回:无; ===============================*/ void PF_Tim0_1msIT(void) { /*下面这个历程,实现了200毫秒小灯执行一次闪烁功能*/ /* static uchar Sta=0; static uint t=0; if(++t>=100){ if(Sta==NO){ LedSet(LEDOPEN);Sta=YES; //打开小灯; } else if(Sta==YES){ LedSet(LEDCLOSED);Sta=NO; //关闭小灯; }else{ } t=0; } */ } /*************************************** 功能:这个是一个执行一次的函数; 参数:无; 返回:无; ***************************************/ void Master_Setup() { return ; } /*************************************** 功能:游戏效果执行函数; 参数:无; 返回:成功返回1,失败返回2; ***************************************/ uchar Game_result(void)//游戏效果函数 { uchar i=0; static uchar buf[5]={0}; for(i=1;i<=5;i++){ if((Read_Input(i)==1) && (Index[i-1]==0)){ //扫描5个输入口 OutSet(i,ENABLE); //触摸一个点亮一个 buf[Order_Len++]=i; //缓存当前的顺序 Index[i-1]=1; } } if(Order_Len==5){ //5点都触摸之后 if(UART_Compare(buf,Order,sizeof(buf))){ return 1; } else{ Clean_dat(buf,sizeof(buf)); //错误清空当前缓存 Clean_dat(Index,sizeof(Index)); Order_Len=0; //清空长度 return 2; } } return 0; } /*************************************** 功能:游戏正确效果函数; 参数:无; 返回:成功返回1,失败返回0; ***************************************/ uchar Game_Right(void)//游戏正确结果 { LockSet(POWEROPEN); return 1; } /*************************************** 功能:游戏错误效果函数; 参数:无; 返回:成功返回1,失败返回0; ***************************************/ uchar Game_Wrong(void)//游戏错误结果 { uchar i=0; OutSet(255,DISABLE); //关闭所有的灯; /*------需要注意,这里需要按键释放--------*/ for(i=0;i<5;i++){ if(Read_Input(i+1)==1)break; //有输入的时候,说明手还没有拿开 } if(i==5)return 1; return 0; } /************************************** 功能:是一个循环函数; 参数:无; 返回:无; PS:游戏玩法: 1-每触摸一个手印,对应一盏灯亮。 2-当五盏灯都亮了之后,如果触摸的顺序正确那么电磁锁打开。 3-没有按照顺序,熄灭所有的灯。 **************************************/ void Master_Loop() { switch (Game_isGo) { case 0: Game_isGo=Game_result(); break; case 1: Game_Right(); break; case 2: if(Game_Wrong())Game_isGo=0; //错误效果执行完毕,并且触摸已经全部释放,从新开始 break; default: break; } } ``` >[info]### **2-案例演示-语音版打地鼠** >[info]**1-游戏玩法:** 1-上个机关启动之后,所有的指示灯闪烁3次,开始播放循环播放北京音效,该游戏启动。 2-此时,随机播放一首音效(1-5首其中一个),并且对应的灯箱亮起, 如果,如果在3秒内按下对应的地鼠按键,灯箱熄灭,连续击中N(可以设置)次之后,所有地鼠快速闪烁5次,播放成功音效,电磁锁打开。 3-如果在规定时间内,没有击中对应的地鼠,或者击错地鼠,游戏失败,播放错误音效,需要从头开始。 **2-视频演示:** >[info] **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; } } ```