單片機課程設計----凌陽spce061a聲控小車_第1頁
已閱讀1頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、<p>  課程設計說明書(論文)</p><p>  課程名稱: </p><p>  設計題目: </p><p>  院 系: </p><p>  班 級:

2、 </p><p>  設 計 者: </p><p>  學 號: </p><p>  指導教師: </p><p>  設計時間: </p><p&

3、gt;<b>  課程設計任務書</b></p><p>  *注:此任務書由課程設計指導教師填寫</p><p><b>  摘要:</b></p><p>  本文對聲控小車概況做了闡述。在硬件設計方面,本文以凌陽科技公司的SPCE061A單片機為控制核心,以語音小車控制電路板為輔,設計小車的動作。在軟件方面,利用C語

4、言進行編程,進行語音的“訓練”和“識別”。設計出具有如下功能的語音識別聲控小車:能夠根據(jù)錄制的語音命令來控制小車的前進、后退、左拐和右拐。</p><p>  關鍵詞:SPCE061A 語音識別 聲控小車</p><p><b>  引言</b></p><p>  所謂聲控技術其實也就是利用語音識別技術來達到控制或者操作的一種技術

5、,而語音識別技術這近五年來已經有很大的進步,最新的語音識別技術可以辨識90%以上的人類說出的字。聲控技術雖然是一項比較先進的技術,但不可否認的是,聲控技術在無線傳輸時的合成的質量不是很好,它尚需進一步提高,因為無線環(huán)境中的背景噪聲太大了,當然還有其他方面的因素影響著聲控功能的發(fā)揮。</p><p>  然而隨著微電機技術、計算機技術及傳感器技術的迅速發(fā)展,現(xiàn)今聲控技術應用廣泛,這種嶄露頭角的聲控技術,給嚴重傷殘人

6、士的生活帶來了極大的方便。傷殘人士用聲音就可以打開門窗、窗簾、電視機、電燈等。本次試驗我們就采用了凌陽SPCE061A單片機設計并制作了一套基于語音識別技術的聲控小車。</p><p><b>  課設實驗介紹</b></p><p>  聲控智能玩具車電路是一種裝載到普通的玩具車上對玩具車進行控制的電路。該電路可利用聲控口令使玩具車前進,并發(fā)出閃爍燈光。</p

7、><p>  設計目的:通過對聲控智能玩具車的設計與調試,使學生掌握電子系統(tǒng)的設計方法、調試過程,學會對電機、單片機、揚聲器、驅動電路的使用方法。</p><p><b>  設計要求及技術指標</b></p><p>  設計一個玩具車控制電路,要求通過口令聲或猝發(fā)聲音信號轉換成相應的電信號,控制玩具車啟動、前進,通過一段延遲時間后,玩具車自動停

8、止。</p><p><b>  基本部分:</b></p><p>  電路由聲/電轉換電路、聲控開關、單穩(wěn)態(tài)觸發(fā)電路、功率驅動電路和發(fā)聲電路等組成;</p><p>  采用電容話筒或錄音用的微型話筒接收音響;</p><p>  汽車發(fā)聲可選擇發(fā)出警車聲、救護車聲、消防車聲等。</p><p&g

9、t;<b>  綜合設計方法</b></p><p>  聲控式智能玩具車控制電路如圖1所示,主要由三個部分組成。第一部分聲音接收和轉換電路主要用于接收口令或猝發(fā)聲音,并將其轉換成相應的電信號,經過放大整形驅動后級電路進行控制;第二部分控制電路接收信號后,發(fā)出控制信號啟動電機,同時啟動發(fā)聲電路,并對玩具車行駛時間進行計時;第三部分主要由發(fā)聲電路和計時電路組成,發(fā)聲電路可發(fā)出任意一種或多種報警

10、聲音,計時電路是對玩具車開動到自動停止的時間段進行計時,時間長短可通過調節(jié)控制電路中相應部分來進行。</p><p><b>  設計方案:</b></p><p><b>  設計思路及工作原理</b></p><p>  采用凌陽SPCE061A單片機,利用它的高度集成性,完成對小車的控制。結構如圖:</p>

