找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1996|回复: 3
收起左侧

小车直线行驶单片机编程

[复制链接]
ID:583531 发表于 2019-7-13 16:19 | 显示全部楼层 |阅读模式
小车直线行驶编程部分

单片机源程序如下:
  1. #include "REG52.H"
  2. #include <intrins.h>   //包含nop等系统函数
  3. #include <stdio.h>

  4. #define uint unsigned int
  5. #define uchar unsigned char



  6. //按键引脚定义
  7. sbit key = P2^0;

  8. //定义电机引脚
  9. sbit Left_motor_go=P2^4;           //左电机前进AIN2
  10. sbit Left_motor_back=P2^3;           //左电机后退AIN1
  11. sbit Right_motor_go=P2^1;           //右电机前进BIN2
  12. sbit Right_motor_back=P2^2;           //右电机后退BIN1

  13. sbit TrackSensorLeftPin2  =  P1^1;   
  14. sbit TrackSensorLeftPin1  =  P1^0;   
  15. sbit TrackSensorRightPin1 =  P1^2;   
  16. sbit TrackSensorRightPin2 =  P1^3;  

  17. //红外传感器采集的数据变量
  18. uchar SensorValue1;
  19. uchar SensorValue2;
  20. uchar SensorValue3;
  21. uchar SensorValue4;

  22. //定义角度值
  23. int myangle = 0;//舵机角度定义
  24. int servo_p = 0;

  25. //定义舵机引脚
  26. sbit ServoPin=P0^6;

  27. uchar pwm_val_left  =0;//变量定义
  28. uchar pwm_val_right =0;
  29. uchar set_pwm_val_left = 0;
  30. uchar set_pwm_val_right = 0;

  31. sbit LED1 = P2^5;
  32. sbit LED2 = P2^6;

  33. /*
  34. *   毫秒级延时
  35. */
  36. void delay(uint xms)                               
  37. {
  38.         uint i,j;
  39.         for(i=xms;i>0;i--)                     
  40.                 for(j=120;j>0;j--);
  41. }



  42. /*
  43. *   舵机函数
  44. */
  45. void set_angle(int angle)
  46. {
  47.     if(angle > 18)
  48.         angle = 18;
  49.     if(angle < 8)
  50.         angle = 8;
  51.     myangle = angle;
  52. }

  53. /*
  54. *   电机运行程序,仅支持电机正转
  55. */
  56. void run(uchar left_speed,uchar right_speed)
  57. {
  58.     if(left_speed >100)
  59.         left_speed = 100;
  60.     if(right_speed >100)
  61.         right_speed = 100;
  62.         set_pwm_val_left = left_speed;
  63.         set_pwm_val_right = right_speed;
  64.           return;
  65. }

  66. /*
  67. *   传感器值获取函数,将引脚值赋值给变量以防止误写引脚状态。
  68. */
  69. void get_sensor(void)
  70. {
  71.     SensorValue1 = TrackSensorLeftPin1;
  72.     SensorValue2 = TrackSensorLeftPin2;
  73.     SensorValue3 = TrackSensorRightPin1;
  74.     SensorValue4 = TrackSensorRightPin2;   
  75. }

  76. /*
  77. *   发车按键,调用此函数,若按键未按下,则程序一直死在此函数
  78. */
  79. void key_scan(void)
  80. {
  81.         while (key!=0);       //当按键没有被按下一直循环
  82.           while (key==0)        //当按键被按下时
  83.           {
  84.             delay(10);                //延时10ms
  85.             if (key==0)         //第二次判断按键是否被按下
  86.             {   
  87.                       delay(100);   
  88.                       while (key==0);   //判断按键是否被松开   
  89.             }   
  90.           }
  91. }

  92. /*
  93. *   初始化函数
  94. */
  95. void init(void)
  96. {
  97.     //定时器0控制车速
  98.     TMOD|=0X01;  //定时器0工作方式1
  99.     TH0=0XFF;    //100us定时,装入初值
  100.     TL0=0XA3;
  101.     TR0=1;                 //启动T0工作
  102.     ET0=1;                 //允许T0中断
  103.     EA =1;             //开总中断
  104.    
  105.     //舵机引脚初始化为高电平
  106.     Left_motor_back = 0;    //关反向电桥
  107.     Right_motor_back = 0;   
  108.    
  109.     ServoPin=1; //舵机电平拉高

  110.     set_angle(13);  //舵机初始状态对正
  111. }

  112. /*
  113. *   方波生成逻辑
  114. */
  115. void timer0() interrupt 1  
  116. {
  117.         TH0=0XFF;                         //100Us定时
  118.         TL0=0XA3;
  119.         servo_p++;
  120.         //舵机处理部分
  121.         if(servo_p <= myangle)
  122.         {
  123.                 ServoPin=1;
  124.         }               
  125.         else if(servo_p < 200)
  126.         {
  127.                 ServoPin=0;
  128.         }
  129.         else
  130.         {
  131.                 servo_p = 0;
  132.         }
  133.         pwm_val_left++;
  134.         if(pwm_val_left<set_pwm_val_left)
  135.         {
  136.                 Left_motor_go = 1;
  137.         }
  138.         else if(pwm_val_left<100)
  139.         {
  140.                 Left_motor_go = 0;
  141.         }
  142.         else
  143.         {
  144.                 pwm_val_left = 0;
  145.         }

  146.         pwm_val_right++;
  147.         if(pwm_val_right<set_pwm_val_right)
  148.         {
  149.                 Right_motor_go = 1;
  150.         }
  151.         else if(pwm_val_right<100)
  152.         {
  153.                 Right_motor_go = 0;
  154.         }
  155.         else
  156.         {
  157.                 pwm_val_right = 0;
  158.         }
  159. }





  160. //简单实现循迹样例
  161. void sensor_adjust(void)
  162. {
  163.     //更新传感器状态,必须有
  164.     get_sensor();

  165.     if((SensorValue2 == 1)&&(SensorValue3 == 1))
  166.     {
  167.         set_angle(13);
  168.     }
  169.             if((SensorValue2 == 1)&&(SensorValue3 == 1)&&(SensorValue1 == 1)&&(SensorValue4 == 1))
  170.     {
  171.         set_angle(13);
  172.                 run(0,0);
  173.     }

  174.     if(SensorValue1 == 1)
  175.     {
  176.         if(SensorValue2 == 1)
  177.             set_angle(12);
  178.         else
  179.             set_angle(11);
  180.     }
  181.     else if(SensorValue2 == 1)
  182.     {
  183.         set_angle(12);
  184.     }
  185.     else if(SensorValue3 == 1)
  186.     {
  187.         set_angle(14);
  188.     }
  189.     else if(SensorValue4 == 1)
  190.     {
  191.         if(SensorValue3 == 1)
  192.             set_angle(13);
  193.         else
  194.             set_angle(14);
  195.     }
  196. }


  197. void main()
  198. {
  199.     init();
  200.     key_scan();
  201.         run(35,35);
  202.         //调用按键扫描函数
  203.     while(1)
  204.     {               
  205.                 sensor_adjust();
  206.         }
  207. }
复制代码

程序51hei提供下载:
第三.zip (31.16 KB, 下载次数: 6)
回复

使用道具 举报

ID:1 发表于 2019-7-13 23:40 | 显示全部楼层
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

ID:363259 发表于 2019-10-9 09:34 | 显示全部楼层
学习参考一下
回复

使用道具 举报

ID:622547 发表于 2019-10-11 20:52 | 显示全部楼层
学习了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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