找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2552|回复: 0
收起左侧

51单片机控制智能小车的设计论文下载

[复制链接]
ID:336130 发表于 2018-7-21 17:30 | 显示全部楼层 |阅读模式
论文带详细的仿真图和源代码

  •          前言
  •          方案设计与论证
    • 控制器模块选取
    • 电机模块选取
    • 电机驱动器模块选取
    • 电源模块选取
  •          硬件设计
    • 主控系统            
    • 电机模块
    • 电机驱动模块
    • 电源模块
    • 按键模块
  •          软件设计
    • 直行设计
    • 转弯设计
  •          调试中存在的问题
  •          参考文献
一、前言:

随着汽车工业的迅速发展,关于汽车的研究也就越来越受人关注。全国电子大赛和省内电子大赛几乎每次都有智能小车这方面的题目,全国各高校也都很重视该题目的研究。可见其研究意义很大。本设计就是在这样的背景下提出的,指导教师已经有充分的准备。本题目是结合科研项目而确定的设计类课题。我们设计的智能电动小车该具有圆形运行、三角形运行、矩形运行和三者一起运行的功能。都是运行一循环自动停车。

根据题目的要求,确定如下方案:在现有玩具电动车的基础上,加了四个按键,实现对电动车的运行轨迹的启动,并将按键的状态传送至单片机进行处理,然后由单片机根据所检测的各种按键状态实现对电动车的智能控制。

这种方案能实现对电动车的运动状态进行实时控制,控制灵活、可靠,精度高,可满足对系统的各项要求。本设计采用STC89C52单片机。以STC89C52为控制核心,利用按键的动作,控制电动小汽车的轨迹。实现四种运行轨迹。STC89C52是一款八位单片机,它的易用性和多功能性受到了广大使用者的好评。

二、方案设计与论证


    • 控制器模块选取

我们采用STC公司的STC89S52单片机作为主控制器,STC公司的单片机内部资源比起ATMEL公司的单片机来要丰富的多,它在5V供电情况下,最多支持80M晶振、且内部有512B的RAM数据存储器、片内含8k空间的可反复擦些1000次的Flash只读存储器、1K的EEPROM、8个中断源、4个优先级、3个定时器、32个IO口、片机自带看门狗、双数据指针等。但是不兼容Atmel。

从方便使用的角度考虑,我们选择了此方案



    • 电机模块选取

采用普通直流电机。直流电机运转平稳,精度有一定的保证。直流电机控制的精确度虽然没有步进电机那样高,但完全可以满足本题目的要求。通过单片机的PWM输出同样可以控制直流电机的旋转速度,实现电动车的速度控制。并且直流电机相对于步进电机价格经济。



    • 电机驱动器模块选取

采用电机驱动芯片L298N。L298N为单块集成电路,高电压,高电流,四通道驱动,可直接的对电机进行控制,无须隔离电路。通过单片机的I/O输入改变芯片控制端的电平,即可以对电机进行正反转,停止的操作,非常方便,亦能满足直流减速电机的大电流要求。调试时在依照芯片手册,用程序输入对应的码值,能够实现对应的动作。



    • 电源模块选取

在本系统中,需要用到的电源有单片机的5V,L298N芯片的电源5V和电机的电源7-15V。所以需要对电源的提供必须正确和稳定可靠。用9V的锌电源给前、后轮电机供电,然后使用7805稳压管来把高电压稳成5V分别给单片机和电机驱动芯片供电。因此为了方便,这里我们采用12V电源给电机供电,再用7805转换成5V电源给单片机使用。

三、硬件设计

              小车采用四轮驱动,一侧的前后两个车轮共用一个电机驱动,另外两个前后轮共用一个驱动,调节左右车轮转速从而达到控制转向的目的。

系统结构框图

3.2、电机驱动模块

              L298N驱动直流电机,它靠两个引脚控制一个电机的运动。小车采用四轮驱动,小车两侧的电机短接起来各接到L298N的一个输出端。通过调制两边轮子的转速或正反转来达到控制小车转向的目的。芯片引脚和功能如图1,驱动电路如图2。


EN A(B)

IN1(IN3)

