STM32無線搶答器具有很強(qiáng)的實(shí)驗(yàn)性,看似功能實(shí)現(xiàn)簡單,其實(shí)要用到很多驅(qū)動(dòng),這里不再贅述。 我上傳的搶答器視頻是幾個(gè)月以前拍攝的,由于那時(shí)實(shí)驗(yàn)需要雙機(jī)通信,所以用了兩塊STM32板子。現(xiàn)在為節(jié)省資源,特意將其改成一塊STM芯片驅(qū)動(dòng)。下面是材料清單和連線方式 。 材料清單: 連線: 1位數(shù)碼管 接下來將介紹下相關(guān)材料的使用,以及相關(guān)資料。
語音模塊 語音模塊采用的是ISD1760,我們這里用到它的功能主要是錄音。聲音合成是用的在線合成,推薦使用靈云在線語音合成(網(wǎng)址:www點(diǎn)hcicloud點(diǎn)com/experimental/getstart.html#tts)。
聲音合成過后,然后用電腦自帶錄音軟件,開啟內(nèi)錄模式,錄制合成的語音,再用格式工廠將其裝換成mp3格式。接下來就是如何把mp3文件放入ISD1760中,這里采用上位機(jī)線錄的方式,(百度所得的參考資料,包含上位機(jī)軟件,51驅(qū)動(dòng)程序等資料,網(wǎng)址:http://pan.baidu.com/s/1dDB0mOD),需要自己用耳機(jī)頭子DIY一根線錄線。 顯示屏幕 關(guān)于顯示屏幕,我選用的是480P的ILI9481,其實(shí)如果沒有屏幕也沒事,因?yàn)樯晕⑿薷南轮鞒绦颍?/font>test.c),便可讓搶答器的最終結(jié)果和時(shí)間在上位機(jī)顯示。由于各個(gè)屏幕驅(qū)動(dòng)都稍有差別,這里就不多說了。值得注意的一點(diǎn)就是STM開發(fā)板不同,可能導(dǎo)致屏幕IO和其它IO沖突,我改成一個(gè)STM的時(shí)候就和數(shù)碼管IO沖突了。 藍(lán)牙模塊 藍(lán)牙選用的是HC05,這里是淘寶賣家提供的參考資料,以及上位機(jī)軟件(網(wǎng)址:http://pan.baidu.com/s/1c0w9gQ0),注意的是,藍(lán)牙模塊最好用獨(dú)立的電源供電,電源可以選擇手機(jī)充電器,然后將充電器線的正負(fù)引出,再將藍(lán)牙模塊的地線和STM的地線連在一起。如果不提供獨(dú)立電源,整個(gè)系統(tǒng)將會受到影響,極不穩(wěn)定。
單片機(jī)源程序如下:
- #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); //系統(tǒng)時(shí)鐘設(shè)置
- delay_init(72); //延時(shí)初始化
- uart_init(72,9600); //串口1初始化為9600
- LED_Init(); //初始化與LED連接的硬件接口
- SMG_Init(); //初始化數(shù)碼管端口
- 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) //接收到一次數(shù)據(jù)了
- {
- reclen=USART2_RX_STA&0X7FFF; //得到數(shù)據(jù)長度
- USART2_RX_BUF[reclen]=0; //加入結(jié)束符
- 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黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
原理圖和APK.zip
(291.67 KB, 下載次數(shù): 114)
2020-11-17 17:40 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
搶答器單板子_可用.7z
(105.64 KB, 下載次數(shù): 31)
2020-11-18 04:53 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
搶答器清單 接線方法 模塊使用等參考資料.docx
(1023.27 KB, 下載次數(shù): 33)
2020-11-17 17:40 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|