找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 13027|回复: 18
收起左侧

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

  [复制链接]
ID:311115 发表于 2018-4-22 11:02 | 显示全部楼层 |阅读模式
分享一下我的作品。下面是制作出来的实物图:
822005372859072152.jpg

单片机源程序如下:
  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, 下载次数: 578)

评分

参与人数 2黑币 +55 收起 理由
你! + 5 绝世好帖!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:311135 发表于 2018-4-22 17:02 | 显示全部楼层
谢谢楼主的分享
回复

使用道具 举报

ID:321800 发表于 2018-5-4 08:42 | 显示全部楼层
谢谢楼主分享,在做毕设
回复

使用道具 举报

ID:391828 发表于 2018-9-3 17:25 | 显示全部楼层
魔术手方案代码设计的比较巧妙
回复

使用道具 举报

ID:398851 发表于 2018-9-17 09:32 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:418963 发表于 2018-11-1 10:22 | 显示全部楼层
谢谢分享,真的很棒
回复

使用道具 举报

ID:437935 发表于 2018-12-10 20:34 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:494420 发表于 2019-3-20 08:50 | 显示全部楼层
楼主可否私发一下,我这新号没币。。。。。!1041371533@qq.com     万分感谢!!!
回复

使用道具 举报

ID:496392 发表于 2019-3-22 23:32 | 显示全部楼层
楼主可否私发一下,我这新号没币。。。。。!2658376041@qq.com     万分感谢!!!
回复

使用道具 举报

ID:496786 发表于 2019-3-23 16:22 | 显示全部楼层
你! 发表于 2018-4-22 17:02
谢谢楼主的分享

感谢楼主分享
回复

使用道具 举报

ID:502154 发表于 2019-4-1 09:18 | 显示全部楼层
这个资料可以的,赞一个
回复

使用道具 举报

ID:505599 发表于 2019-4-11 14:39 | 显示全部楼层
代码写的真好,看了2遍
回复

使用道具 举报

ID:352943 发表于 2019-6-13 17:50 | 显示全部楼层
感谢分享,一直想找的程序
回复

使用道具 举报

ID:685149 发表于 2020-3-14 15:53 | 显示全部楼层
可以可以  感谢分享
回复

使用道具 举报

ID:709719 发表于 2020-4-12 20:37 | 显示全部楼层
楼主 牛b啊
回复

使用道具 举报

ID:876226 发表于 2021-2-10 10:22 | 显示全部楼层
楼主能帮忙接下疑惑吗?sbit K1 = P3^2;                  //功能转换按键这一部分是做声吗的?
回复

使用道具 举报

ID:846082 发表于 2021-3-6 11:40 | 显示全部楼层
谢谢分享,最近正好在找这些东西!
回复

使用道具 举报

ID:889199 发表于 2021-3-7 13:21 | 显示全部楼层
顶起! 谢谢楼主的分享
回复

使用道具 举报

ID:1002478 发表于 2022-1-18 17:18 | 显示全部楼层
你好,有电路图吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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