11、;<p>  凌陽SPCE061A單片機</p><p>  選擇凌陽單片機的原因:凌陽SPCE061A單片機內部集成了ICE,FLASH,SRAM,通用I/O接口,定時器/計數(shù)器,中斷控制,CPU時鐘鎖相環(huán),ADC,DAC輸出,UART,SIO,低電壓監(jiān)測/低電壓復位等模塊。它將電路大大簡化,節(jié)省小車空間,大大減小了系統(tǒng)復雜度。</p><p>  選擇L298的原因:由于

12、單片機的IO口驅動能力明顯不足以驅動電機轉動,所以采用L298做一個過渡,一邊是單片機,一邊是電機,很好的解決了驅動問題。</p><p>  下面是L298的使用電路圖。</p><p><b>  4.3車體介紹</b></p><p>  主要是對I/O口的讀寫控制。I./O數(shù)據(jù)與功能對應如下:</p><p> 

13、 我們用IOB的0-3位控制電機,用8-11位控制燈。這是因為進過測試高位的驅動能力要更強,可以直接點亮LED燈。</p><p><b>  系統(tǒng)軟件設計</b></p><p><b>  具體的主程序:</b></p><p>  //=========================================

14、===============</p><p>  #include "s480.h"</p><p>  #include "bsrsd.h"</p><p>  #defineP_IOA_Data (volatile unsigned int *)0x7000 </p><p>  #d

15、efine P_IOA_Dir (volatile unsigned int *)0x7002</p><p>  #define P_IOA_Attrib (volatile unsigned int *)0x7003</p><p>  #define P_IOB_Data(volatile unsigned int *)0x7005 </p><

16、p>  #define P_IOB_Dir(volatile unsigned int *)0x7007 </p><p>  #define P_IOB_Attrib(volatile unsigned int *)0x7008 </p><p>  #define P_TimerA_Data(volatile unsigned int *)0x700A

17、</p><p>  #define P_TimerA_Ctrl(volatile unsigned int *)0x700B </p><p>  #define P_TimerB_Data(volatile unsigned int *)0x700C </p><p>  #define P_TimerB_Ctrl(volatile unsi

18、gned int *)0x700D </p><p>  #define P_Watchdog_Clear(volatile unsigned int *)0x7012 </p><p>  #define NAME_ID 0x100</p><p>  #define COMMAND_GO_ID 0x101</p><p&g

19、t;  #define COMMAND_BACK_ID 0x102</p><p>  #define COMMAND_LEFT_ID 0x103</p><p>  #define COMMAND_RIGHT_ID 0x104</p><p>  #define S_NAME0//取名</p><p>  #def

20、ine S_ACT11//前進</p><p>  #define S_ACT22//倒車,請注意</p><p>  #define S_ACT33//左拐</p><p>  #define S_ACT44//右拐</p><p>  #define S_R

21、DY 5//Yeah</p><p>  #define S_AGAIN6//請再說一遍</p><p>  #define S_NOVOICE7//沒有聽到任何聲音</p><p>  #define S_CMDDIFF8//說什么暗語呀</p><p>  

22、#define S_NOISY8//說什么暗語呀</p><p>  #define S_START9//準備就緒,開始辨識</p><p>  #define S_GJG 10//拐就拐</p><p>  extern unsigned int BSR_SDModel[100];//外部變

23、量BSR_SDModel[100],辨識器自帶</p><p>  extern void F_FlashWrite1Word(unsigned int addr,unsigned int Value);</p><p>  extern void F_FlashErase(unsigned int sector);</p><p>  //============

24、============================================</p><p>  // 語法格式:void Delay();</p><p>  // 實現(xiàn)功能:延時</p><p><b>  // 參數(shù):無</b></p><p>  // 返回值:無</p>&

25、lt;p>  //========================================================</p><p>  void Delay()</p><p><b>  {</b></p><p>  unsigned int i;</p><p>  for(i=

26、0;i<0x3Fff;i++)</p><p><b>  {</b></p><p>  *P_Watchdog_Clear=0x0001;</p><p><b>  }</b></p><p><b>  }</b></p><p>  //

27、========================================================</p><p>  // 語法格式:void PlaySnd(unsigned SndIndex,unsigned DAC_Channel);</p><p>  // 實現(xiàn)功能:語音播放函數(shù)</p><p>  // 參數(shù):SndIndex-播

