找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 15219|回复: 19
收起左侧

循迹+pwm调速的小车源程序

  [复制链接]
ID:242950 发表于 2017-10-27 22:28 | 显示全部楼层 |阅读模式
小车的单片机源程序如下:
  1. #include<reg52.h>
  2. ////////////电机转动
  3. sbit P30=P2^0;
  4. sbit P31=P2^1;
  5. sbit P32=P2^2;
  6. sbit P33=P2^3;
  7. /////////pwm调试使能端
  8. sbit ENA=P0^0;
  9. sbit ENB=P0^1;
  10. ////////////四路循迹
  11. sbit P10=P1^7;
  12. sbit P11=P1^6;
  13. sbit P12=P1^5;
  14. sbit P13=P1^4;
  15. ////////////////
  16. #define Right_moto_pwm P0^0 //接驱动模块ENA使能端输入PWM信号调节速度

  17. void delay(unsigned int t); //函数声明

  18. #define Left_moto_pwm P0^1 //接驱动模块ENB使能端输入PWM信号调节速度

  19. void Init_Timer0(void);//定时器初始化
  20.   
  21. ///////////////定义电机转动方向                                                                                                         
  22. #define Left_moto_back {P30=1,P31=0;} //左电机后退

  23. #define Left_moto_go {P30=0,P31=1;} //左电机前进

  24. #define Left_moto_stop {P30=1,P31=1;} //左电机停转

  25. #define Right_moto_back {P32=1,P33=0;} //右电机后退

  26. #define Right_moto_go {P32=0,P33=1;} //右电机前转

  27. #define Right_moto_stop {P32=1,P33=1;} //右电机停转

  28. //////////////////////////////

  29. #define uchar unsigned char

  30. #define uint unsigned int

  31. /////////////////////////////
  32. uchar pwm_val_left =0;

  33. uchar push_val_left =0; //左电机占空比N/10

  34. uchar pwm_val_right =0;

  35. uchar push_val_right=0; //右电机占空比N/10

  36. bit Right_moto_stp=1;

  37. bit Left_moto_stp =1;
  38. uint num,i,d,j=0;

  39. /****************************************************************

  40. ********/

  41. void run(void) //前进函数

  42. {

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

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



  45. Left_moto_go ; //左电机前进

  46. Right_moto_go ; //右电机前进


  47. }

  48. void run1(void)//前进函数1

  49. {

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



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



  52. Left_moto_go ; //左电机前进

  53. Right_moto_go ; //右电机前进


  54. }
  55. void run2(void)//前进函数1

  56. {

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



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



  59. Left_moto_go ; //左电机前进

  60. Right_moto_go ; //右电机前进


  61. }

  62. /****************************************************************

  63. ********/

  64. void left(void) //左转函数

  65. {

  66. push_val_left =19;

  67. push_val_right =19;

  68. Right_moto_go; //右电机继续

  69. Left_moto_stop; //左电机停走

  70. }

  71. void left1(void) //左转函数        1

  72. {

  73. push_val_left =20;

  74. push_val_right =20;

  75. Right_moto_go; //右电机继续

  76. Left_moto_stop; //左电机停走

  77. }


  78. /***************************************  *********************************/

  79. void right(void) //右转函数

  80. {

  81. push_val_left =19;
  82.                                  
  83. push_val_right =19;

  84. Right_moto_stop; //右电机停走

  85. Left_moto_go; //左电机继续

  86. }

  87. void right1(void) //右转函数1

  88. {

  89. push_val_left =20;

  90. push_val_right =20;

  91. Right_moto_stop; //右电机停走

  92. Left_moto_go; //左电机继续

  93. }

  94. ///////////////////////////////////////////////////////////////停止

  95. void stop(void)

  96. {

  97. Right_moto_stop; //右电机停走

  98. Left_moto_stop; //左电机停走



  99. //run();
  100. //
  101. //Delayms(100);

  102. }

  103. ///////////////////////////////////////////

  104. void zzhijiao()
  105. {

  106.    push_val_left =19;
  107.    
  108.    push_val_right =19;       
  109.    
  110.    Left_moto_go ; //左电机前进
  111.    
  112.    Right_moto_back ;
  113.                                                  }
  114. ///////////////////////////////////////
  115. void yzhijiao()
  116. {       
  117.   push_val_left =19;

  118.   push_val_right =19;
  119.   
  120.   Left_moto_back ; //左电机前进
  121.       
  122.   Right_moto_go ;}
  123. /*************************PWM调 制 电 机 转 速

  124. ********************************/

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



  126. {

  127. if(Left_moto_stp)

  128. {
  129. {if(pwm_val_left<=push_val_left)

  130. { ENB=1;}

  131. else

  132.   {ENB=0;}
  133.   }
  134. {if(pwm_val_left>=20)

  135.   {pwm_val_left=0;}
  136.   }
  137. }

  138. else

  139. {ENB=0;}

  140. }


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



  142. {

  143. if(Right_moto_stp)

  144. {

  145. if(pwm_val_right<=push_val_right)

  146. {ENA=1;}

  147. else

  148. {ENA=0;}

  149. if(pwm_val_right>=20)

  150. {pwm_val_right=0;}

  151. }

  152. else

  153. {ENA=0;}
  154.        
  155. }

  156. /***************************************************/

  157. void xunji()

  158. {        
  159.            uchar a=0,b=0;
  160.                                                                                                                                                                                                                

  161.       if(   P10==1&&P11==1&&P12==1&&P13==1)
  162.                 {            
  163.                         i++;
  164.                                             }
  165.       if( P10==0&&P11==0&&P12==0&&P13==0)
  166.         {
  167.                  run();
  168.                                  }   
  169.       if( P10==0&&P11==0&&P12==1&&P13==0||P10==0&&P11==0&&P12==0&&P13==1)
  170.         {          
  171.                   right();
  172.                                    }
  173.       if(          P10==0&&P11==1&&P12==0&&P13==0||P10==1&&P11==0&&P12==0&&P13==0)
  174.                  {  
  175.                       left();
  176.                                     }          
  177.           if(   P10==1&&P11==1&&P12==1&&P13==1&&i>=500)   //600
  178.                  {
  179.                         j++;
  180.                                             }

  181.    while(j==2)

  182.     {           
  183.         if( P10==0&&P11==0&&P12==0&&P13==0)
  184.            {
  185.                  run1();
  186.                                  }   
  187.                                                                
  188.             if(        P10==0&&P11==0&&P12==1&&P13==0||P10==0&&P11==0&&P12==0&&P13==1)
  189.                         {       
  190.                           right();
  191.                                     }
  192.             if( P10==1&&P11==1&&P12==0&&P13==0||P10==1&&P11==1&&P12==1&&P13==0)
  193.                          {
  194.                           
  195.                          yzhijiao();
  196.                          a++;
  197.                                       }
  198.                  if( P10==0&&P11==0&&P12==1&&P13==1||P10==0&&P11==1&&P12==1&&P13==1)
  199.                          {
  200.                           zzhijiao();
  201.               d++;
  202.                
  203.                          }
  204.          if(   P10==0&&P11==1&&P12==0&&P13==0||P10==1&&P11==0&&P12==0&&P13==0)
  205.                                          {        left();}
  206.       
  207.       

  208.                    if(a+d>=2400)
  209.             {
  210.                  if( P10==0&&P11==0&&P12==0&&P13==0)
  211.           {
  212.                  run2();
  213.                                  }   
  214.         if( P10==0&&P11==0&&P12==1&&P13==0||P10==0&&P11==0&&P12==0&&P13==1)
  215.           {          
  216.                   right1();
  217.                                    }
  218.         if(          P10==0&&P11==1&&P12==0&&P13==0||P10==1&&P11==0&&P12==0&&P13==0)
  219.                 {  
  220.                       left1();
  221.                                     }          
  222.            if(   P10==1&&P11==1&&P12==1&&P13==1)   //600
  223.                      {
  224.                          stop();
  225.                                             
  226.                                         }
  227.                                                 }
  228.                                          }
  229.          
  230.                           
  231.                                      }
  232.                                           



  233. /***********TIMER0中断服务子函数产生PWM信号**********/

  234. void Init_Timer0()interrupt 1 using 2

  235. {


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

  237. TL0=0X30;

  238.                
  239. ……………………

  240. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
循迹小车.rar (24.16 KB, 下载次数: 487)

评分

参与人数 4黑币 +65 收起 理由
为之则易 + 8 淡定
147wzl + 2 共享资料的黑币奖励!
kikiikllll + 5 很给力!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:244394 发表于 2017-10-30 22:36 | 显示全部楼层
收藏额   谢谢楼主
回复

使用道具 举报

ID:275384 发表于 2018-1-16 22:25 | 显示全部楼层
完全解决燃眉之急
回复

使用道具 举报

ID:338048 发表于 2018-5-25 14:28 | 显示全部楼层
代码非常清楚,解决了我对于pwm调速的疑问
回复

使用道具 举报

ID:404723 发表于 2018-11-6 20:07 | 显示全部楼层
十分感谢 , 写的非常清楚明了   谢谢谢谢
回复

使用道具 举报

ID:412832 发表于 2018-12-1 14:48 | 显示全部楼层
刚好需要 谢谢楼主
回复

使用道具 举报

ID:412832 发表于 2018-12-1 16:29 | 显示全部楼层
val是什么意思呢
回复

使用道具 举报

ID:421579 发表于 2018-12-4 10:44 | 显示全部楼层
谢谢源代码,,。
回复

使用道具 举报

ID:458115 发表于 2018-12-29 15:46 | 显示全部楼层
厉害了
回复

使用道具 举报

ID:478732 发表于 2019-2-21 11:22 | 显示全部楼层
代码写的很可以,谢谢大佬相助
回复

使用道具 举报

ID:509968 发表于 2019-4-11 20:37 | 显示全部楼层
真好啊
回复

使用道具 举报

ID:510468 发表于 2019-4-12 14:06 | 显示全部楼层
非常好
回复

使用道具 举报

ID:489425 发表于 2019-4-12 15:50 | 显示全部楼层
请问具体的单片机型号是什么
回复

使用道具 举报

ID:324545 发表于 2019-4-22 14:43 | 显示全部楼层
不错啊啊啊
回复

使用道具 举报

ID:538577 发表于 2019-5-15 17:18 | 显示全部楼层
厉害
回复

使用道具 举报

ID:546593 发表于 2019-5-24 20:34 | 显示全部楼层
真不错
回复

使用道具 举报

ID:550631 发表于 2019-6-1 10:13 | 显示全部楼层
谢谢楼主,非常有用
回复

使用道具 举报

ID:487298 发表于 2019-11-3 21:02 | 显示全部楼层
谢谢,帮到我不少!
回复

使用道具 举报

ID:242950 发表于 2020-3-1 12:56 | 显示全部楼层
嫌的无聊,晒晒
回复

使用道具 举报

ID:28260 发表于 2021-7-24 08:08 | 显示全部楼层

谢谢楼主,非常有用,学习了!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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