单片机智能小车

单片机智能小车:




基于单片机控制的自主寻迹电动小车的设计:

摘 要:针对小车在行驶过程中的寻迹要求,设计了以AT89C51单片机为核心的控制电路,采用模块化的设计方案,运用色标传感器、金属探测传感器、超声波传感器、霍尔传感器组成不同的检测电路,实现小车在行驶中轨迹、探测预埋金属铁片、躲避障碍物、测量车速等问题检测,并对设计的电路进行了理论分析和实际测试。结果表明,该智能小车具有很好的识别与检测的能力,具有定位精度、运行稳定可靠的特点。
    关键词:自主寻迹;单片机;电动小车;传感器
0 引 言
    自主寻迹电动小车是一个运用传感器、单片机、信号处理、电机驱动及自动控制等技术来实现环境感知和自动行驶为一体的高新技术综合体,它在军事、民用和科学研究等方面已获得了应用。本文研究的电动小车是在给定的区域内沿着轨迹完成对各个目标点的访问,主要指标有行驶距离、时间、探测物计数、障碍物躲避等。本文采用AT89C51单片机作控制,针对小车在行驶过程中的不同要求,采用模块化设计方案,进行了各部分电路的设计。
1 智能小车控制的基本要求    小车必须沿规定路线行驶,控制部分设计不能采用无线遥控,具体控制要求如下:
    (1)电动车从起跑线出发,沿规定引导直线行驶到达B点。在“直道区”下沿引导线埋有1一3块宽度为15cm、长度不等的薄铁片。电动车在行驶中检测到薄
铁片时需立即发出声光指示信息,并实时存储、显示在“直道区”检测到的薄铁片数目。电动车在“直道区”行驶过程中,存储并显示每个薄铁片(中心线)至起跑
线间的距离;
    (2)电动车到达B点以后进人“弯道区”,沿圆 弧引导线到达C点。C点下埋有边长为 15cm的正方形薄铁片,要求电动车到达C点检测到薄铁片后在C点处停车5秒,停车期间发出断续的声光信息;
    (3)电动车在光源的引导下,通过障碍区进人停车区并到达车库。电动车必须在两个障碍物之间通过且不得与其接触;
    (4)电动车完成上述任务后应立即停车。停车后,能准确显示电动车全程行驶时间。
2 方案的选择与实现
2.1 系统方案的确定
    根据题目要求,将控制对象及检测目标划分为不同模块,即障碍物检测、路面铁片检测、路面轨迹检测、光源检测、速度路程检测等模块。针对不同模块的控制要求分别采用不同的设计方案实现。系统组成及原理框图如图1所示。其中色标传感器用来检测小车的运行轨迹,金属探测传感器用来检测路迹下薄铁片的数目,超声波传感器用来检测小车前进方向的障碍物,霍尔传感器用于检测小车行驶的速度及距离。


完整内容下载附件查看.