28、放語音資源索引號</p><p>  //DAC_Channel-播放聲道選擇</p><p>  // 返回值:無</p><p>  //========================================================</p><p>  void PlaySnd(unsigned SndInd

29、ex,unsigned DAC_Channel)</p><p><b>  {</b></p><p>  BSR_StopRecognizer();//停止識別器</p><p>  SACM_S480_Initial(1);//初始化為自動播放</p><p>  SACM_S480

30、_Play(SndIndex, DAC_Channel, 3);//開始播放一段語音</p><p>  while((SACM_S480_Status()&0x0001)!= 0)//是否播放完畢?</p><p><b>  {</b></p><p>  SACM_S480_ServiceLoop();//

31、解碼并填充隊列</p><p>  *P_Watchdog_Clear=0x0001;//清看門狗</p><p><b>  }</b></p><p>  SACM_S480_Stop();//停止播放</p><p>  BSR_InitRecognizer(BSR_MIC);

32、//初始化識別器</p><p><b>  }</b></p><p>  //============================================================</p><p>  // 語法格式:int TrainWord(int WordID,int SndID);</p>&l

33、t;p>  // 實現(xiàn)功能:訓練一條指令</p><p>  // 參數(shù):WordID-指令編碼</p><p>  //SndID-指令提示音索引號</p><p>  // 返回值:無</p><p>  //=====================================================

34、=======</p><p>  int TrainWord(unsigned int WordID,unsigned int SndID)</p><p><b>  {</b></p><p>  int Result;</p><p>  PlaySnd(SndID,3);//引導訓練,播放指令

35、對應動作</p><p><b>  while(1)</b></p><p><b>  {</b></p><p>  Result = BSR_Train(WordID,BSR_TRAIN_TWICE);//訓練兩次,獲得訓練結果</p><p>  if(Result==0)break;

36、</p><p>  switch(Result)</p><p><b>  {</b></p><p>  case -1://沒有檢測出聲音</p><p>  PlaySnd(S_NOVOICE,3);</p><p>  return -1;</p>&

37、lt;p>  case -2: //需要訓練第二次</p><p>  PlaySnd(S_AGAIN,3);</p><p><b>  break;</b></p><p>  case -3://環(huán)境太吵</p><p>  PlaySnd(S_NOISY,3);<

38、;/p><p>  return -3;</p><p>  case -4://數(shù)據(jù)庫滿</p><p>  return -4;</p><p>  case -5: //檢測出聲音不同</p><p>  PlaySnd(S_CMDDIFF,3);<

39、/p><p>  return -5;</p><p>  case -6: //序號錯誤</p><p>  return -6;</p><p><b>  default:</b></p><p><b>  break;</b><

40、;/p><p><b>  }</b></p><p><b>  }</b></p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  //==================

41、==========================================</p><p>  // 語法格式:void TrainSD();</p><p>  // 實現(xiàn)功能:訓練函數(shù)</p><p><b>  // 參數(shù):無</b></p><p>  // 返回值:無</p>

42、<p>  //============================================================</p><p>  void TrainSD()</p><p><b>  {</b></p><p>  while(TrainWord(NAME_ID,S_NAME) != 0) ;

43、//訓練名稱</p><p>  while(TrainWord(COMMAND_GO_ID,S_ACT1) != 0) ; //訓練第1個動作</p><p>  while(TrainWord(COMMAND_BACK_ID,S_ACT2) != 0) ; //訓練第2個動作</p><p>  while(TrainWord(COMMAND_LEFT_I

44、D,S_ACT3) != 0) ; //訓練第3個動作</p><p>  while(TrainWord(COMMAND_RIGHT_ID,S_ACT4) != 0) ;//訓練第4個動作</p><p><b>  }</b></p><p>  //============================================

45、================</p><p>  // 語法格式:void StoreSD();</p><p>  // 實現(xiàn)功能:存儲語音模型函數(shù)</p><p><b>  // 參數(shù):無</b></p><p>  // 返回值:無</p><p>  //========

