单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:13343|回复:18
打印上一主题下一主题

基于51单片机的简单智能小车,实现HC-05蓝牙控制+避障+寻迹等功能

 [复制链接]
跳转到指定楼层
楼主
ID:311115发表于 2018-4-22 11:02|只看该作者|只看大图回帖奖励
分享一下我的作品。下面是制作出来的实物图:


单片机源程序如下:
  1. #include<reg52.h>
  2. typedef unsigned char u8;     //宏定义无符号字符型       8位
  3. typedef unsigned int  u16;     //宏定义无符号整形         16位
  4. sbit PWM1 = P2^6;       //左电机高电平
  5. sbit PWM2 = P2^5;       //右电机高电平
  6. sbit IN1 = P2^4;
  7. sbit IN2 = P2^3;       //左电机
  8. sbit IN3 = P2^2;
  9. sbit IN4 = P2^1;       //右电机
  10. sbit S1 = P1^1;           //左红外避障模块
  11. sbit S2 = P1^2;           //右红外避障模块
  12. sbit S3 = P1^3;           //左红外寻迹模块
  13. sbit S4 = P1^4;           //右红外寻迹模块
  14. sbit K1 = P3^2;           //功能转换按键
  15. u8 connt;               //调速周期
  16. u8 PWM_NO;               //高电平时间
  17. u8 COM = 0;               //功能控制位
  18. u8 t=0;                   //判断串口中断是否执行


  19. void time(void)                       //定时计时器初始化函数
  20. {
  21.    TMOD = 0x01;                   //中断方式1
  22.    TH0 = 0xfe;
  23.    TL0 = 0x0c;                       //0.5ms
  24.    EA = 1;                           //打开总中断
  25.    ET0 = 1;                       //打开计时器中断
  26.    TR0 = 1;                       //启动计时器
  27. }

  28. void InitUART(void)           //串口中断初始化函数
  29. {
  30.    SCON=0x50;             //设置为工作方式1
  31.      TMOD=0x20;             //设置计数器工作方式2
  32.      PCON=0x00;             //波特率加倍
  33.      TH1=0xfd;                 //计数器初始值设置,注意波特率是9600的
  34.      TL1=0xfd;
  35.      ES=1;                         //打开接收中断
  36.      EA=1;                         //打开总中断
  37.      TR1=1;                     //打开计数器
  38. }

  39. void delay( u16 k )           //延时大约1ms
  40. {
  41.    u16 i,j;
  42.      for(i=k;i>0;i--)
  43.      for(j=120;j>0;j--);
  44. }

  45. void SC()                 //刹车
  46. {
  47.    IN1 = 0;  
  48.      IN2 = 0;
  49.      IN3 = 0;
  50.      IN4 = 0;
  51. }
  52. void QJ()                 //前进
  53. {
  54.    IN1 = 1;  
  55.      IN2 = 0;
  56.      IN3 = 1;
  57.      IN4 = 0;
  58. }
  59. void HT()                 //后退
  60. {
  61.    IN1 = 0;  
  62.      IN2 = 1;
  63.      IN3 = 0;
  64.      IN4 = 1;
  65. }
  66. void ZZ1()                 //左大转
  67. {
  68.    IN1 = 0;  
  69.      IN2 = 1;
  70.      IN3 = 1;
  71.      IN4 = 0;
  72. }
  73. void ZZ2()                 //左小转
  74. {
  75.    IN1 = 0;  
  76.      IN2 = 0;
  77.      IN3 = 1;
  78.      IN4 = 0;
  79. }
  80. void YZ1()                 //右大转
  81. {
  82.    IN1 = 1;  
  83.      IN2 = 0;
  84.      IN3 = 0;
  85.      IN4 = 1;
  86. }
  87. void YZ2()                 //右小转
  88. {
  89.    IN1 = 1;  
  90.      IN2 = 0;
  91.      IN3 = 0;
  92.      IN4 = 0;
  93. }
  94. void HY()                 //后右转
  95. {
  96.    IN1 = 0;  
  97.      IN2 = 0;
  98.      IN3 = 0;
  99.      IN4 = 1;
  100. }
  101. void lin1()                 //红外避障程序
  102. {
  103.    if( S1&& S2 )         //两探头不反应,小车前进
  104.    {
  105.         
  106.        QJ();
  107.         
  108.    }
  109.    if( !S1&& S2 )         //左探头反应,小车右转
  110.    {        
  111.          SC();
  112.          delay(100);
  113.          HT();
  114.          delay(400);
  115.          YZ1();
  116.          delay(550);
  117.          SC();
  118.          delay(100);
  119.         
  120.    }
  121.    if( S1&& !S2 )         //右探头反应,小车左转
  122.    {        
  123.        SC();
  124.        delay(100);
  125.        HT();
  126.        delay(400);
  127.        ZZ1();
  128.        delay(550);
  129.        SC();
  130.        delay(100);
  131.         
  132.    }
  133.    if( !S1&& !S2 )         //两探头反应,小车后退,右转
  134.    {        
  135.        SC();
  136.        delay(100);
  137.        HT();
  138.        delay(400);
  139.        HY();
  140.        delay(550);
  141.         
  142.    }
  143. }

  144. void lin2()                       //寻迹功能程序
  145. {
  146.    if( !S3&& !S4 )         //两探头反应,小车前进
  147.    {        
  148.        QJ();
  149.        delay(150);
  150.        SC();
  151.        delay(90);
  152.         
  153.    }
  154.    if( S1&& S2 )         //两探头反应,小车停止
  155.    {      
  156.      SC();
  157.         
  158.    }
  159.    if( S3&& !S4 )         //左探头不反应,小车右转
  160.    {        
  161.        SC();
  162.        delay(90);
  163.        YZ2();
  164.        delay(120);
  165.         
  166.    }
  167.    if( !S3&& S4 )         //右探头不反应,小车左转
  168.    {      
  169.        SC();
  170.        delay(90);
  171.        ZZ2();
  172.        delay(90);
  173.         
  174.    }  
  175. }

  176. void lin3()                                   //物块追踪功能程序
  177. {
  178.    if( S1&& S2 )         //两探头不反应,小车停止
  179.    {        
  180.        SC();
  181.         
  182.    }
  183.    if( !S1&& !S2 )         //两探头反应,小车前进
  184.    {        
  185.        QJ();
  186.         
  187.    }
  188.    if( !S1&& S2 )         //右探头不反应,小车左转
  189.    {        
  190.        ZZ1();
  191.         
  192.    }
  193.    if( S1&& !S2 )         //左探头不反应,小车右转
  194.    {        
  195.          YZ1();
  196.         
  197.    }  
  198. }
  199. void lin4()                                   //魔术手功能程序
  200. {
  201.      if( S1&& S2 )         //两探头不反应,小车前进
  202.      {        
  203.          QJ();
  204.      }
  205.         
  206.      if( !S1&& !S2 )         //两探头反应,小车后退
  207.      {        
  208.          HT();
  209.         
  210.      }
  211.      if( !S1&& S2 )         //左探头反应,小车后退
  212.      {        
  213.          HT();
  214.         
  215.      }
  216.      if( S1&& !S2 )         //右探头反应,小车后退
  217.      {        
  218.          HT();
  219.         
  220.      }
  221. }

  222. void konzi()           //控制位
  223. {
  224.    if( K1 == 0 )
  225.    {
  226.      delay(10);
  227.      if( K1 == 0 )
  228.      {
  229.          COM++;              
  230.      }
  231.      while( !K1 );
  232.    }
  233.    if( COM == 5)
  234.    {
  235.        COM = 0;
  236.          t=0;
  237.    }
  238.    if( COM == 0 )
  239.    {
  240.        PWM_NO = 14;
  241.    }
  242.    else
  243.    PWM_NO = 15;  
  244. }

  245. void main ()                   //主函数
  246. {
  247.    time();                             //计时器初始化
  248.    InitUART();                           //串口初始化
  249.    connt = 20;                           //PWM的一个周期
  250.    PWM_NO = 14;                       //调速,数值越大速度越慢
  251.    IN1 = 0;
  252.    IN2 = 0;
  253.    IN3 = 0;
  254.    IN4 = 0;                           //待机
  255.    while(1)
  256.    {
  257.          konzi();
  258.        switch(COM)                       //功能选择区
  259.          {
  260.            case 0: lin1();break;         //避障
  261.            case 1: lin2();break;         //寻迹
  262.            case 2: lin3();break;         //物体跟随
  263.            case 3: lin4();break;         //魔术手
  264.              case 4: t=1;SC();while(1);break;  //跳转到蓝牙控制
  265.          }                                        
  266.    }
  267. }

  268. void Timer0Interrupt(void) interrupt 1                   //计时器中断函数
  269. {
  270.    u8 non;
  271.    TH0 = 0xfe;
  272.    TL0 = 0x0c;
  273.    non++;
  274.    if( non == PWM_NO )
  275.    {
  276.          PWM1 = 1;
  277.        PWM2 = 1;
  278.    }
  279.    if( non == connt )
  280.    {
  281.          non = 0;
  282.        if( PWM_NO != 0)
  283.      {
  284.          PWM1 = 0;
  285.          PWM2 = 0;
  286.      }
  287. ……………………

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

所有资料51hei提供下载:
小车.rar(1.77 KB, 下载次数: 580)


评分

黑币 +55
收起理由
+ 5
绝世好帖!
+ 50
共享资料的黑币奖励!

查看全部评分

沙发
ID:311135发表于 2018-4-22 17:02|只看该作者
谢谢楼主的分享
板凳
ID:321800发表于 2018-5-4 08:42|只看该作者
谢谢楼主分享,在做毕设
地板
ID:391828发表于 2018-9-3 17:25|只看该作者
魔术手方案代码设计的比较巧妙
5#
ID:398851发表于 2018-9-17 09:32|只看该作者
谢谢分享
6#
ID:418963发表于 2018-11-1 10:22|只看该作者
谢谢分享,真的很棒
7#
ID:437935发表于 2018-12-10 20:34|只看该作者
谢谢分享
10#
ID:496786发表于 2019-3-23 16:22|只看该作者
你! 发表于 2018-4-22 17:02
谢谢楼主的分享

感谢楼主分享
11#
ID:502154发表于 2019-4-1 09:18|只看该作者
这个资料可以的,赞一个
12#
ID:505599发表于 2019-4-11 14:39|只看该作者
代码写的真好,看了2遍
13#
ID:352943发表于 2019-6-13 17:50|只看该作者
感谢分享,一直想找的程序
14#
ID:685149发表于 2020-3-14 15:53|只看该作者
可以可以  感谢分享
15#
ID:709719发表于 2020-4-12 20:37|只看该作者
楼主 牛b啊
16#
ID:876226发表于 2021-2-10 10:22|只看该作者
楼主能帮忙接下疑惑吗?sbit K1 = P3^2;           //功能转换按键这一部分是做声吗的?
17#
ID:846082发表于 2021-3-6 11:40|只看该作者
谢谢分享,最近正好在找这些东西!
18#
ID:889199发表于 2021-3-7 13:21|只看该作者
顶起! 谢谢楼主的分享
19#
ID:1002478发表于 2022-1-18 17:18|只看该作者
你好,有电路图吗

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

Powered by 单片机教程网