IN2(IN4)

电机运行情况

H

H

L

正转

H

L

H

反转

H

同IN2(IN4)

同IN2(IN4)

快速停止

L

X

X

停止


将L298N的IN0、1、2、3,接到P2.5到P2.2上,ENA、ENB接到P2.1、P2.0.

四个按键接到P1.0~P1.3.

3.3、电机模块

电机模块采用2块电机同时驱动,分别接到L298N的两个输出端。

3.4、电源模块

采用一片HT7550电压稳压5V后给单片机系统和其他芯片供电。

该电源模块的功能是把6伏锌锰干电池通过HT7550转换为5伏电压,向单片机、逻辑芯片供电。考虑到如果用电池组同时向电机和芯片供电时,由于驱动电机所需电流较大,容易影响对芯片的供电,因此我们决定电池组单独对驱动电机供电

,四节1.5V的南孚电池对其供电。




    • 按键模块

本系统添加4个按键,用来选择控制小车。并接于P2.0到P2.3口上。



四、软件设计

4.1、小车直行设计:

              若要求小车直走,这需要给4个电机正转命令。根据L298N芯片手册

EN A(B)

IN1(IN3)

IN2(IN4)

电机运行情况

H

H

L

正转

H

L

H

反转

H

同IN2(IN4)

同IN2(IN4)

快速停止

L

X

X

停止


4.2、小车转弯设计:

              若要求小车转弯,需要给一侧电机正转,一侧电机反转或者不旋转。

4.3、小车调速设计:

              若要求车调速,只需用PWM来控制L298N的ENA和ENB就可以对小车进行调速。这里我使用定时器T0的工作模式2自动重装。并赋初值              TH0=0xf6;TL0=0xf6;



调试中出现的问题
转向时间需要慢慢调,时间长,旋转弧度大;时间短,旋转弧度小。
直行时,由于每个电机的性能不一样,导致两侧占空比一样时,小车会存在转弯,这样需要微调占空比。
出现单片机供电不足的现象,需要增加电量。

