找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3356|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)控制的自主尋跡智能小車設(shè)計(jì)論文和源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
(1)直道檢測(cè)。在小車的中部平行裝有兩個(gè)色標(biāo)傳感器,采用查詢檢測(cè)的方法對(duì)黑線進(jìn)行檢測(cè)。89C51
在檢測(cè)到黑線信號(hào)后,通過(guò)89C51的PI.5和Pl.6口得知是哪一個(gè)傳感器檢測(cè)到黑線,以此作為調(diào)整小車方向的基準(zhǔn)。在程序方面,我們采用了差補(bǔ)控制算法。在校正服務(wù)程序中通過(guò)檢測(cè)PI.5和Pl.6口的狀態(tài),運(yùn)用差補(bǔ)算法,精確調(diào)節(jié)左右前輪的方向,達(dá)到使小車穩(wěn)定沿黑線行走的目的。為了保證程序的準(zhǔn)確性,服務(wù)程序中設(shè)置了2重黑線檢測(cè),有效的防止了小車沖出跑道。在直道上的鐵片,我們使用金屬探測(cè)傳感器來(lái)檢測(cè)。通過(guò)計(jì)算小車開始檢測(cè)到鐵片與離開鐵片時(shí)的圈數(shù)之差,乘以車輪的周長(zhǎng),我們可以得到鐵片的長(zhǎng)度以及鐵片一半的長(zhǎng)度,由此可以得到起跑線到鐵片中央的距離。當(dāng)車輪轉(zhuǎn)動(dòng)時(shí),安裝在輪胎上的磁鋼使霍爾元件產(chǎn)生電平變化。因此只需記錄電平變化的次數(shù),便能得到實(shí)際轉(zhuǎn)速。為了提高準(zhǔn)確度,減少誤差,我們安裝了兩塊磁鋼。
    (2)轉(zhuǎn)彎?rùn)z測(cè)。為了防止小車沖出跑道以及按照黑線轉(zhuǎn)彎,需要在進(jìn)人彎道之前降低速度。因此我們采用了高效的HPWM電路調(diào)節(jié)轉(zhuǎn)速。在進(jìn)人轉(zhuǎn)彎之前,我們通過(guò)提前減速程序使小車降低速度。通過(guò)跟隨黑線行駛和檢測(cè)最后一片鐵片的位置,我們可以得到準(zhǔn)確的停車位置和車頭方向。在鐵片上停留55的期間,驅(qū)動(dòng)聲光報(bào)警系統(tǒng),發(fā)出聲光報(bào)警信號(hào);同時(shí),由累計(jì)脈沖的總數(shù)便可得到全程行駛的時(shí)間。
    (3)
障礙檢測(cè)。首先我們通過(guò)尋找Zoow燈泡的光源,來(lái)校正小車的方向。然后通過(guò)超聲波對(duì)障礙物進(jìn)行距離檢測(cè),以此為基準(zhǔn),繞過(guò)障礙物。再通過(guò)檢測(cè)光源找到小車與車庫(kù)之間的距離,并由此引導(dǎo)小車準(zhǔn)確進(jìn)入車庫(kù)。



