精华内容
参与话题
问答
  • 单片机智能小车

    千次阅读 2019-06-06 18:03:06
    单片机智能小车: 基于单片机控制的自主寻迹电动小车的设计: 摘 要:针对小车在行驶过程中的寻迹要求,设计了以AT89C51单片机为核心的控制电路,采用模块化的设计方案,运用色标传感器、金属探测传感器、...
    单片机智能小车:

    none.gifnone.gif


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

    摘 要:针对小车在行驶过程中的寻迹要求,设计了以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

    展开全文
  • 单片机智能小车电路原理图,智能循迹,无线遥控,避障
  • 51单片机智能小车

    2018-12-06 14:05:38
    20、51单片机智能车(避障+循迹+声音+光敏+震动+触摸) (2)
  • 51单片机智能小车的通俗易懂讲解

    万次阅读 多人点赞 2019-07-04 11:53:43
    从上面导航图,我们可以看到,智能小车,共分为三步 外部检测,控制中心,轮子输出控制。 等于人的 眼睛,大脑,手脚。 . . 因为控制中心和轮子输出控制是一样的,只有前面的外部检测,换个模块工作而已。 . . . . ...

    在这里插入图片描述
    .
    .
    从上面导航图,我们可以看到,智能小车,共分为三步

    外部检测,控制中心,轮子输出控制。

    等于人的

    在这里插入图片描述

    .
    .
    因为单片机控制中心和轮子输出控制是一样的,只有前面的外部检测,换个模块工作而已。
    .
    .

    在这里插入图片描述

    .
    .
    .

    .

    我们以一个循迹小车为例子讲解,当你明白这个后,其它的实验你就明白了。
    先来讲解一下公共的控制中心,和轮子输出的组装。
    .
    .

    在这里插入图片描述.
    .

    组装小车,只需要三样东西。
    1 车模。
    2 控制中心板。
    3 轮子电机驱动模块。
    .
    .

    1车模。
    对于新手来说你需要一个车模,当然也可以自己制作一个模型,下面这个是两个电机的智能小车。
    .
    .

    在这里插入图片描述
    .
    .

    上面这个车模包含有,1个车模底板,2个减速电机,2个轮子,1个万向轮(上面图片,电池盒下面那个),1个电池盒。
    这种车模很多地方都有,你只要按照说明书组装成功就可以了。
    .
    .

    2 主控板
    另外你还需要一个单片机最小系统作为控制中心
    .
    .

    在这里插入图片描述
    .
    .

    这个主控板的单片机型号是,STC89C52RC,你也可以选择更高级类型的51单片机
    .
    .
    3 轮子电机驱动模块。
    .
    .

    在这里插入图片描述
    .
    .

    这个电机驱动系统的模块是L298N(上面图片,最大黑色那个)
    .
    这种驱动模块是可以同时驱动两个电机的,完全可以满足你小车的驱动动力,为什么要驱动呢?因为主控板的电流太弱了,不够功率让电机运行,所以才会有电机驱动模块的产生。
    .
    .

    但是,不论外部检测是什么,上面的小车基础配置是公用的
    .
    .

    在这里插入图片描述
    .
    .
    .
    下面是外部检测讲解。

    现在我们既然讲解的是循迹小车,那么你还需要循迹传感器
    .
    .

    在这里插入图片描述
    .
    .

    循迹模块安装位置,如下图所示

    .
    .

    在这里插入图片描述

    .
    .
    就是这么简单,我们的循迹小车,配置模块就是这么多,
    .
    .

    在这里插入图片描述
    .
    .
    再通过程序的编写。我们的循迹小车,就可以循黑色线走了,非常简单。

    .
    .
    智能小车小资料:点我下载

    希望同学们喜欢了

    展开全文
  • 功能:1.检测障碍物传感器查询 2.小车的状态控制
  • 基于51单片机智能小车程序,含各类外设的小车程序,让你轻松搞定智能小车
  • 智能小车采用前轮驱动,前轮左右两边各用一个电机驱动,分别控制两个轮子的转动从而达到转向的目的,后轮是万向轮,起支撑的作用。将三个红外线光电传感器分别装在车体的左中右,当车的左边的传感器检测到障碍物时,...

    智能小车采用前轮驱动,前轮左右两边各用一个电机驱动,分别控制两个轮子的转动从而达到转向的目的,后轮是万向轮,起支撑的作用。将三个红外线光电传感器分别装在车体的左中右,当车的左边的传感器检测到障碍物时,主控芯片控制右轮电机停止左轮转动,车向右方转向,当车的右边传感器检测到障碍物时,主控芯片控制左轮电机停止转动,车向左方转向,当前面有障碍物时规定车右转。于此同时测定速度并显示,在避障小车前进的同时从LCD点阵液晶显示器上显示小车当时速度。在小车左转或右转时在显示器上显示出左或右。

    1.障碍物探测方案的选择

    方案一:脉冲调制的反射式红外线发射接受器。由于采用该有交流分量的调制信号,则可大幅度减少外界干扰;另外红外线接受官的最大工作电流取决于平均电流。如果采用占空比小的调制信号,再品均电流不变的情况下,顺势电流很大(50—100mA),则大大提高了信噪比。并且其反应灵敏,外围电路也很简单。它的优点是消除了外界光线的干扰提高了灵敏度。

    方案二:采用超声波传感器,如果传感器接收到反射的超声波,则通知单片机前方有障碍物,如则通知单片机可以向前行驶。市场上很多红外光电探头也都是基于这个原理。这样不但能准确完成测量,而且能避免电路的复杂性

    由以上两种方案比较可知。方案二要比方案一优势大,市场上很多红外观点探头也都基于这个原理。其电路简单,工作可靠,性能比较稳定。从而避免了电路的复杂性,因此我先用方案二作为小车的监测系统。

    避障电路采用漫反射式光电开关进行避障。光电开关是集发射头和接收头于一体的检测开关,其工作原理是根据发射头发出的光束,被障碍物反射,接收头据此做出判断是否有障碍物。当有光线反射回来时,输出低电平;当没有光线反射回来时,输出高电平。单片机根据接收头电平的高低做出相应控制,避免小车碰到障碍物,由于接收管输出TTL电平,有利于单片机对信号的处理。

    2.电源电路

    本系统所有芯片都需要+5V的工作电压,而干电池只能提供的电压为1.5V的倍数的电压,并且随着使用时间的延长,其电压会逐渐下降,则需要LM7805稳压芯片。L7805能提供300至500mA的电流,足以满足芯片供电的要求。虽然微处理器和微控制器不需要支持电路,功耗也很低,但必须要加以考虑。

    3.电机驱动电路

    市场上用很多种类的小电压直流电动机,很方便的选择到。主要有普通电动机、和步进电动机。

    方案一:采用步进电机,步进电动机的一个显著的特点就是具有快速启动和停止能力,能够达到我们所要求的标准。如果负荷不超过步进电机所能提供的动态转矩值,就能够立即是步进电机启动或反转。其转换灵敏度比较高。正转、反转控制灵活。但是步进电机的价格比较昂贵,对于我们的现状相差太远。

    方案二:采用普通的直流电机。直流电机具有优良的调速特性,调速平滑、方便。调整范围广;过载能力强,能承受频繁的冲击负载,可实现频繁的无极快速启动、制动和反转。能满足各种不容的特殊运行要求。

    由于普通直流电机价格适宜,更易于购买,并且电路相对简单,因此采用直流电机作为动力源

    本设计采用差分放大驱动使电机正反转从而做到前进,左转右转。采用四个大功率晶体管组成H桥式电路,四个大功率晶体管分为两组,交替导通和截止,用单片机控制使之工作在开关状态,进而控制电机的运行。该控制电路由于四个大功率晶体管只工作在饱和与截止状态下,效率非常高,并且大功率晶体管开关的速度很快,稳定性也极强,是一种广泛采用的电路。

    展开全文
  • 基于51单片机智能小车的设计与实现

    万次阅读 多人点赞 2018-04-02 10:28:13
    0引言学习智能小车系统,有助于提高搭建系统的能力和对自动控制技术的理解。智能小车是一个较为完整的智能化系统,而智能化的研究已成为我国追赶世界科技水平的重要任务。智能小车有它特有的特点:成本低,涉及的...

    0引言

    学习智能小车系统,有助于提高搭建系统的能力和对自动控制技术的理解。智能小车是一个较为完整的智能化系统,而智能化的研究已成为我国追赶世界科技水平的重要任务。智能小车有它特有的特点:成本低,涉及的知识面广,易于拓展[1]。整个智能小车系统作为一个完整的系统,从它的原理图的实现到实物的完成的过程,不仅需要深厚的电子方面的知识,还有对电路实现的良好掌握,对于培养学生的实践能力都有重要的意义。智能小车的竞赛在我国各大高校中都受到了重视,吸引了大批的高校学生的兴趣,而且取得了很多优异的成果,为我国推进智能化的进程做出了巨大的贡献,也为智能汽车的发展提供了理论依据[2-3]。只有当把理论和模型应用到实践中,这样的创新才用意义,我们国家这几年在智能化方面的进步越来越快,也推动了我国在国际社会上在智能化方面的话语权。智能小车是智能化的一部分,它的系统里的避障、循迹、红外遥控的技术用到了智能化,将智能化应用到传统技术上是21世纪发展的趋势。我国虽然从改革开放以来大力发展科技创新,但是在智能化的创新水平与国外较发达的国家相比还有巨大的差距,智能竞赛在高校越来越流行,也证明了我国教育在这方面很快会赶上世界上的发展水平。本次设计是以单片机为CPU,通过编程和一些外围电路的设计来实现红外遥控,避障,循迹等功能。最重要的是把模型上的研究应用到实际生活中,智能车辆便做到了这一点[4-6]。在实际应用中比如在倒车的过程中实现的红外警报系统是以智能小车为模型而研发出来的。对于电子知识的热爱与钻研有利于研发更多智能车辆,使我们的生活更加便利、智能化。

    1. 系统的整体框架和工作原理。

    1.1系统的整体框架

    智能小车以STC89C51为主芯片,使用两轮驱动,另外还需要一个万向轮,起到支撑和平衡小车的作用。主要包括电机模块,电源模块,循迹模块,红外遥控模块,超声波模块,LED显示模块等组成,系统的整体设计设计框图如图1所示。

                    图1 系统的整体设计框架组成图

    1.2系统的工作原理

    智能小车以STC89C51为主芯片,使用两轮驱动,用两个电机分别驱动左轮和右轮。通过电机来调节车轮的转速从而可以实现控制转向的功能,另外还需要一个万向轮,起到支撑和平衡小车的作用[7]。在小车的车体左右分别安装红外线光电传感器,通过黑白线来检测循迹的功能:当黑线的边界被小车左侧的传感器检测到的时候,会向单片机发送一个信号,当单片机接收到信号的时候,会控制左轮电机,小车开始向左调整方向;同理当小车的右边传感器检测到黑线时,主控芯片开始控制小车右轮的电机,使其减速,小车开始向右修正。在小车的前部分安装了一个红外线光电开光来实现避障,当障碍物被传感器检测到的时候,车轮开始转动,小车避开障碍物继续行驶[8-10]。

    红外遥控部分是由发射和接收两部分组成,采用红外遥控器的2,4,6,8键来控制小车的前进,后退,左转,右转,当红外遥控器的数字键按下的时候,经过发射端的编码和调制,再通过电转换放大器,发送给接收端的红外接收头,通过一系列的过程来完成红外遥控的这个过程。

    通过轻触按键来选择小车的模式,本系统下小车共有三种模式,分为循迹模式、避障模式和红外遥控模式,分别用黄、绿、红这三个LED灯来代表,系统通入电源默认状态下是红外遥控。当轻触按键第一次按下的时候,绿灯亮,开始进入避障模式,再按一次按键开始进入循迹模式,此时红灯亮[11]。

    2.系统各模块设计

    2.1 红外循线模块

    本次设计中将采用红外发光二极管作为反射式光电传感器。红外发光二极管的工作原理:发射管为无色透明的LED灯,它在接入电源之后能产生红外光,这种红外光人眼是看不到的。接收管为黑色的LED灯,红外光的多少会影响其内部的电阻的大小,它并没有固定不变的电阻。利用黑色吸光的原理,当小车行驶的过程中,遇到黑色物体,红外发射管发射回来的光比较少,因此接收管可接收到的红外光就比较少,它们之间成正比例关系,此时接收管内的电阻会变得较小,外围电路就可以读出到检测黑线的状态。用电平的高低来反应循迹过程,将信号发送给单片机的i/o口,就可以完成循迹功能[12-13]。

    外部电路用到了LM393,它的内部集成了2路比较器集成电路,由于这2路比较器完全相同,所以我只要了解一路的原理即可,比较器共有3个端口,其中有2个输入端和1个输出端,其中同相输入端用“+”表示,反相输入端用“-”表示,它用作比较2个输入的电压时,2个输入端的任意一个的固定电压作为参考电压,剩下的一端只需要接需要比较的信号电压。含有LM393的红外循线模块原理图如图2所示[14]。

    图2 含有LM393的红外传感器电路原理图

    2.2避障模块

    本次设计采用了HC-SR04超声波模块,源于它广泛应用与智能小车的避障原理中,考虑到它的特性和工作原理,本次实验将采用HC-SR04作为超声波模块的器件。它有4个引脚:1引脚接5V电源,2引脚为Trig端,接P2.4,3引脚为Echo端,接P2.5,4引脚为红色接地。HC-SR04电路连接如图3所示:

     

     

     

     

     

     

     

    图3 HC-SR04电路连接图

    3.软件设计

    当硬件设计完成之后最重要的部分是进行软件设计,根据每个模块的不同来进行软件编程,共分为红外遥控、循迹和避障三个模块,这三个模块是通过一个按键来控制小车的状态,所有的软件设计都是以STC89C51单片机为中心,进行软件编程,智能小车系统中的软件部分是通过keil-uvision4进行程序调试,通过STC软件烧写到51单片机中,软件部分的关键是各个I/O口的连接,本次设计中将电机控制接线接到了P1的四个端口,传感器接到了P2端口,红外遥控信号接口接到了P3口[15]。考虑到红外遥控的程序以及循迹、避障的算法已经比较成熟,红外对管的原理也为固定内容,较为简单,而且需要调试程序的地方并不多,所以本次设计没有留USB 接口,而是选择直接把程序烧写到单片机中,将单片机与循迹,避障模块按照原理图进行焊接,通过原理图的设计,以及一些巧妙的走线方式简易了整个系统,使程序变的简单容易理解,节约了成本而且降低了整个系统的难度。整个智能小车系统可以分为数据处理和过程控制这两个部分,其中数据处理是整个系统的前提,它包括:模拟变化、对数据进行采集、数字滤波、距离计算等,只有这一步得到了合适的设计,才能保证过程控制的顺利完成。

    3.1避障子程序流程图

    避障模块的简单流程图如图4所示,当打开电源,小车的电源指示灯亮起,小车的默认状态下是红外遥控的方式,按一下模块控制键,开始进入避障模式的状态,小车开始匀速行驶,利用超声波模块进行避障,利用单片机输出一个触发信号,把触发信号输入到超声波测距模块,再由超声波测距模块的发射器向某一方向发射超声波,在发射的同时单片机通过软件开始计时,超声波在空气中传播,遇到障碍物返回,接收器接收到反射波产生一个信号反馈给单片机,此时停止及时。发射点距障碍物的距离为s,它的公式为s=time*1.8/100,其中time=TH0*256+TL0。当前方没有障碍物的时候,小车会继续行驶,此时线外线传感器会从低电平恢复为高电平,电机的转向保持不变[16]。

     

     

     

     

     

     

     

     

    图4 避障模块流程图

    3.2循迹子程序流程图

    小车的循线模块流程图如图5所示。打开小车的电源开关,按下两次模式选择开关会进入循迹模式。小车进如循迹模式的状态下,小车会在提前设定的环境下进行测试,当左边的红外线接收管为高电平时,小车开始向左转;当右边的红外接收管为高电平时,小车开始右转,如果不是,小车则继续沿着黑线保持行驶。

     

     

     

     

     

     

     

     

     

     

     

     

    图5循线模块流程图

    4.调试与结果分析

    4.1测试方法

    (1)打开电源开关,将智能小车放置在平坦的地板路面,开始进行红外测试,使用红外遥控器的2,8,4,6键进行前后左右这四个方向的测试,先检查是否可以前进和后退,然后在检测是否可以转弯。注意这个过程中小车的速度都是匀速前进。在这个过程中需要记录多次数据,避免因为误差而导致测试结果的不准确性。

    (2)通过按键选择避障模式,在小车直行的前方放一些障碍物,当小车接近障碍物是判断小车是否可以成功避开障碍物。小车避障的距离是确定好的,所以可以通过简单的障碍物来判断避障的结果。

    (3)通过按键选择循迹模式,在设计的简易黑白线跑道上进行测试,判断小车是否能够成功完成循迹功能。

    4.2测试结果

        将程序烧写到单片机中,进行了数次的实验,这里记录了6实验数据进行分析,结果如下表所示。

    小车运行次数

    成功循迹次数

    成功避障次数

    成功红外遥控次数

    1

    1

    1

    1

    2

    2

    2

    2

    3

    3

    2

    3

    4

    4

    3

    4

    5

    5

    5

    5

    6

    5

    6

    5

        通过数次的测试,小车能够较好的完成循迹、避障、红外遥控的功能,通过以上数据的分析,小车在循迹和红外遥控方面的成功率较高,在避障实验中会存在误差,后来经过仔细的分析发现误差的原因收到周围强光和跑道设计的不合理的影响,这些不足的方面还有待改进。

    5.结束语

    本系统是以STC89C51单片机为CPU,通过一些外围电路和软件编程实现循迹、避障和红外遥控的功能。整个设计过程中最大的特点是利用简单的原理图将避障,循迹,红外遥控这三个模块有效的结合起来,利用经典的H桥路作为小车前进、后退、左右转编程的理论基础,提高了效率,降低了编程的复杂度,本系统具有很强的研究的意义,智能化的发展促使了智能小车往功能更加强大的方向发展,将会在勘探危险建筑物的环境和检测有毒气体等领域发挥着重要意义。

    参考文献

    [1]陆蕊. 基于单片机的智能小车系统的设计[J]. 电子世界, 2017(8):166-166.

    [2陈梦婷,胡白燕,黄璨.基于单片机的智能循迹避障小车的设计与实现[J].智能机器人,2016:47-51.

    [3]陈海宴.51单片机原理及应用[M].北京:北京航空航天大学出版社.2010:62-65.

    [4]高枫.基于ARM的智能寻迹小车的设计与实现[D].山西:中北大学,2012.6.

    [5]陈海洋,李东京.基于单片机的智能循迹避障机器人小车设计[J].科技风,2014(20):99.

    [6]钱栢霆,李娟.基于单片机的循迹避障智能小车系统的设计[J].电子制作,2015(6x).

    [7]寸巧萍.基于Mega16单片机的智能小车循迹避障设计方案

    [8].电子技术与软件工程,2015(18):258.

    [9] 顾群,蒲双雷.基于单片机的智能小车避障循迹系统设计[J].数字技术与应用,2012(5):23.

    [10]蔡莉莎, 曾维鹏. 基于人工智能路径规划系统的智能小车的设计与实现[J]. 电子世界, 2016(18):112-113.

    [11]朱思敏. 自循迹智能小车控制系统的设计与实现[D]. 浙江工业大学, 2013.

    [12]徐少朋. 基于Android开发的智能小车路径规划[D]. 天津大学, 2014.

    [13]吕闪, 金巳婷, 沈巍. 基于STM32的循迹避障智能小车的设计[J]. 计算机与数字工程, 2017, 45(3):549-552.

    [14]朱丹峰, 葛主冉, 林晓雷. 基于Android平台的无线遥控智能小车[J]. 电子器件, 2013, 36(3):408-412.

    [15]俞文武, 程恒文, 金天宝,等. 基于STM32的智能跟踪小车的设计[J]. 山东工业技术, 2017(8):294-296.

    [16]李娜, 杨春鹤, 王泽昊,等. 浅谈基于STM32单片机的智能车设计过程[J]. 数码世界, 2016(11):90-91.

    展开全文
  • 51单片机智能小车C程序 蓝牙遥控+避障+自动寻迹

    万次阅读 多人点赞 2017-06-09 14:43:27
    基于AT89C52的蓝牙小车程序。
  • **51单片机智能小车(舵机云台超声波避障+循迹+蓝牙+红外跟随+遥控+TFT液晶显示屏) 本人由于使用的液晶显示屏,程序大于8K,所以更换为STC12C5A60S2芯片,与51芯片兼容。 功能比较多: 1舵机云台超声波避障 2....
  • 这是一个智能小车的控制程序,包括了对小车的前进和转弯的控制,
  • #include #define uchar unsigned char #define uint unsigned int sbit IN1=P1^0; sbit IN2=P1^1; sbit IN3=P1^2; sbit IN4=P1^3; sbit EN1=P1^4; // 左电机使能 ...
  • 一 80C51单片机硬件结构 10 二 最小应用系统设计 11 三 前向通道设计 12 四 后向通道设计 15 五 显示电路设计 17 第四章 软件设计 20 一 主程序设计 20 二 显示子程序设计 24 三 避障子程序设计 25 四 软件抗干扰...
  • 本系统采用AT89C52为中心控制器,实现电动车的智能控制功能
  • 51单片机只能小车花式,寻迹,红外,超声波,避障,遥控实验 总共包含12个实验代码一起打包放送 每一个运行方式都有一个实验进行演示,包含详细注释 为小白量身定做,引导一条光明之路,佛光普照,大杀四方 毕业设计...
  • 51单片机智能小车开<一>

    千次阅读 2017-04-29 20:33:52
    提示:需要单片机基础和c语言基础 本次,我们设计好小车的外观结构,和电路部分,并且实现跑起来  1-)外观结构我没有这么做,是以前玩具车裁剪下来的 外观非常简陋, 下面就是电路部分了 准备材料: stc...
  • 手机客户端使用微信小程序进行蓝牙的连接和控制信号的发送,蓝牙使用的是CC2541模块,其实支持蓝牙4.0都可以,硬件方面用小小的51单片机接收手机客户端的控制信号
  • MSP432E401Y单片机智能小车测速功能

    千次阅读 2018-06-19 17:10:20
    * MSP432E401Y * Description:本函数实现定时和测速功能 * 引脚:PD0-&gt;编码器输入信号 * * Author: Robin.J ***************************************************************************/ ...
  • MSP432E401Y单片机智能小车PID调速代码

    千次阅读 2018-06-19 17:12:05
    * MSP432E401Y * Description:PID处理函数 * 引脚: * * Author: Robin.J ***************************************************************************/ #include &lt;PID.h&gt;...
  • 智能小车-51单片机-智能小车超声波避障 智能小车-51单片机-智能小车超声波避障
  • 基于51单片机智能小车的主要代码,可以实现对电动小车测速、测距、壁障、手动遥控等功能
  • 51单片机智能小车 实现功能:蓝牙控制,红外控制,智能避障,LCD显示 相关模块;HC06蓝牙模块,L298N电机驱动模块,红外模块,LCD1602
  • 51智能小车单片机.rar

    2021-01-04 16:05:27
    51单片机智能小车安卓手机控制
  • 本文简要介绍了基于arduino单片机智能小车可以通过手机端蓝牙助手对其进行遥控操作‘可以切换手动操作和自动避障两个模式,避障基于蝙蝠超声波测距的原理,利用超声波传感器和舵机旋转,检测小车前方障碍物的距离,...
  • 简单的51单片机控制智能小车的资源,含有技术报告和程序,实现了循迹,测距,壁障和蓝牙控制等功能。
  • 基于51单片机智能小车避障 功能齐全 代码齐全 还有论文
  • 基于51单片机智能小车驱动模块,能连接51单片机和电机,实现单片机控制马达
  • 本文主要讲了一下基于89c52单片机智能小车,一起来学习一下

空空如也

1 2 3 4 5 ... 20
收藏数 681
精华内容 272
关键字:

单片机智能小车