46、====================================================</p><p>  void StoreSD() </p><p>  {unsigned int ulAddr,i,commandID,g_Ret;</p><p>  F_FlashErase(0x

47、e000);</p><p>  F_FlashErase(0xe100);</p><p>  ulAddr=0xe000;//********</p><p>  for(commandID=0x100;commandID<0x105;commandID++)</p><p><b>  {</b></p

48、><p>  g_Ret=BSR_ExportSDWord(commandID);</p><p>  while(g_Ret!=0)//模型導出成功?</p><p>  g_Ret=BSR_ExportSDWord(commandID);</p><p>  for(i=0;i<100;i++)

49、//保存語音模型SD1(0xe000---0xe063)</p><p><b>  {</b></p><p>  F_FlashWrite1Word(ulAddr,BSR_SDModel[i]);</p><p>  ulAddr+=1;</p><p><b>  }</b

50、></p><p><b>  }</b></p><p><b>  }</b></p><p>  //============================================================</p><p>  // 語法格式:void StoreSD(

51、);</p><p>  // 實現(xiàn)功能:裝載語音模型函數(shù)</p><p><b>  // 參數(shù):無</b></p><p>  // 返回值:無</p><p>  //============================================================</p>

52、;<p>  void LoadSD() </p><p>  {unsigned int *p,k,jk,Ret,g_Ret;</p><p>  p=(int *)0xe000;</p><p>  for(jk=0;jk<5;jk++)&l

53、t;/p><p><b>  {</b></p><p>  for(k=0;k<100;k++)</p><p><b>  {</b></p><p>  Ret=*p;</p><p>  BSR_SDModel[k]=Ret;//裝載語音模型

54、</p><p>  p+=1;</p><p><b>  }</b></p><p>  g_Ret=BSR_ImportSDWord();</p><p>  while(g_Ret!=0)//模型裝載成功?</p><p&g

55、t;  g_Ret=BSR_ImportSDWord();</p><p><b>  }</b></p><p><b>  }</b></p><p>  //============================================================</p>

56、<p>  // 語法格式:void GoAhead();</p><p>  // 實現(xiàn)功能:前進子函數(shù)</p><p><b>  // 參數(shù):無</b></p><p>  // 返回值:無</p><p>  //=======================================

57、=====================</p><p>  void GoAhead() //前進</p><p><b>  { </b></p><p>  unsigned int j;</p><p>  PlaySnd(S_ACT1,3);</

58、p><p>  *P_IOB_Data=0x0102;</p><p>  for(j=0;j<50;j++)//延時</p><p><b>  Delay();</b></p><p>  *P_IOB_Data=0x0000;</p><p><b>  }&

59、lt;/b></p><p>  //============================================================</p><p>  // 語法格式:void BackUp();</p><p>  // 實現(xiàn)功能:后退子函數(shù)</p><p><b>  // 參數(shù):無&l

60、t;/b></p><p>  // 返回值:無</p><p>  //============================================================</p><p>  void BackUp() //倒退</p><p><

61、b>  {</b></p><p>  unsigned int j;</p><p>  PlaySnd(S_ACT2,3);</p><p>  *P_IOB_Data=0x0201;//延時</p><p>  for(j=0;j<50;j++)</p><p>&

62、lt;b>  Delay();</b></p><p>  *P_IOB_Data=0x0000;</p><p><b>  }</b></p><p>  //============================================================</p><p> 

63、 // 語法格式:void TurnLeft();</p><p>  // 實現(xiàn)功能:左轉子函數(shù)</p><p><b>  // 參數(shù):無</b></p><p>  // 返回值:無</p><p>  //================================================

64、============</p><p>  void TurnLeft() //左轉</p><p><b>  {</b></p><p>  unsigned int j;</p><p>  PlaySnd(S_GJG,3);</p><

65、p>  *P_IOB_Data=0x080A;</p><p>  for(j=0;j<30;j++)//延時</p><p><b>  Delay();</b></p><p>  *P_IOB_Data=0x0802;</p><p>  for(j=0;j<20;j++)

66、//延時</p><p><b>  Delay();</b></p><p>  *P_IOB_Data=0x0000;</p><p><b>  }</b></p><p>  //================================================

67、============</p><p>  // 語法格式:void TurnRight();</p><p>  // 實現(xiàn)功能:右轉子函數(shù)</p><p><b>  // 參數(shù):無</b></p><p>  // 返回值:無</p><p>  //=============

68、===============================================</p><p>  void TurnRight() //右轉</p><p><b>  {</b></p><p>  unsigned int j;</p><p

