找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5850|回复: 3
打印 上一主题 下一主题
收起左侧

51单片机寻迹小车代码资料

[复制链接]
跳转到指定楼层
楼主
ID:316632 发表于 2019-6-19 16:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
基于51单片机循迹小车的代码,传感器为7个光电对管,前轮采用舵机转向,后轮为驱动轮,同时采用差速辅助前轮转向

单片机源程序如下:
  1. #include<reg52.h>

  2. #define u8   unsigned char
  3. #define u16  unsigned int

  4. /*************电机速度设定***********/
  5. #define speed_Left3      0
  6. #define speed_Left2      20
  7. #define speed_Left1      20
  8. #define speed_Middle     20
  9. #define speed_Right1     20
  10. #define speed_Right2     20
  11. #define speed_Right3     0

  12. /*************舵机转弯角度设定***********/
  13. #define Turn_Left3      13
  14. #define Turn_Left2      14
  15. #define Turn_Left1      17
  16. #define Middle          18
  17. #define Turn_Right1     19
  18. #define Turn_Right2     22
  19. #define Turn_Right3     23

  20. /***********电机引脚定义***************/
  21. sbit left_pwm=P1^2;                        //左电机pwm
  22. sbit left_motor0=P1^3;                   //左电机负极
  23. sbit left_motor1=P1^4;                   //左电机正极
  24. sbit right_pwm=P1^5;                //右电机pwm
  25. sbit right_motor1=P1^6;                   //右电机负极
  26. sbit right_motor0=P1^7;                   //右电机正极

  27. /***********舵机引脚定义***************/
  28. sbit servo=P0^7;          

  29. /***********光电对管引脚定义***************/
  30. sbit right_led3=P2^0;     //最右侧光电对管
  31. sbit right_led2=P2^1;     //次右侧光电对管
  32. sbit right_led1=P2^2;     //内右侧光电对管
  33. sbit middle_led=P2^3;     //中间光电对管
  34. sbit left_led1 =P2^4;     //内左侧光电对管
  35. sbit left_led2 =P2^5;     //次左侧光电对管
  36. sbit left_led3 =P2^6;     //最左侧光电对管

  37. sbit restart=P1^0;                  

  38. void motor_pwm(u8 left_compare,u8 right_compare);
  39. void servo_pwm(u8 sevor_compare);
  40. void T0_init();
  41. void led_scan();

  42. u16 flag_num=0;
  43. u8 servo_num=0;               
  44. u8 motor_num=0;                  //定时器计数
  45. u8 direction;
  46. u8 left_speed;
  47. u8 right_speed;

  48. /********************主函数***************************/
  49. void main()
  50. {
  51.   u8 n;

  52.   T0_init();
  53.   left_motor0=right_motor0=0;
  54.   left_motor1=right_motor1=1;        //电机正转
  55.   restart=0;

  56.   while(1)
  57.   {
  58.     led_scan();
  59.          for(servo_num=0,motor_num=0,n=0;n<1;)
  60.          {
  61.           servo_pwm(direction);
  62.             motor_pwm(left_speed,right_speed);
  63.           if(servo_num>=200) n++;
  64.          }
  65.    
  66.   }
  67. }

  68. /*********************定时器0和1初始化函数*********************************/
  69. void T0_init()
  70. {
  71.   TMOD=0X11;                           //定时器0和1方式1:16位定时器/计数器
  72.   TH0=(65536-100)/256;           //设置计数器0的高8位
  73.   TL0=(65536-100)%256;           //设置计数器0的低8位
  74.   TH1=(65536-10000)/256;           //设置计数器1的高8位
  75.   TL1=(65536-10000)%256;           //设置计数器1的低8位
  76.   EA=1;                                           //全局中断使能
  77.   ET0=1;                                   //定时器0中断使能
  78.   ET1=1;                                   //定时器1中断使能
  79.   TR0=1;                                   //定时器0使能
  80.   TR1=0;                                   //定时器1失能
  81. }
  82. /*********************定时器0中断服务函数*******************************/
  83. void T0_time() interrupt 1  //每0.1ms加1
  84. {
  85.   TH0=(65536-100)/256;
  86.   TL0=(65536-100)%256;
  87.   servo_num++;
  88.   motor_num++;
  89. }

  90. /*********************定时器1中断服务函数*******************************/
  91. void T1_time() interrupt 3  //每10ms加1
  92. {
  93.   TH1=(65536-10000)/256;
  94.   TL1=(65536-10000)%256;
  95.   flag_num++;
  96. }
  97. /*****************舵机PWM函数*************************/
  98. void servo_pwm(u8 compare1)
  99. {
  100.   if(servo_num<compare1)   servo=1;     //高电平持续时间t=compare1*0.1 ms
  101.   else if(servo_num<200)   servo=0;             
  102. }


  103. /*****************电机PWM函数*************************/
  104. void motor_pwm(u8 left_compare,u8 right_compare)
  105. {
  106.   if(motor_num<left_compare)    left_pwm=1;
  107.   else if(motor_num<100)        left_pwm=0;                //左电机占空比

  108.   if(motor_num<right_compare)   right_pwm=1;
  109.   else if(motor_num<100)        right_pwm=0;        //右电机占空比

  110.   if(motor_num>=100)   motor_num=0;             
  111. }


  112. /*************光电对管扫描函数***************************/
  113. void led_scan()
  114. {
  115.   u8 n=0;
  116.   static u8 white_num=0;
  117.   static u8 stop=0;

  118.   if(restart==1)  stop=0;
  119.   if(stop==0)
  120.   {
  121. /********************中间光电对管检测到黑线则直行**********************/
  122.         if(middle_led==1)
  123.           { direction=Middle; left_speed=speed_Middle; right_speed=speed_Middle; n++;
  124.            left_motor0=right_motor0=0;
  125.        left_motor1=right_motor1=1;
  126.       }
  127.           
  128. /**************最右(左)边光电对管检测到黑线则大左转*********************/            
  129.     else if(right_led3==1)
  130.           { direction=Turn_Right3; left_speed=speed_Middle; right_speed=speed_Right3; n++;
  131.             left_motor0=right_motor1=0;
  132.         left_motor1=right_motor0=1;
  133.            }  

  134.     else if(left_led3==1)  
  135.           { direction=Turn_Left3; left_speed=speed_Left3; right_speed=speed_Middle;   n++;
  136.           left_motor1=right_motor0=0;
  137.       left_motor0=right_motor1=1;
  138.           }  

  139. /**************次右(左)边光电对管检测到黑线则次左转*********************/
  140.     else if(right_led2==1)
  141.           { direction=Turn_Right2; left_speed=speed_Middle; right_speed=speed_Right2; n++;
  142.           left_motor0=right_motor0=0;
  143.       left_motor1=right_motor1=1;
  144.      }
  145.             
  146.     else if(left_led2==1)  
  147.          { direction=Turn_Left2;  left_speed=speed_Left2; right_speed=speed_Middle;  n++;
  148.           left_motor0=right_motor0=0;
  149.       left_motor1=right_motor1=1;
  150.          }
  151.                    
  152. /**************内右(左)边光电对管检测到黑线则小左转*********************/
  153.     else if(right_led1==1)
  154.           { direction=Turn_Right1; left_speed=speed_Middle; right_speed=speed_Right1; n++;
  155.                   left_motor0=right_motor0=0;
  156.         left_motor1=right_motor1=1;
  157.            }

  158.     else if(left_led1==1)  
  159.           { direction=Turn_Left1;  left_speed=speed_Left1; right_speed=speed_Middle;  n++;
  160.             left_motor0=right_motor0=0;
  161.         left_motor1=right_motor1=1;
  162.           }
  163.           


  164.           
  165.   }

  166. ///**************************检测是否应该停车********************************/
  167. //  if(n>=4)                //如果3个以上的光电对管检测到黑线
  168. //  {
  169. //        TR1=1;                                   //定时器1使能
  170. //            
  171. //  }
  172. //  if(flag_num>2&&flag_num<12)
  173. //  {
  174. //    if(n!=0)   white_num=0;
  175. //    if(n==0)   
  176. //    {         
  177. //      white_num++;         
  178. //          if(white_num>=3) { left_speed=left_speed=0;        stop=1;          }
  179. //    }   
  180. //  }
  181. //  else if(flag_num>=12)
  182. //  {
  183. //        TR1=0;                                   //定时器1失能   
  184. //        flag_num=0;
  185. //        white_num=0;
  186. //  }
  187. // /*************************************************/


  188. }
复制代码

所有资料51hei提供下载:
寻迹小车代码.zip (101.46 KB, 下载次数: 48)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:1 发表于 2019-6-20 04:16 | 只看该作者
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

板凳
ID:253767 发表于 2019-6-20 07:05 | 只看该作者
谢谢分享!!!
回复

使用道具 举报

地板
ID:1033602 发表于 2022-6-9 19:54 | 只看该作者
666正是我需要的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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