单片机源程序如下:
  1. #include<reg52.h>
  2. sbit IN1=P2^5;
  3. sbit IN2=P2^4;
  4. sbit IN3=P2^3;
  5. sbit IN4=P2^2;
  6. sbit ENA=P2^1;
  7. sbit ENB=P2^0;
  8. sbit key1=P1^0;
  9. sbit key2=P1^1;
  10. sbit key3=P1^2;
  11. sbit key4=P1^3;
  12. void delay(unsigned int z);
  13. void delay_us(unsigned int aa);
  14. void delay2s(void)   //误差 0us
  15. {
  16.     unsigned char a,b,c,n;
  17.     for(c=167;c>0;c--)
  18.         for(b=39;b>0;b--)
  19.             for(a=152;a>0;a--);
  20.     for(n=1;n>0;n--);
  21. }
  22. void yuan()
  23. {
  24. while(1)
  25. {
  26.               unsigned int i;
  27.               IN1=1;   
  28.               IN2=0;
  29.               IN3=1;
  30.               IN4=0;
  31.               for(i=0;i<400;i++)
  32.               {
  33.               delay(3);
  34.               ENA=~ENA;
  35.               }               } }
  36. void juxing()
  37. {
  38. while(1)
  39. {
  40. unsigned int i;
  41.               IN1=1;   
  42.               IN2=0;
  43.               IN3=1;
  44.               IN4=0;
  45.               for(i=0;i<200;i++)
  46.               {
  47.               delay(1);
  48.     ENA=~ENA;
  49.               ENB=~ENB;
  50.               }
  51.               delay2s();
  52.               IN1=1;   
  53.               IN2=0;
  54.               IN3=0;
  55.               IN4=0;
  56.               for(i=0;i<40;i++)
  57.               {
  58.               delay(10);
  59.               ENA=~ENA;
  60.               }
  61.               IN1=1;   
  62.               IN2=0;
  63.               IN3=1;
  64.               IN4=0;
  65.                             for(i=0;i<200;i++)
  66.               {
  67.               delay(1);
  68.     ENA=~ENA;
  69.               ENB=~ENB;
  70.               }
  71.                             delay2s();
  72.               IN1=1;   
  73.               IN2=0;
  74.               IN3=0;
  75.               IN4=0;
  76.               for(i=0;i<40;i++)
  77.               {
  78.               delay(10);
  79.               ENA=~ENA;
  80.               }
  81.               IN1=1;   
  82.               IN2=0;
  83.               IN3=1;
  84.               IN4=0;
  85.     for(i=0;i<200;i++)
  86.               {
  87.               delay(1);
  88.     ENA=~ENA;
  89.               ENB=~ENB;
  90.               }
  91.                             delay2s();
  92.               IN1=1;   
  93.               IN2=0;
  94.               IN3=0;
  95.               IN4=0;
  96.               for(i=0;i<40;i++)
  97.               {
  98.               delay(10);
  99.               ENA=~ENA;
  100.               }
  101.               IN1=1;   
  102.               IN2=0;
  103.               IN3=1;
  104.               IN4=0;
  105.               for(i=0;i<200;i++)
  106.               {
  107.               delay(1);
  108.     ENA=~ENA;
  109.               ENB=~ENB;
  110.               }
  111.                             delay2s();
  112.               IN1=1;   
  113.               IN2=0;
  114.               IN3=0;
  115.               IN4=0;
  116.               for(i=0;i<40;i++)
  117.               {
  118.               delay(10);
  119.               ENA=~ENA;
  120.               }
  121.               IN1=0;   
  122.               IN2=0;
  123.               IN3=0;
  124.               IN4=0;
  125.               }              }
  126. void sanjiao()
  127. {              
  128.     while(1)
  129. {
  130.               unsigned int i;
  131.               IN1=1;   
  132.               IN2=0;
  133.               IN3=1;
  134.               IN4=0;
  135.               for(i=0;i<200;i++)
  136.               {
  137.               delay(1);
  138.     ENA=~ENA;
  139.               ENB=~ENB;
  140.               }
  141.               delay2s();
  142.               IN1=1;   
  143.               IN2=0;
  144.               IN3=0;
  145.               IN4=0;
  146.               for(i=0;i<70;i++)
  147.               {
  148.               delay(10);
  149.               ENA=~ENA;
  150.               }
  151.               IN1=1;   
  152.               IN2=0;
  153.               IN3=1;
  154.               IN4=0;
  155.               for(i=0;i<200;i++)
  156.               {
  157.               delay(1);
  158.     ENA=~ENA;
  159.               ENB=~ENB;
  160.               }
  161.               delay2s();
  162.               IN1=1;   
  163.               IN2=0;
  164.               IN3=0;
  165.               IN4=0;
  166.               for(i=0;i<70;i++)
  167.               {
  168.               delay(10);
  169.               ENA=~ENA;
  170.               }
  171.               IN1=1;   
  172.               IN2=0;
  173.               IN3=1;
  174.               IN4=0;
  175.                             for(i=0;i<200;i++)
  176.               {
  177.               delay(1);
  178.     ENA=~ENA;
  179.               ENB=~ENB;
  180.               }
  181.               delay2s();
  182.               IN1=1;   
  183.               IN2=0;
  184.               IN3=0;
  185.               IN4=0;
  186.               for(i=0;i<70;i++)
  187.               {
  188.               delay(10);
  189.               ENA=~ENA;
  190.               }
  191.               IN1=0;   
  192.               IN2=0;
  193.               IN3=0;
  194.               IN4=0;            
  195.               }              }
  196. void delay(unsigned int z)
  197. {
  198. unsigned int x,y;
  199. for(x=z;x>0;x--)
  200. for(y=110;y>0;y--);
  201. }
  202. void delay_us(unsigned int aa)
  203. {
  204. while(aa--);
  205. }
  206. void main()
  207. {
  208. while(1)
  209. {
  210. if(key1==0)
  211. {
  212. delay(10);
  213. if(key1==0)
  214. {
  215. yuan();
  216. while(!key1);
  217. }}
  218. if(key2==0)
  219. ……………………

  220. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
51单片机控制智能小车.doc (1.87 MB, 下载次数: 26)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表