69、>  PlaySnd(S_GJG,3);//延時</p><p>  *P_IOB_Data=0x0406;</p><p>  for(j=0;j<30;j++)//延時</p><p><b>  Delay();</b></p><p>  *P_IOB_Data=

70、0x0402;</p><p>  for(j=0;j<20;j++)//延時</p><p><b>  Delay();</b></p><p>  *P_IOB_Data=0x0000;</p><p><b>  }</b></p><p>

71、  //============================================================</p><p>  // 語法格式:int main(void);</p><p>  // 實現(xiàn)功能:主函數(shù)</p><p><b>  // 參數(shù):無</b></p><p>  

72、// 返回值:無</p><p>  //============================================================</p><p>  int main(void)</p><p>  {int Result; //辨識結果寄存</p><p>  unsigned

73、int Ready=0;//待命標志位</p><p>  unsigned int BS_Flag;//Train標志位</p><p>  *P_IOA_Dir=0xff00;//初始化IOA,IOA0~7下拉輸入</p><p>  *P_IOA_Attrib=0xff00;</p><p>

74、;  *P_IOA_Data=0x0000;</p><p>  *P_IOB_Dir=0x0f00;//初始化IOB,IOB8~11同向輸出</p><p>  *P_IOB_Attrib=0x0f00;</p><p>  *P_IOB_Data=0x0000;</p><p>  BSR_DeleteSDGroup(0);

75、//初始化存儲器RAM</p><p>  BS_Flag=*(unsigned int *)0xe000;//讀存儲單元0xe000</p><p>  if(BS_Flag==0xffff)//沒有經過訓練(0xe000內容為0xffff)</p><p><b>  {</b></p><

76、;p>  TrainSD();//訓練</p><p>  StoreSD();//存儲訓練結果(語音模型)</p><p><b>  }</b></p><p>  else //經過訓練(0xe000內容為0x0055)</p><p><b>

77、  {</b></p><p>  LoadSD();//語音模型載入識別器</p><p><b>  }</b></p><p>  PlaySnd(S_START,3);//開始識別提示</p><p>  BSR_InitRecognizer(BSR_MIC);

78、//初始化識別器</p><p><b>  while(1)</b></p><p><b>  {</b></p><p>  Result = BSR_GetResult();//獲得識別結果</p><p>  if(Result>0)//有識

79、別結果?</p><p><b>  {</b></p><p>  if(Result==NAME_ID) //名稱</p><p><b>  {</b></p><p>  PlaySnd(S_RDY,3);//播放待命提示音</p><p>

80、  Ready=1;//進入待命狀態(tài)</p><p><b>  }</b></p><p>  if(Ready==1)//待命狀態(tài)?</p><p><b>  {</b></p><p>  switch(Result)</p><p>

81、<b>  {</b></p><p>  case COMMAND_GO_ID://識別出第一條命令</p><p>  GoAhead();//執(zhí)行動作一:直走</p><p><b>  Ready=0;</b></p><p><b>  break;<

82、/b></p><p>  case COMMAND_BACK_ID://識別出第二條命令</p><p>  BackUp();//執(zhí)行動作二:倒車</p><p><b>  Ready=0;</b></p><p><b>  break;</b></p>

83、;<p>  case COMMAND_LEFT_ID://識別出第三條命令</p><p>  TurnLeft();//執(zhí)行動作三:左轉</p><p><b>  Ready=0;</b></p><p><b>  break;</b></p><p> 

84、 case COMMAND_RIGHT_ID://識別出第四條命令</p><p>  TurnRight();//執(zhí)行動作四:右轉</p><p><b>  Ready=0;</b></p><p><b>  break;</b></p><p><b>  de

85、fault:</b></p><p><b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  if((

86、*P_IOA_Data)&0x0004)//是否重新訓練</p><p><b>  {</b></p><p>  F_FlashErase(0xe000);</p><p>  while(1)//等待中斷</p><p><b>  {</b></

87、p><p>  *P_Watchdog_Clear=0x0001;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b>

88、;</p><p><b>  參考文獻</b></p><p>  [1]謝自美. 集成電路測試.北京:高等教育出版社,2002.</p><p>  [2]張雙慶等. 使用電子電路200例.北京:機械工業(yè)出版社,2003.</p><p>  [3]陳永浦. 電子電路智能化設計實例與應用.北京:電子工業(yè)出版社,2

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論