STM32无线抢答器具有很强的实验性,看似功能实现简单,其实要用到很多驱动,这里不再赘述。 我上传的抢答器视频是几个月以前拍摄的,由于那时实验需要双机通信,所以用了两块STM32板子。现在为节省资源,特意将其改成一块STM芯片驱动。下面是材料清单和连线方式 。 材料清单: 连线: 1位数码管 接下来将介绍下相关材料的使用,以及相关资料。
语音模块 语音模块采用的是ISD1760,我们这里用到它的功能主要是录音。声音合成是用的在线合成,推荐使用灵云在线语音合成(网址:www点hcicloud点com/experimental/getstart.html#tts)。
声音合成过后,然后用电脑自带录音软件,开启内录模式,录制合成的语音,再用格式工厂将其装换成mp3格式。接下来就是如何把mp3文件放入ISD1760中,这里采用上位机线录的方式,(百度所得的参考资料,包含上位机软件,51驱动程序等资料,网址:http://pan.baidu.com/s/1dDB0mOD),需要自己用耳机头子DIY一根线录线。 显示屏幕 关于显示屏幕,我选用的是480P的ILI9481,其实如果没有屏幕也没事,因为稍微修改下主程序(test.c),便可让抢答器的最终结果和时间在上位机显示。由于各个屏幕驱动都稍有差别,这里就不多说了。值得注意的一点就是STM开发板不同,可能导致屏幕IO和其它IO冲突,我改成一个STM的时候就和数码管IO冲突了。 蓝牙模块 蓝牙选用的是HC05,这里是淘宝卖家提供的参考资料,以及上位机软件(网址:http://pan.baidu.com/s/1c0w9gQ0),注意的是,蓝牙模块最好用独立的电源供电,电源可以选择手机充电器,然后将充电器线的正负引出,再将蓝牙模块的地线和STM的地线连在一起。如果不提供独立电源,整个系统将会受到影响,极不稳定。
单片机源程序如下:
- #include <stm32f10x.h>
- #include "sys.h"
- #include "usart.h"
- #include "delay.h"
- #include "led.h"
- #include "usart2.h"
- #include "hc05.h"
- #include "string.h"
- #include "timer2.h"
- #include "qjbl.h"
- #include "isd1760.h"
- #include "ISDadd.h"
- #include "lcd.h"
- #include "smg.h"
- void display0()
- {an1=1;}
- void close0()
- {an2=1;}
- void display1()
- {LED1=0;delay_ms(100);}
- void close1()
- {LED1=1;delay_ms(100);}
- int main(void)
- {
- u32 r=0;
- int j=0;
- int i,sm;
- int k=1,k1=1;
- int n=100;
- int p=100;
- u8 reclen=0;
-
- Stm32_Clock_Init(9); //系统时钟设置
- delay_init(72); //延时初始化
- uart_init(72,9600); //串口1初始化为9600
- LED_Init(); //初始化与LED连接的硬件接口
- SMG_Init(); //初始化数码管端口
- SMGBM_Init(9);
- ISD_SPI_Init();
- ISD_Init();
-
- LCD_Init();
- POINT_COLOR=BLACK;
- LCD_ShowString(30,80,200,16,16,"BUZZER");
- LCD_ShowString(30,100,200,16,16,"FIRST:");
- LCD_ShowString(150,100,200,16,16,"ms");
- LCD_ShowString(30,120,200,16,16,"SECOND:");
- LCD_ShowString(150,120,200,16,16,"ms");
-
-
-
- for(sm=9;sm>0;sm--)
- {
- SMGBM_Init(sm);
- delay_ms(1000);
- }
-
-
- while(HC05_Init()) //初始化ATK-HC05模块
- { ;}
- TIM3_Int_Init(999,7199);
- TIM2_Int_Init(999,7199);
- SMGBM_Init(0);
- while(1)
- {
- if(USART2_RX_STA&0X8000) //接收到一次数据了
- {
- reclen=USART2_RX_STA&0X7FFF; //得到数据长度
- USART2_RX_BUF[reclen]=0; //加入结束符
- if(reclen==7||reclen==6||reclen==4||reclen==5) //控制DS1检测
- {
- if(strcmp((const char*)USART2_RX_BUF,"L0ON")==0){display0();} //打开LED0
- if(strcmp((const char*)USART2_RX_BUF,"L0OFF")==0)close0();
- if(strcmp((const char*)USART2_RX_BUF,"L1ONNN")==0)display1(); //打开LED1
- if(strcmp((const char*)USART2_RX_BUF,"L1OFFFF")==0)close1();
- }
- USART2_RX_STA=0;
- }
- if(TIM3->SR&0x0001)
- {j+=1;TIM3->SR&=~(1<<0);}
- if(an1==1&&n!=0)
- {
- i=TIM3->CNT;
- k=j*100+i/10;
- an1=2;
- printf("a1=%dms\n",k);
- r=k;
- LCD_ShowNum(100,100,r,6,16);
- n=0;
- }
- if(an2==1&&p!=0)
- {
- i=TIM3->CNT;
- k1=j*100+i/10;
- an2=2;
- p=0;
- printf("a2=%dms\n",k1);
- r=k1;
- LCD_ShowNum(100,120,r,6,16);
- }
- if(an1==2&&an2==2){goto a;}
- }
- a:
- if(k<k1)
- {
- printf("a1\n"); LCD_ShowString(30,140,200,16,16,"ONE SUCCESSFUL");
- LED0=0;
- ClrInt();
- ISD_STOP();
- SetPLAY(0);
- SetPLAY(1);
- SetPLAY(2);
- SetPLAY(3);
- SetPLAY(4);
- SetPLAY(5);
- }
- if(k>k1)
- {
- printf("a2\n");LCD_ShowString(30,140,200,16,16,"TWO SUCCESSFUL");
-
-
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
原理图和APK.zip
(291.67 KB, 下载次数: 114)
|