找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5197|回复: 1
收起左侧

智能四路循迹小车过直角的单片机源程序

[复制链接]
ID:242962 发表于 2017-10-25 22:23 | 显示全部楼层 |阅读模式
单片机源程序如下:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. #define Right_moto_pwm P3^0; //ENA
  5. #define Left_moto_pwm P3^1; //ENB
  6. ///////////////////////////
  7. sbit P22=P2^2; // 左前车轮
  8. sbit P23=P2^3; // 左后车轮
  9. sbit P24=P2^4; //右前车轮
  10. sbit P25=P2^5; //右后车轮
  11. ////////////////////////////////
  12. sbit P10=P1^0;//  红1外
  13. sbit P11=P1^1; //红2外
  14. sbit P12=P1^2; // 红3外
  15. sbit P13=P1^3;//红4外
  16. /////////////////////////////////
  17. sbit P20=P3^0;
  18. sbit P21=P3^1;

  19. uchar pwm_val_left =0;
  20. double push_val_left =0; //左电机占空比N/10
  21. double pwm_val_right =0;
  22. uchar push_val_right=0; //右电机占空比N/10

  23. bit Right_moto_stp=1;
  24. bit Left_moto_stp =1;
  25. double time=0;
  26. int flag=0;
  27. void stop(void)
  28. {        
  29.         P22=1;
  30.         P23=1;
  31.         P24=1;
  32.         P25=1;
  33. }
  34. void run(void)
  35. {

  36.         push_val_left =16;//PWM 调节参数1-20 1为最慢20是最快 改这个值可以改变其速度
  37.     push_val_right =16;//} //PWM 调节参数1-20 1为最慢20是最快 改这个值可以改变其速度
  38.                 P22=0;
  39.                 P23=1;
  40.                 P24=0;
  41.                 P25=1;
  42. }
  43.          
  44. void run1(void)
  45. {
  46.         push_val_left =7;
  47.         push_val_right =7;        
  48.                 P22=0;
  49.                 P23=1;
  50.                 P24=0;
  51.                 P25=1;        
  52.                         
  53. }
  54. void left(void)         //左转
  55. {         
  56.         push_val_left =20;
  57.         push_val_right =20;
  58.                 P22=1;
  59.                 P23=1;
  60.                 P24=0;
  61.                 P25=1;
  62. }
  63. void left1(void)         //左转
  64. {         
  65.         push_val_left =20;
  66.         push_val_right =19;
  67.                 P22=1;
  68.                 P23=0;
  69.                 P24=0;
  70.                 P25=1;
  71. }         
  72.         
  73. void right(void)  //右转
  74. {         
  75.         push_val_left =18;
  76.         push_val_right =18;
  77.          
  78.                 P22=0;
  79.                 P23=1;
  80.                 P24=1;
  81.                 P25=1;
  82. }
  83. void right1(void)  //右转
  84. {         
  85.         push_val_left =20;
  86.         push_val_right =19;
  87.          
  88.                 P22=0;
  89.                 P23=1;
  90.                 P24=1;
  91.                 P25=0;
  92. }
  93.          


  94. void pwm_out_left_moto(void) //左电机调速,调节push_val_left的值改变电机转速,占空比
  95. {                                                                           //右转
  96.         if(Left_moto_stp)
  97.          {
  98.          {if(pwm_val_left<=push_val_left)
  99.                  {
  100.                         P21=1;        //ENB
  101.                 }
  102.         else
  103.                   {P21=0;}
  104.          }
  105. {if(pwm_val_left>=20)

  106.   {pwm_val_left=0;}
  107.   }
  108. }

  109. else
  110. {P21=0;}
  111. }
  112. /////////////////////////////////////////////////
  113. void pwm_out_right_moto(void) //右电机调速,调节push_val_left的值改变电机转速,占空比
  114. {                                                           //左转
  115.         if(Right_moto_stp)
  116. {
  117.         if(pwm_val_right<=push_val_right)
  118. {P20=1;}
  119. else
  120. {P20=0;}

  121. if(pwm_val_right>=20)

  122. {pwm_val_right=0;}
  123. }                                                                                                                                          
  124. else
  125. {P20=0;}
  126. }

  127. void xunji()
  128. {         
  129.          
  130.         

  131.                 if(P10==0&&P11==0&&P12==0&&P13==0)
  132.                 {
  133.                    if(flag==1)
  134.                    run1();
  135.                    else
  136.                    run();
  137.                 }
  138.                 else
  139.                 if((P10==1&&P11==1&&P12==0&&P13==0)||(P10==1&&P11==1&&P12==1&&P13==0)||(P10==1&&P11==0&&P12==0&&P13==0)||(P10==0&&P11==1&&P12==0&&P13==0)) //zuozhuan
  140.                 {         if(flag==1)
  141.                         left1();                //zuozhuan
  142.                         else
  143.                         left();
  144.                 }
  145.                 else
  146.                 if((P10==0&&P11==0&&P12==0&&P13==1)||(P10==0&&P11==0&&P12==1&&P13==0)||(P10==0&&P11==0&&P12==1&&P13==1)||(P10==0&&P11==1&&P12==1&&P13==1))

  147.                 {        if(flag==1)                //youzhuan
  148.                         right1();        
  149.                         else
  150.                         right();
  151.                  }
  152.                   else
  153.                 if((P10==1&&P11==0&&P12==1&&P13==0)||(P10==0&&P11==1&&P12==0&&P13==1)||(P10==0&&P11==1&&P12==1&&P13==0)||(P10==1&&P11==0&&P12==0&&P13==1)||(P10==1&&P11==1&&P12==0&&P13==1)||(P10==1&&P11==0&&P12==1&&P13==1))
  154.                     {
  155.                            run1();
  156.                    }
  157.                    else
  158.                  if(P10==1&&P11==1&&P12==1&&P13==1)
  159.                   {
  160.                           if(flag==1)
  161.                         run1();
  162.                         else
  163.                         stop();
  164.                  }
  165. }




  166. void timer0()interrupt 1 using 2

  167. {
  168. TR1=0;
  169. TH0=0xFC; //2Ms定时


  170. TL0=0x30;



  171. pwm_val_left++;

  172. pwm_val_right++;

  173. pwm_out_left_moto();

  174. pwm_out_right_moto();
  175.   //xunji();

  176.                 if(P10==0&&P11==0&&P12==0&&P13==0)
  177.                 {
  178.                    if(flag==1)
  179.                      run1();
  180.                    else
  181.                    run();
  182.                 }
  183.                 else
  184.                 if((P10==1&&P11==1&&P12==0&&P13==0)||(P10==1&&P11==1&&P12==1&&P13==0)||(P10==1&&P11==0&&P12==0&&P13==0)||(P10==0&&P11==1&&P12==0&&P13==0)) //zuozhuan
  185.                 {         if(flag==1)
  186.                         left1();                //zuozhuan
  187.                         else
  188.                         left();
  189.                 }
  190.                 else
  191.                 if((P10==0&&P11==0&&P12==0&&P13==1)||(P10==0&&P11==0&&P12==1&&P13==0)||(P10==0&&P11==0&&P12==1&&P13==1)||(P10==0&&P11==1&&P12==1&&P13==1))

  192.                 {        if(flag==1)                //youzhuan
  193.                         right1();        
  194.                         else
  195.                         right();
  196.                  }
  197.                   else
  198.                 if((P10==1&&P11==0&&P12==1&&P13==0)||(P10==0&&P11==1&&P12==0&&P13==1)||(P10==0&&P11==1&&P12==1&&P13==0)||(P10==1&&P11==0&&P12==0&&P13==1)||(P10==1&&P11==1&&P12==0&&P13==1)||(P10==1&&P11==0&&P12==1&&P13==1))
  199.                     {
  200.                            run1();
  201.                    }
  202.                    else
  203.                  if(P10==1&&P11==1&&P12==1&&P13==1)
  204.                   {
  205.                           if(flag==1)
  206.                         run1();
  207.                         else
  208.                         stop();
  209.                  }
  210. TR1=1;



  211. }
  212. void timer1() interrupt 3
  213. {
  214.     TR1=1 ;
  215.         TH1=0xFC; //2Ms定时
  216.     TL1=0x30;

  217.     time++;
  218.    if(time<23000)
  219.    {   
  220.    flag=0;
  221.    }
  222. if(time>23000&&time<53000)
  223.    {   
  224.    flag=1;
  225.    }
  226.   if(time>53000)
  227.                 flag=0;
  228.         

  229. }  

  230. /***************************************************/

  231. void main(void)

  232. {

  233. TMOD=0X21;

  234. TH0= 0xFC; //2ms定时
  235. TL0= 0x30;
  236. TH1= 0xFC; //2ms定时
  237. TL1= 0x30;

  238. TR0= 1;
  239. ET0= 1;
  240. ET1= 1;
  241. EA = 1;

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

  243.         {

  244. //        xunji();
  245.                         
  246.                 if(P10==1&&P11==1&&P12==1&&P13==1&&flag==0)//全灭
  247.                 {                        
  248.                         stop();                                          
  249.                  }

  250.         }

  251. }


复制代码






评分

参与人数 2黑币 +80 收起 理由
逗比不逗_ + 30
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:246638 发表于 2018-4-25 20:15 | 显示全部楼层
本帖最后由 逗比不逗_ 于 2018-4-29 14:46 编辑

不错哦
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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