代码:

 
  1. //========================================================
  2. //  工程名称:        Car_Demo
  3. //  功能描述:        实现DIY竞赛小车的语音控制
  4. //  涉及的库:        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. //        维护记录:        2007-06  v1.0
  18. //  本代码在原凌阳小车代码上修改而成,版权原作者所有!-61mcu
  19. //  更多资料请察看:www.61mcu.com
  20. //========================================================
  21.  
  22. #include "s480.h"
  23. #include "bsrsd.h"
  24.  
  25. #define        P_IOA_Data                         (volatile unsigned int *)0x7000   
  26. #define P_IOA_Dir                         (volatile unsigned int *)0x7002
  27. #define P_IOA_Attrib                 (volatile unsigned int *)0x7003
  28. #define P_IOB_Data                        (volatile unsigned int *)0x7005  
  29. #define P_IOB_Dir                        (volatile unsigned int *)0x7007   
  30. #define P_IOB_Attrib                (volatile unsigned int *)0x7008   
  31. #define P_TimerA_Data                (volatile unsigned int *)0x700A   
  32. #define P_TimerA_Ctrl                (volatile unsigned int *)0x700B   
  33. #define P_TimerB_Data                (volatile unsigned int *)0x700C   
  34. #define P_TimerB_Ctrl                (volatile unsigned int *)0x700D   
  35. #define P_Watchdog_Clear        (volatile unsigned int *)0x7012   
  36. #define P_INT_Mask                        (volatile unsigned int *)0x702D   
  37. #define P_INT_Clear                        (volatile unsigned int *)0x7011   
  38.  
  39. #define NAME_ID                         0x100
  40. #define COMMAND_GO_ID                 0x101
  41. #define COMMAND_BACK_ID         0x102
  42. #define COMMAND_LEFT_ID         0x103
  43. #define COMMAND_RIGHT_ID         0x104
  44.  
  45. #define S_NAME                                0                                                        //给我取个名字吧
  46. #define S_ACT1                                1                                                        //前进
  47. #define S_ACT2                                2                                                        //倒车,请注意
  48. #define S_ACT3                                3                                                        //左拐
  49. #define S_ACT4                                4                                                        //右拐       
  50. #define S_RDY                                5                                                        //Yeah
  51. #define S_AGAIN                                6                                                        //请再说一遍
  52. #define S_NOVOICE                        7                                                        //没有听到任何声音
  53. #define S_CMDDIFF                        8                                                        //说什么暗语呀
  54. #define S_NOISY                                8                                                        //说什么暗语呀
  55. #define S_START                                9                                                        //准备就绪,开始辨识       
  56. #define S_GJG                                10                                                        //拐就拐
  57. #define S_DCZY                                11                                                        //倒车,请注意
  58.  
  59. extern  unsigned int BSR_SDModel[100];                                        //外部变量BSR_SDModel[100],辨识器自带
  60. extern void F_FlashWrite1Word(unsigned int addr,unsigned int Value);
  61. extern void F_FlashErase(unsigned int sector);
  62. unsigned int uiTimeset = 3;                                                                //运行时间定时,调整该参数控制运行时间
  63. unsigned int uiTimecont;                                                                 //运行时间计时
  64.  
  65. //=============================================================
  66. // 语法格式:        void Delay();
  67. // 实现功能:        延时
  68. // 参数:                无
  69. // 返回值:                无
  70. //=============================================================
  71. void Delay()                                                       
  72. {
  73.         unsigned int i;
  74.         for(i=0;i<0x3Fff;i++)
  75.         {
  76.                 *P_Watchdog_Clear=0x0001;
  77.         }
  78. }
  79.  
  80. //=============================================================
  81. // 语法格式:        void PlaySnd(unsigned SndIndex,unsigned DAC_Channel);
  82. // 实现功能:        语音播放函数
  83. // 参数:                SndIndex-播放语音资源索引号
  84. //                                DAC_Channel-播放声道选择
  85. // 返回值:                无
  86. //=============================================================
  87. void PlaySnd(unsigned SndIndex,unsigned DAC_Channel)
  88. {
  89.         BSR_StopRecognizer();                                                                //停止识别器
  90.         SACM_S480_Initial(1);                                                                //初始化为自动播放
  91.         SACM_S480_Play(SndIndex, DAC_Channel, 3);                        //开始播放一段语音
  92.         while((SACM_S480_Status()&0x0001)!= 0)                                //是否播放完毕?
  93.         {
  94.                 SACM_S480_ServiceLoop();                                                //解码并填充队列
  95.                 *P_Watchdog_Clear=0x0001;                                                //清看门狗
  96.         }
  97.         SACM_S480_Stop();                                                                        //停止播放
  98.         BSR_InitRecognizer(BSR_MIC);                                                //初始化识别器
  99. }
  100.  
  101. //=============================================================
  102. // 语法格式:        int TrainWord(int WordID,int SndID);
  103. // 实现功能:        训练一条指令
  104. // 参数:                WordID-指令编码
  105. //                                SndID-指令提示音索引号
  106. // 返回值:                无
  107. //=============================================================
  108. int TrainWord(unsigned int WordID,unsigned int SndID)
  109. {
  110.         int Result;
  111.         PlaySnd(SndID,3);                                                                        //引导训练,播放指令对应动作
  112.         while(1)
  113.         {
  114.                 Result = BSR_Train(WordID,BSR_TRAIN_TWICE);                //训练两次,获得训练结果
  115.                                                                                
  116.                 if(Result==0)break;
  117.                 switch(Result)
  118.                 {
  119.                 case -1:                                                                                //没有检测出声音
  120.                         PlaySnd(S_NOVOICE,3);
  121.                         return -1;
  122.                 case -2:                                                                                 //需要训练第二次
  123.                         PlaySnd(S_AGAIN,3);
  124.                         break;
  125.                 case -3:                                                                                //环境太吵
  126.                         PlaySnd(S_NOISY,3);
  127.                         return -3;       
  128.                 case -4:                                                                                //数据库满
  129.                          return -4;       
  130.                 case -5:                                                                     //检测出声音不同
  131.                         PlaySnd(S_CMDDIFF,3);
  132.                         return -5;
  133.                 case -6:                                                                     //序号错误
  134.                         return -6;
  135.                 default:
  136.                         break;
  137.                 }
  138.         }
  139.         return 0;
  140. }
  141.  
  142. //=============================================================
  143. // 语法格式:        void TrainSD();
  144. // 实现功能:        训练函数
  145. // 参数:                无
  146. // 返回值:                无
  147. //=============================================================
  148. void TrainSD()
  149. {
  150.         while(TrainWord(NAME_ID,S_NAME) != 0) ;                          //训练名称
  151.         while(TrainWord(COMMAND_GO_ID,S_ACT1) != 0) ;                  //训练第1个动作
  152.         while(TrainWord(COMMAND_BACK_ID,S_ACT2) != 0) ;          //训练第2个动作
  153.         while(TrainWord(COMMAND_LEFT_ID,S_ACT3) != 0) ;          //训练第3个动作
  154.         while(TrainWord(COMMAND_RIGHT_ID,S_ACT4) != 0) ;        //训练第4个动作
  155. }
  156.  
  157. //=============================================================
  158. // 语法格式:        void StoreSD();
  159. // 实现功能:        存储语音模型函数
  160. // 参数:                无
  161. // 返回值:                无
  162. //=============================================================
  163. void StoreSD()                                                  
  164. {        unsigned int ulAddr,i,commandID,g_Ret;
  165.         F_FlashWrite1Word(0xef00,0xaaaa);
  166.         F_FlashErase(0xe000);
  167.            F_FlashErase(0xe100);
  168.            F_FlashErase(0xe200);
  169.            ulAddr=0xe000;//********
  170.         for(commandID=0x100;commandID<0x105;commandID++)
  171.         {
  172.                 g_Ret=BSR_ExportSDWord(commandID);                       
  173.                 while(g_Ret!=0)                                                                        //模型导出成功?
  174.                 g_Ret=BSR_ExportSDWord(commandID);               
  175.                 for(i=0;i<100;i++)                                                                //保存语音模型SD1(0xe000---0xe063)
  176.                 {
  177.                     F_FlashWrite1Word(ulAddr,BSR_SDModel[i]);
  178.                         ulAddr+=1;                                                                                               
  179.                 }
  180.         }
  181. }
  182.  
  183. //=============================================================
  184. // 语法格式:        void StoreSD();
  185. // 实现功能:        装载语音模型函数
  186. // 参数:                无
  187. // 返回值:                无
  188. //=============================================================
  189. void LoadSD()                                                  
  190. {        unsigned int *p,k,jk,Ret,g_Ret;
  191.         p=(int *)0xe000;                                                                                                                                                                       
  192.         for(jk=0;jk<5;jk++)
  193.         {
  194.                 for(k=0;k<100;k++)
  195.                 {
  196.                         Ret=*p;                                                       
  197.                         BSR_SDModel[k]=Ret;                                        //装载语音模型                       
  198.                         p+=1;                                                                                                       
  199.                 }                                       
  200.                 g_Ret=BSR_ImportSDWord();                               
  201.                 while(g_Ret!=0)                                                        //模型装载成功?
  202.                 g_Ret=BSR_ImportSDWord();                                                               
  203.         }
  204. }
  205.  
  206. //=============================================================
  207. // 语法格式:        void GoAhead();
  208. // 实现功能:        前进子函数
  209. // 参数:                无
  210. // 返回值:                无
  211. //=============================================================
  212. void GoAhead()                                                     //前进
  213. {  
  214.         PlaySnd(S_ACT1,3);                                                        //提示
  215.         *P_IOB_Data=0x1400;                                                        //前进
  216.         *P_INT_Mask |= 0x0004;                                                //以下为中断定时操作
  217.         __asm("int fiq,irq");
  218.         uiTimecont = 0;
  219. }
  220. //=============================================================
  221. // 语法格式:        void BackUp();
  222. // 实现功能:        后退子函数
  223. // 参数:                无
  224. // 返回值:                无
  225. //=============================================================
  226. void BackUp()                                                //倒退
  227. {       
  228.         PlaySnd(S_DCZY,3);                                                        //提示
  229.         *P_IOB_Data=0x2800;                                                        //倒退
  230.         *P_INT_Mask |= 0x0004;                                                //以下为中断定时操作
  231.         __asm("int fiq,irq");
  232.         uiTimecont = 0;
  233. }
  234.  
  235. //=============================================================
  236. // 语法格式:        void TurnLeft();
  237. // 实现功能:        左转子函数
  238. // 参数:                无
  239. // 返回值:                无
  240. //=============================================================
  241. void TurnRight()                                           //右转
  242. {
  243.         PlaySnd(S_GJG,3);       
  244.         *P_IOB_Data=0x1800;                                                        //右转
  245.         Delay();                                                                        //延时
  246.         *P_IOB_Data=0x2400;                                                        //左转
  247.         *P_INT_Mask |= 0x0004;                                                //以下为中断定时操作
  248.         __asm("int fiq,irq");
  249.         uiTimecont = 0;
  250. }
  251. //=============================================================
  252. // 语法格式:        void TurnRight();
  253. // 实现功能:        右转子函数
  254. // 参数:                无
  255. // 返回值:                无
  256. //=============================================================
  257. void TurnLeft()                                               //左转
  258. {
  259.         PlaySnd(S_GJG,3);                                                        //语音提示
  260.     *P_IOB_Data=0x2400;                                                        //左转
  261.         Delay();                                                                        //延时
  262.         *P_IOB_Data=0x1800;                                                        //右转       
  263.         *P_INT_Mask |= 0x0004;                                                //以下为中断定时操作
  264.         __asm("int fiq,irq");
  265.         uiTimecont = 0;
  266. }
  267.  
  268. //=============================================================
  269. // 语法格式:        void Stop();
  270. // 实现功能:        停车子函数
  271. // 参数:                无
  272. // 返回值:                无
  273. //=============================================================
  274. void Stop()                                                   //停车
  275. {
  276.         *P_IOB_Data=0x0000;                                                        //停车
  277.         PlaySnd(S_RDY,3);                                                        //语音提示
  278. }
  279.  
  280. //=============================================================
  281. // 语法格式:        void BSR(void);
  282. // 实现功能:        辨识子函数
  283. // 参数:                无
  284. // 返回值:                无
  285. //=============================================================
  286. void BSR(void)
  287. {       
  288.         int Result;                                                                        //辨识结果寄存
  289.         Result = BSR_GetResult();                                        //获得识别结果
  290.  
  291.         if(Result>0)                                                                //有语音触发?
  292.         {       
  293.                 *P_IOB_Data=0x0000;                                                //临时停车
  294.                 switch(Result)
  295.                 {
  296.                 case NAME_ID:                                                        //识别出名称命令
  297.                         Stop();                                                                //停车待命
  298.                         break;
  299.                 case COMMAND_GO_ID:                                                //识别出第一条命令
  300.                         GoAhead();                                                        //执行动作一:直走
  301.                         break;
  302.                 case COMMAND_BACK_ID:                                        //识别出第二条命令
  303.                         BackUp();                                                        //执行动作二:倒车
  304.                         break;
  305.                 case COMMAND_LEFT_ID:                                        //识别出第三条命令
  306.                         TurnLeft();                                                        //执行动作三:左转
  307.                         break;
  308.                 case COMMAND_RIGHT_ID:                                        //识别出第四条命令
  309.                         TurnRight();                                                //执行动作四:右转
  310.                         break;
  311.                 default:
  312.                         break;
  313.                 }
  314.         }
  315. }
  316. //=============================================================
  317. // 语法格式:        void IRQ5(void);
  318. // 实现功能:        中断服务子函数
  319. // 参数:                无
  320. // 返回值:                无
  321. //=============================================================
  322. void IRQ5(void)__attribute__((ISR));                        //运动定时控制
  323. void IRQ5(void)
  324. {
  325.         if(uiTimecont++ == uiTimeset)
  326.         {
  327.                 *P_IOB_Data = 0x0000;
  328.         }
  329.         *P_INT_Clear = 0x0004;
  330. }
  331.  
  332. //=============================================================
  333. // 语法格式:        int main(void);
  334. // 实现功能:        主函数
  335. // 参数:                无
  336. // 返回值:                无
  337. //=============================================================
  338. int main(void)
  339. {        unsigned int BS_Flag;                                                //Train标志位
  340.        
  341.         *P_IOA_Dir=0xff00;                                                        //初始化IOA,IOA0~7下拉输入
  342.         *P_IOA_Attrib=0xff00;
  343.         *P_IOA_Data=0x0000;
  344.        
  345.         *P_IOB_Dir=0x0f00;                                                        //初始化IOB,IOB8~11同向输出
  346.         *P_IOB_Attrib=0x0f00;
  347.         *P_IOB_Data=0x0000;
  348.        
  349.         BSR_DeleteSDGroup(0);                                                //初始化存储器RAM
  350.         BS_Flag=*(unsigned int *)0xe000;                        //读存储单元0xe000
  351.         if(BS_Flag==0xffff)                                                        //没有经过训练(0xe000内容为0xffff)
  352.         {
  353.                 TrainSD();                                                                //训练
  354.                 StoreSD();                                                                //存储训练结果(语音模型)
  355.         }
  356.         else                                                                                 //经过训练(0xe000内容为0x0055)
  357.         {
  358.                 LoadSD();                                                                //语音模型载入识别器
  359.         }
  360.        
  361.         PlaySnd(S_START,3);                                                        //开始识别提示
  362.         BSR_InitRecognizer(BSR_MIC);                                //初始化识别器
  363.        
  364.         while(1)
  365.         {       
  366.                 BSR();
  367.                 if((*P_IOA_Data)&0x0004)                                //是否重新训练
  368.                 {       
  369.                         F_FlashErase(0xe000);
  370.                         while(1);
  371.                 }
  372.         }
  373. }
  374.  
  375.  
复制代码


 

文件到原文下载,原文出自:https://bbs.usoftchina.com/thread-208666-1-1.html

你可能感兴趣的:(单片机智能小车)