找回密码
 立即注册

QQ登录

只需一步,快速开始

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

我的单片机pwm寻迹小车源程序

[复制链接]
跳转到指定楼层
楼主
ID:242216 发表于 2017-10-23 20:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. #include<reg52.h>
  2. #define uint unsigned int
  3. #define uchar unsigned char

  4. sbit Z1=P2^0;  //左电机前进
  5. sbit Z2=P2^1;  //左电机后退
  6. sbit Y1=P2^2;  //右电机前进
  7. sbit Y2=P2^3;  //右电机后退
  8. sbit ENA=P0^0;
  9. sbit ENB=P0^1;
  10. sbit L1=P1^0;        //左1
  11. sbit L2=P1^1;        //左2
  12. sbit R1=P1^2;        //右1
  13. sbit R2=P1^3;        //右2
  14. double a=0;
  15. int aa=0,d=0,c=0;
  16. uchar b,bb;
  17. uchar pwm_val_left =0;

  18. double push_val_left =0; //左电机占空比N/10

  19. uchar pwm_val_right =0;

  20. double push_val_right=0; //右电机占空比N/10

  21. bit Right_moto_stp=1;

  22. bit Left_moto_stp =1;



  23. void run1(void) //前进函数

  24. {

  25. push_val_left =5.5; //PWM 调节参数1-20 1为最慢20是最快 改这个值可以改变其速度



  26. push_val_right =5.5; //PWM 调节参数1-20 1为最慢20是最快 改这个值可以改变其速度

  27. Z1=0;Z2=1;
  28. Y1=0;Y2=1;



  29. }
  30. void run(void) //前进函数
  31. {
  32. push_val_left =20; //PWM 调节参数1-20 1为最慢20是最快 改这个值可以改变其速度
  33. push_val_right =20; //PWM 调节参数1-20 1为最慢20是最快 改这个值可以改变其速度
  34. Z1=0;Z2=1;
  35. Y1=0;Y2=1;
  36. }
  37. void run2(void) //前进函数
  38. {
  39. push_val_left =9; //PWM 调节参数1-20 1为最慢20是最快 改这个值可以改变其速度
  40. push_val_right =9; //PWM 调节参数1-20 1为最慢20是最快 改这个值可以改变其速度
  41. Z1=0;Z2=1;
  42. Y1=0;Y2=1;
  43. }

  44. void left(void) //直角左转函数

  45. {

  46. push_val_left =18;

  47. push_val_right =18;

  48.         Z1=1;Z2=0;
  49.         Y1=0;Y2=1;

  50. }
  51. void left1(void) //左转函数

  52. {

  53. push_val_left =16;
  54.                                  
  55. push_val_right =16;

  56.         Z1=1;Z2=0;
  57.         Y1=0;Y2=1;

  58. }
  59. void left2(void) //小左转函数

  60. {

  61. push_val_left =19;
  62.                                  
  63. push_val_right =19;

  64.         Z1=1;Z2=1;
  65.         Y1=0;Y2=1;

  66. }
  67. void right(void) //直角右转函数

  68. {

  69. push_val_left =18;

  70. push_val_right =18;

  71. Z1=0;Z2=1;

  72. Y1=1;Y2=0;

  73. }
  74. void right1(void) //右转函数

  75. {

  76. push_val_left =16;

  77. push_val_right =16;

  78. Z1=0;Z2=1;

  79. Y1=1;Y2=0;
  80. }
  81. void right2(void) //小右转函数

  82. {

  83. push_val_left =19;

  84. push_val_right =19;

  85. Z1=0;Z2=1;

  86. Y1=1;Y2=1;
  87. }
  88. void stop(void)

  89. {
  90. Z1=1;Z2=1;

  91. Y1=1;Y2=1;


  92. }




  93. void pwm_out_left_moto(void) //左电机调速,调节push_val_left的值改变电机转速,占空比

  94. {

  95. if(Left_moto_stp)

  96. {                                                                           
  97. {if(pwm_val_left<=push_val_left)

  98. { ENB=1;}

  99. else

  100.   {ENB=0;}
  101.   }
  102. {if(pwm_val_left>=20)

  103.   {pwm_val_left=0;}
  104.   }
  105. }

  106. else

  107. {ENB=0;}

  108. }



  109. void pwm_out_right_moto(void) //右电机调速,调节push_val_left的值改变电机转速,占空比

  110. {

  111. if(Right_moto_stp)

  112. {

  113. if(pwm_val_right<=push_val_right)

  114. {ENA=1;}

  115. else

  116. {ENA=0;}

  117. if(pwm_val_right>=20)

  118. {pwm_val_right=0;}

  119. }

  120. else

  121. {ENA=0;}

  122. }



  123. void xunji()
  124. {
  125.                  if(L1==1&&L2==1&&R1==1&&R2==1)
  126.                 a++;

  127.                 if(L1==0&&L2==0&&R1==0&&R2==0)                 
  128.                 {run();aa++;}
  129.                 if((L1==1&&L2==0&&R1==0&&R2==0)||(L1==1&&L2==1&&R1==1&&R2==0)||(L1==1&&L2==1&&R1==0&&R2==0))
  130.                 left1();
  131.                 if((L1==0&&L2==0&&R1==0&&R2==1)||(L1==0&&L2==1&&R1==1&&R2==1)||(L1==0&&L2==0&&R1==1&&R2==1))
  132.                 right1();
  133.                 if(L1==0&&L2==1&&R1==0&&R2==0)          left2();
  134.                 if(L1==0&&L2==0&&R1==1&&R2==0)          right2();
  135.                 if((L1==1&&L2==1&&R1==1&&R2==1)&&a>=100)
  136.                 {
  137.                         stop();          a=0;
  138.                 }
  139.                 if(aa>=13000)         { bb=1; aa=0;         }
  140.                 while(bb==1)
  141.                 {
  142.                
  143.                 if(L1==0&&L2==0&&R1==0&&R2==0)                 run2();
  144.                 if((L1==1&&L2==0&&R1==0&&R2==0)||(L1==1&&L2==1&&R1==1&&R2==0)||(L1==1&&L2==1&&R1==0&&R2==0))
  145.                 left1();
  146.                 if((L1==0&&L2==0&&R1==0&&R2==1)||(L1==0&&L2==1&&R1==1&&R2==1)||(L1==0&&L2==0&&R1==1&&R2==1))
  147.                 right1();
  148.                 if(L1==0&&L2==1&&R1==0&&R2==0)          {left2();aa++;}
  149.                 if(L1==0&&L2==0&&R1==1&&R2==0)          {right2();aa++;}
  150.                 while(aa>=700)
  151.                 {
  152.                 if(L1==0&&L2==0&&R1==0&&R2==0)                 
  153.                 run();
  154.                 if((L1==1&&L2==0&&R1==0&&R2==0)||(L1==1&&L2==1&&R1==1&&R2==0)||(L1==1&&L2==1&&R1==0&&R2==0))
  155.                 left1();
  156.                 if((L1==0&&L2==0&&R1==0&&R2==1)||(L1==0&&L2==1&&R1==1&&R2==1)||(L1==0&&L2==0&&R1==1&&R2==1))
  157.                 right1();
  158.                 if(L1==0&&L2==1&&R1==0&&R2==0)          {left2();}
  159.                 if(L1==0&&L2==0&&R1==1&&R2==0)          right2();
  160.                 if(L1==1&&L2==1&&R1==1&&R2==1)    a++;
  161.                                 if((a>=60))
  162.                 {
  163.                         b=1;
  164.                 }
  165.                 while(b==1)
  166.                 {
  167.                         if(L1==0&&L2==0&&R1==0&&R2==0)                 
  168.                         run1();
  169.                         if((L1==1&&L2==0&&R1==0&&R2==0)||(L1==1&&L2==1&&R1==1&&R2==0)||(L1==1&&L2==1&&R1==0&&R2==0))
  170.                         left();
  171.                         if((L1==0&&L2==0&&R1==0&&R2==1)||(L1==0&&L2==1&&R1==1&&R2==1)||(L1==0&&L2==0&&R1==1&&R2==1))
  172.                         right();
  173.                         if(L1==0&&L2==1&&R1==0&&R2==0)          {left2();        c++;}
  174.                     if(L1==0&&L2==0&&R1==1&&R2==0)          {right2();d++;}

  175.                         while(c+d>=15000)
  176.                         {
  177.                                 if(L1==0&&L2==0&&R1==0&&R2==0)         run();
  178.                                 if((L1==1&&L2==0&&R1==0&&R2==0)||(L1==1&&L2==1&&R1==1&&R2==0)||(L1==1&&L2==1&&R1==0&&R2==0))
  179.                                 left1();
  180.                                 if((L1==0&&L2==0&&R1==0&&R2==1)||(L1==0&&L2==1&&R1==1&&R2==1)||(L1==0&&L2==0&&R1==1&&R2==1))
  181.                                 right1();
  182.                                 if(L1==0&&L2==1&&R1==0&&R2==0)          left2();
  183.                                 if(L1==0&&L2==0&&R1==1&&R2==0)          right2();
  184.                                 if(L1==1&&L2==1&&R1==1&&R2==1)          stop();
  185.                         }

  186.                         if((L1==1&&L2==1&&R1==1&&R2==1))
  187.                 {
  188.                         stop();          a=0;
  189.                 }

  190.                 }
  191.                
  192.                 }

  193.                 }










  194. //                if((a>=60))
  195. //                {
  196. //                        b=1;
  197. //                }
  198. //                while(b==1)
  199. //                {
  200. //                        if(L1==0&&L2==0&&R1==0&&R2==0)                 
  201. //                        run1();
  202. //                        if((L1==1&&L2==0&&R1==0&&R2==0)||(L1==1&&L2==1&&R1==1&&R2==0)||(L1==1&&L2==1&&R1==0&&R2==0))
  203. //                        left();
  204. //                        if((L1==0&&L2==0&&R1==0&&R2==1)||(L1==0&&L2==1&&R1==1&&R2==1)||(L1==0&&L2==0&&R1==1&&R2==1))
  205. //                        right();
  206. //                        if(L1==0&&L2==1&&R1==0&&R2==0)          {left2();        c++;}
  207. //                    if(L1==0&&L2==0&&R1==1&&R2==0)          {right2();d++;}
  208. //
  209. //                        while(c+d>=15000)
  210. //                        {
  211. //                                if(L1==0&&L2==0&&R1==0&&R2==0)         run();
  212. //                                if((L1==1&&L2==0&&R1==0&&R2==0)||(L1==1&&L2==1&&R1==1&&R2==0)||(L1==1&&L2==1&&R1==0&&R2==0))
  213. //                                left1();
  214. //                                if((L1==0&&L2==0&&R1==0&&R2==1)||(L1==0&&L2==1&&R1==1&&R2==1)||(L1==0&&L2==0&&R1==1&&R2==1))
  215. //                                right1();
  216. //                                if(L1==0&&L2==1&&R1==0&&R2==0)          left2();
  217. //                                if(L1==0&&L2==0&&R1==1&&R2==0)          right2();
  218. //                                if(L1==1&&L2==1&&R1==1&&R2==1)          stop();
  219. //                        }
  220. //
  221. //                        if((L1==1&&L2==1&&R1==1&&R2==1))
  222. //                {
  223. //                        stop();          a=0;
  224. //                }
  225. //
  226. //                }
  227.                         
  228.         
  229.                         
  230. }
  231. /***********TIMER0中断服务子函数产生PWM信号**********/

  232. void timer0()interrupt 1 using 2

  233. {

  234. TH0=0XFC; //2Ms定时

  235. TL0=0X30;

  236. pwm_val_left++;

  237. pwm_val_right++;

  238. pwm_out_left_moto();

  239. pwm_out_right_moto();

  240. }

  241. /***************************************************/

  242. void main(void)

  243. {

  244. TMOD=0X01;

  245. TH0= 0XFC; //2ms定时

  246. TL0= 0X30;                                                                 

  247. TR0= 1;

  248. ET0= 1;

  249. EA = 1;

  250. while(1) /*无限循环*/

  251. {

  252. xunji();
  253. }

  254. }
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:242625 发表于 2017-10-24 22:52 | 只看该作者
楼主能分享一下电路图吗?
回复

使用道具 举报

板凳
ID:250071 发表于 2017-11-16 15:42 | 只看该作者
楼主有电路图吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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