單片機(jī)源程序如下:
  1. //========================================================
  2. //  工程名稱:        Car_Demo
  3. //  功能描述:        實(shí)現(xiàn)DIY競(jìng)賽小車的語(yǔ)音控制
  4. //  涉及的庫(kù):        CMacro1016.lib
  5. //                    bsrv222SDL.lib
  6. //                                sacmv26e.lib
  7. //  組成文件:        main.c
  8. //                                Flash.asm, hardware.asm,ISR.asm
  9. //                             hardware.h,s480.h, hardware.inc
  10. //        硬件連接:        IOA0-----KEY1
  11. //                                IOA1-----KEY2
  12. //                                IOA2-----KEY3
  13. //                                IOB10----MOTOR1A
  14. //                                IOB11----MOTOR1B
  15. //                                IOB12----MOTOR2A
  16. //                                IOB13----MOTOR2B
  17. //        維護(hù)記錄:        2007-06  v1.0
  18. //  本代碼在原凌陽(yáng)小車代碼上修改而成,版權(quán)原作者所有。61mcu
  19. //========================================================

  20. #include "s480.h"
  21. #include "bsrsd.h"

  22. #define        P_IOA_Data                         (volatile unsigned int *)0x7000   
  23. #define P_IOA_Dir                         (volatile unsigned int *)0x7002
  24. #define P_IOA_Attrib                 (volatile unsigned int *)0x7003
  25. #define P_IOB_Data                        (volatile unsigned int *)0x7005  
  26. #define P_IOB_Dir                        (volatile unsigned int *)0x7007   
  27. #define P_IOB_Attrib                (volatile unsigned int *)0x7008   
  28. #define P_TimerA_Data                (volatile unsigned int *)0x700A   
  29. #define P_TimerA_Ctrl                (volatile unsigned int *)0x700B   
  30. #define P_TimerB_Data                (volatile unsigned int *)0x700C   
  31. #define P_TimerB_Ctrl                (volatile unsigned int *)0x700D   
  32. #define P_Watchdog_Clear        (volatile unsigned int *)0x7012   
  33. #define P_INT_Mask                        (volatile unsigned int *)0x702D   
  34. #define P_INT_Clear                        (volatile unsigned int *)0x7011   

  35. #define NAME_ID                         0x100
  36. #define COMMAND_GO_ID                 0x101
  37. #define COMMAND_BACK_ID         0x102
  38. #define COMMAND_LEFT_ID         0x103
  39. #define COMMAND_RIGHT_ID         0x104

  40. #define S_NAME                                0                                                        //給我取個(gè)名字吧
  41. #define S_ACT1                                1                                                        //前進(jìn)
  42. #define S_ACT2                                2                                                        //倒車,請(qǐng)注意
  43. #define S_ACT3                                3                                                        //左拐
  44. #define S_ACT4                                4                                                        //右拐       
  45. #define S_RDY                                5                                                        //Yeah
  46. #define S_AGAIN                                6                                                        //請(qǐng)?jiān)僬f(shuō)一遍
  47. #define S_NOVOICE                        7                                                        //沒有聽到任何聲音
  48. #define S_CMDDIFF                        8                                                        //說(shuō)什么暗語(yǔ)呀
  49. #define S_NOISY                                8                                                        //說(shuō)什么暗語(yǔ)呀
  50. #define S_START                                9                                                        //準(zhǔn)備就緒,開始辨識(shí)       
  51. #define S_GJG                                10                                                        //拐就拐
  52. #define S_DCZY                                11                                                        //倒車,請(qǐng)注意

  53. extern  unsigned int BSR_SDModel[100];                                        //外部變量BSR_SDModel[100],辨識(shí)器自帶
  54. extern void F_FlashWrite1Word(unsigned int addr,unsigned int Value);
  55. extern void F_FlashErase(unsigned int sector);
  56. unsigned int uiTimeset = 3;                                                                //運(yùn)行時(shí)間定時(shí),調(diào)整該參數(shù)控制運(yùn)行時(shí)間
  57. unsigned int uiTimecont;                                                                 //運(yùn)行時(shí)間計(jì)時(shí)

  58. //=============================================================
  59. // 語(yǔ)法格式:        void Delay();
  60. // 實(shí)現(xiàn)功能:        延時(shí)
  61. // 參數(shù):                無(wú)
  62. // 返回值:                無(wú)
  63. //=============================================================
  64. void Delay()                                                       
  65. {
  66.         unsigned int i;
  67.         for(i=0;i<0x3Fff;i++)
  68.         {
  69.                 *P_Watchdog_Clear=0x0001;
  70.         }
  71. }

  72. //=============================================================
  73. // 語(yǔ)法格式:        void PlaySnd(unsigned SndIndex,unsigned DAC_Channel);
  74. // 實(shí)現(xiàn)功能:        語(yǔ)音播放函數(shù)
  75. // 參數(shù):                SndIndex-播放語(yǔ)音資源索引號(hào)
  76. //                                DAC_Channel-播放聲道選擇
  77. // 返回值:                無(wú)
  78. //=============================================================
  79. void PlaySnd(unsigned SndIndex,unsigned DAC_Channel)
  80. {
  81.         BSR_StopRecognizer();                                                                //停止識(shí)別器
  82.         SACM_S480_Initial(1);                                                                //初始化為自動(dòng)播放
  83.         SACM_S480_Play(SndIndex, DAC_Channel, 3);                        //開始播放一段語(yǔ)音
  84.         while((SACM_S480_Status()&0x0001)!= 0)                                //是否播放完畢?
  85.         {
  86.                 SACM_S480_ServiceLoop();                                                //解碼并填充隊(duì)列
  87.                 *P_Watchdog_Clear=0x0001;                                                //清看門狗
  88.         }
  89.         SACM_S480_Stop();                                                                        //停止播放
  90.         BSR_InitRecognizer(BSR_MIC);                                                //初始化識(shí)別器
  91. }

  92. //=============================================================
  93. // 語(yǔ)法格式:        int TrainWord(int WordID,int SndID);
  94. // 實(shí)現(xiàn)功能:        訓(xùn)練一條指令
  95. // 參數(shù):                WordID-指令編碼
  96. //                                SndID-指令提示音索引號(hào)
  97. // 返回值:                無(wú)
  98. //=============================================================
  99. int TrainWord(unsigned int WordID,unsigned int SndID)
  100. {
  101.         int Result;
  102.         PlaySnd(SndID,3);                                                                        //引導(dǎo)訓(xùn)練,播放指令對(duì)應(yīng)動(dòng)作
  103.         while(1)
  104.         {
  105.                 Result = BSR_Train(WordID,BSR_TRAIN_TWICE);                //訓(xùn)練兩次,獲得訓(xùn)練結(jié)果
  106.                                                                                
  107.                 if(Result==0)break;
  108.                 switch(Result)
  109.                 {
  110.                 case -1:                                                                                //沒有檢測(cè)出聲音
  111.                         PlaySnd(S_NOVOICE,3);
  112.                         return -1;
  113.                 case -2:                                                                                 //需要訓(xùn)練第二次
  114.                         PlaySnd(S_AGAIN,3);
  115.                         break;
  116.                 case -3:                                                                                //環(huán)境太吵
  117.                         PlaySnd(S_NOISY,3);
  118.                         return -3;       
  119.                 case -4:                                                                                //數(shù)據(jù)庫(kù)滿
  120.                          return -4;       
  121.                 case -5:                                                                     //檢測(cè)出聲音不同
  122.                         PlaySnd(S_CMDDIFF,3);
  123.                         return -5;
  124.                 case -6:                                                                     //序號(hào)錯(cuò)誤
  125.                         return -6;
  126.                 default:
  127.                         break;
  128.                 }
  129.         }
  130.         return 0;
  131. }

  132. //=============================================================
  133. // 語(yǔ)法格式:        void TrainSD();
  134. // 實(shí)現(xiàn)功能:        訓(xùn)練函數(shù)
  135. // 參數(shù):                無(wú)
  136. // 返回值:                無(wú)
  137. //=============================================================
  138. void TrainSD()
  139. {
  140.         while(TrainWord(NAME_ID,S_NAME) != 0) ;                          //訓(xùn)練名稱
  141.         while(TrainWord(COMMAND_GO_ID,S_ACT1) != 0) ;                  //訓(xùn)練第1個(gè)動(dòng)作
  142.         while(TrainWord(COMMAND_BACK_ID,S_ACT2) != 0) ;          //訓(xùn)練第2個(gè)動(dòng)作
  143.         while(TrainWord(COMMAND_LEFT_ID,S_ACT3) != 0) ;          //訓(xùn)練第3個(gè)動(dòng)作
  144.         while(TrainWord(COMMAND_RIGHT_ID,S_ACT4) != 0) ;        //訓(xùn)練第4個(gè)動(dòng)作
  145. }

  146. //=============================================================
  147. // 語(yǔ)法格式:        void StoreSD();
  148. // 實(shí)現(xiàn)功能:        存儲(chǔ)語(yǔ)音模型函數(shù)
  149. // 參數(shù):                無(wú)
  150. // 返回值:                無(wú)
  151. //=============================================================
  152. void StoreSD()                                                  
  153. {        unsigned int ulAddr,i,commandID,g_Ret;
  154.         F_FlashWrite1Word(0xef00,0xaaaa);
  155.         F_FlashErase(0xe000);
  156.            F_FlashErase(0xe100);
  157.            F_FlashErase(0xe200);
  158.            ulAddr=0xe000;//********
  159.         for(commandID=0x100;commandID<0x105;commandID++)
  160.         {
  161.                 g_Ret=BSR_ExportSDWord(commandID);                       
  162.                 while(g_Ret!=0)                                                                        //模型導(dǎo)出成功?
  163.                 g_Ret=BSR_ExportSDWord(commandID);               
  164.                 for(i=0;i<100;i++)                                                                //保存語(yǔ)音模型SD1(0xe000---0xe063)
  165.                 {
  166.                     F_FlashWrite1Word(ulAddr,BSR_SDModel[i]);
  167.                         ulAddr+=1;                                                                                               
  168.                 }
  169.         }
  170. }

  171. //=============================================================
  172. // 語(yǔ)法格式:        void StoreSD();
  173. // 實(shí)現(xiàn)功能:        裝載語(yǔ)音模型函數(shù)
  174. // 參數(shù):                無(wú)
  175. // 返回值:                無(wú)
  176. //=============================================================
  177. void LoadSD()                                                  
  178. {        unsigned int *p,k,jk,Ret,g_Ret;
  179.         p=(int *)0xe000;                                                                                                                                                                       
  180.         for(jk=0;jk<5;jk++)
  181.         {
  182.                 for(k=0;k<100;k++)
  183.                 {
  184.                         Ret=*p;                                                       
  185.                         BSR_SDModel[k]=Ret;                                        //裝載語(yǔ)音模型                       
  186.                         p+=1;                                                                                                       
  187.                 }                                       
  188.                 g_Ret=BSR_ImportSDWord();                               
  189.                 while(g_Ret!=0)                                                        //模型裝載成功?
  190.                 g_Ret=BSR_ImportSDWord();                                                               
  191.         }
  192. }

  193. //=============================================================
  194. // 語(yǔ)法格式:        void GoAhead();
  195. // 實(shí)現(xiàn)功能:        前進(jìn)子函數(shù)
  196. // 參數(shù):                無(wú)
  197. // 返回值:                無(wú)
  198. //=============================================================
  199. void GoAhead()                                                     //前進(jìn)
  200. {  
  201.         PlaySnd(S_ACT1,3);                                                        //提示
  202.         *P_IOB_Data=0x1400;                                                        //前進(jìn)
  203.         *P_INT_Mask |= 0x0004;                                                //以下為中斷定時(shí)操作
  204.         __asm("int fiq,irq");
  205.         uiTimecont = 0;
  206. }
  207. //=============================================================
  208. // 語(yǔ)法格式:        void BackUp();
  209. // 實(shí)現(xiàn)功能:        后退子函數(shù)
  210. // 參數(shù):                無(wú)
  211. // 返回值:                無(wú)
  212. //=============================================================
  213. void BackUp()                                                //倒退
  214. {       
  215.         PlaySnd(S_DCZY,3);                                                        //提示
  216.         *P_IOB_Data=0x2800;                                                        //倒退
  217.         *P_INT_Mask |= 0x0004;                                                //以下為中斷定時(shí)操作
  218.         __asm("int fiq,irq");
  219.         uiTimecont = 0;
  220. }

  221. //=============================================================
  222. // 語(yǔ)法格式:        void TurnLeft();
  223. // 實(shí)現(xiàn)功能:        左轉(zhuǎn)子函數(shù)
  224. // 參數(shù):                無(wú)
  225. // 返回值:                無(wú)
  226. //=============================================================
  227. void TurnRight()                                           //右轉(zhuǎn)
  228. {
  229.         PlaySnd(S_GJG,3);       
  230.         *P_IOB_Data=0x1800;                                                        //右轉(zhuǎn)
  231.         Delay();                                                                        //延時(shí)
  232.         *P_IOB_Data=0x2400;                                                        //左轉(zhuǎn)
  233.         *P_INT_Mask |= 0x0004;                                                //以下為中斷定時(shí)操作
  234.         __asm("int fiq,irq");
  235.         uiTimecont = 0;
  236. }
  237. //=============================================================
  238. // 語(yǔ)法格式:        void TurnRight();
  239. // 實(shí)現(xiàn)功能:        右轉(zhuǎn)子函數(shù)
  240. // 參數(shù):                無(wú)
  241. // 返回值:                無(wú)
  242. //=============================================================
  243. void TurnLeft()                                               //左轉(zhuǎn)
  244. {
  245.         PlaySnd(S_GJG,3);                                                        //語(yǔ)音提示
  246.     *P_IOB_Data=0x2400;                                                        //左轉(zhuǎn)
  247.         Delay();                                                                        //延時(shí)
  248.         *P_IOB_Data=0x1800;                                                        //右轉(zhuǎn)       
  249.         *P_INT_Mask |= 0x0004;                                                //以下為中斷定時(shí)操作
  250.         __asm("int fiq,irq");
  251.         uiTimecont = 0;
  252. }

  253. //=============================================================
  254. // 語(yǔ)法格式:        void Stop();
  255. // 實(shí)現(xiàn)功能:        停車子函數(shù)
  256. // 參數(shù):                無(wú)
  257. // 返回值:                無(wú)
  258. //=============================================================
  259. void Stop()                                                   //停車
  260. {
  261.         *P_IOB_Data=0x0000;                                                        //停車
  262.         PlaySnd(S_RDY,3);                                                        //語(yǔ)音提示
  263. }

  264. //=============================================================
  265. // 語(yǔ)法格式:        void BSR(void);
  266. // 實(shí)現(xiàn)功能:        辨識(shí)子函數(shù)
  267. // 參數(shù):                無(wú)
  268. // 返回值:                無(wú)
  269. //=============================================================
  270. void BSR(void)
  271. {       
  272.         int Result;                                                                        //辨識(shí)結(jié)果寄存
  273.         Result = BSR_GetResult();                                        //獲得識(shí)別結(jié)果

  274.         if(Result>0)                                                                //有語(yǔ)音觸發(fā)?
  275.         {       
  276.                 *P_IOB_Data=0x0000;                                                //臨時(shí)停車
  277.                 switch(Result)
  278.                 {
  279.                 case NAME_ID:                                                        //識(shí)別出名稱命令
  280.                         Stop();                                                                //停車待命
  281.                         break;
  282.                 case COMMAND_GO_ID:                                                //識(shí)別出第一條命令
  283.                         GoAhead();                                                        //執(zhí)行動(dòng)作一:直走
  284.                         break;
  285.                 case COMMAND_BACK_ID:                                        //識(shí)別出第二條命令
  286.                         BackUp();                                                        //執(zhí)行動(dòng)作二:倒車
  287.                         break;
  288.                 case COMMAND_LEFT_ID:                                        //識(shí)別出第三條命令
  289.                         TurnLeft();                                                        //執(zhí)行動(dòng)作三:左轉(zhuǎn)
  290.                         break;
  291.                 case COMMAND_RIGHT_ID:                                        //識(shí)別出第四條命令
  292.                         TurnRight();                                                //執(zhí)行動(dòng)作四:右轉(zhuǎn)
  293.                         break;
  294.                 default:
  295.                         break;
  296.                 }
  297.         }
  298. }
  299. //=============================================================
  300. // 語(yǔ)法格式:        void IRQ5(void);
  301. // 實(shí)現(xiàn)功能:        中斷服務(wù)子函數(shù)
  302. // 參數(shù):                無(wú)
  303. // 返回值:                無(wú)
  304. //=============================================================
  305. void IRQ5(void)__attribute__((ISR));                        //運(yùn)動(dòng)定時(shí)控制
  306. void IRQ5(void)
  307. {
  308.         if(uiTimecont++ == uiTimeset)
  309.         {
  310.                 *P_IOB_Data = 0x0000;
  311.         }
  312.         *P_INT_Clear = 0x0004;
  313. }

  314. //=============================================================
  315. // 語(yǔ)法格式:        int main(void);
  316. // 實(shí)現(xiàn)功能:        主函數(shù)
  317. // 參數(shù):                無(wú)
  318. ……………………

  319. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
單片機(jī)智能小車.rar (387.98 KB, 下載次數(shù): 17)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表