标题: 51单片机pwm控制电机速度正反转(终极版)函数都已写好直接调用 [打印本页]

作者: 大红色九分裤    时间: 2017-10-31 21:06
标题: 51单片机pwm控制电机速度正反转(终极版)函数都已写好直接调用


用51单片机做的灭火机器人程序,pwm控制速度正反转,能够实现自动寻找火源并灭火。此机器人在电子竞赛中获

单片机源程序如下:
  1. #include<reg52.h>
  2. #include<math.h>
  3. #include<math.h>
  4. #define uint unsigned int
  5. #define uchar unsigned char


  6. sbit IN_L1=P1^3;             //左轮电机控制1       //
  7. sbit IN_L2=P1^2;             //左轮电机控制2       //
  8. sbit IN_R1=P1^0;             //右轮电机控制1       //
  9. sbit IN_R2=P1^1;             //右轮电机控制2            //
  10. sbit PWMA=P1^6;              //左轮电机PWM波输出  //
  11. sbit PWMB=P1^5;              //右轮电机PWM波输出          //

  12. sbit HONG_L=P3^0;
  13. sbit HONG_M=P3^1;
  14. sbit HONG_R=P3^2;                                //红外避障,左,中,右
  15.   
  16. sbit S_L=P3^4;
  17. sbit S_R=P3^5;                                  //寻迹传感器,
  18. sbit J_L=P3^6;
  19. sbit J_R=P3^7;                                        //计数器,左轮,右轮

  20. sbit DJ=P0^0;                           //        电机
  21. sbit SPK=P2^1;                        //蜂鸣器
  22. sbit HUO_L=P2^3;
  23. sbit HUO_R=P2^4;                        //探测到火源 ,为低电位

  24. uchar SpeedTemp1=0;          //左轮电机速度锁定变量
  25. uchar SpeedTemp2=0;          //右轮电机速度锁定变量

  26. uchar SpeedLeft=0;          //左轮电机速度设定变量
  27. uchar SpeedRight=0;          //右轮电机速度设定变量

  28. uchar Timer0=0;           //定时器T0中断次数计数变量
  29. uint i,j,k,n;

  30. void Motor(uchar Select,char Speed)   //Select为电机选择,左轮为1,右轮为2                                  //Description:电机速度,正反转传递程序            
  31. {
  32.    if(Select==1)                      //对左轮电机的处理
  33.    {
  34.       SpeedLeft=abs(Speed);              //取速度的绝对值
  35.       if(Speed>=0)
  36.       {
  37.          IN_L1=0;
  38.          IN_L2=1;                     //如果速度为非负,则正转
  39.          }
  40.       else
  41.       {
  42.          IN_L1=1;
  43.          IN_L2=0;                     //如果速度为负,则反转      
  44.       }
  45.    }

  46.    if(Select==2)                      //对右轮电机的处理
  47.    {
  48.       SpeedRight=abs(Speed);              //取速度的绝对值
  49.       if(Speed>=0)
  50.       {
  51.          IN_R1=0;
  52.          IN_R2=1;                     //如果速度为非负,则正转
  53.          }
  54.       else
  55.       {
  56.          IN_R1=1;
  57.          IN_R2=0;                     //如果速度为负,则反转      
  58.       }
  59.    }

  60. }
  61. void Delay(uint n)   //Delay范围0 ~ 65535
  62. {
  63.    uint j;
  64.    while(n--!=0)         //延时次数
  65.    {
  66.       for(j=0;j<110;j++)    //延时1ms
  67.            ;
  68.    }
  69. }                           //总延时为Delay*1 ms


  70. void H_detect()
  71. {
  72.         if(HUO_L==0)
  73.         {       
  74.                 for(i=1;i<640;i++)
  75.                         for(k=1;k<110;k++)
  76.                 {       
  77.                         Motor(1,-50);
  78.                         Motor(2,0);
  79.                         DJ=1;
  80.                         j=1;
  81.                 }
  82.         }
  83.         else
  84.                 if(HUO_R==0)
  85.                 {
  86.                         for(i=1;i<640;i++)
  87.                                 for(k=1;k<110;k++)
  88.                                 {
  89.                                 Motor(1,0);
  90.                                 Motor(2,-50);
  91.                                 DJ=1;
  92.                                 j=2;
  93.                                 }
  94.                 }
  95.                 else
  96.                 {
  97.                         Motor(1,80);
  98.                         Motor(2,80);
  99.                         j=0;
  100.                 }
  101.         if((j==1)||(j==2))
  102.         {        DJ=1;
  103.                 for(i=0;i<500;i++)
  104.                         for(k=1;k<110;k++)
  105.                                 {
  106.                                 Motor(1,0);
  107.                                 Motor(2,0);
  108.                                 }
  109.                 if(j==1)
  110.                 {
  111.                         for(i=1;i<1150;i++)
  112.                                 for(k=1;k<110;k++)
  113.                                 {
  114.                                         Motor(1,50);
  115.                                         Motor(2,0);
  116.                                 }
  117.                 }
  118.                 else
  119.                 {
  120.                         for(i=1;i<1150;i++)
  121.                                 for(k=1;k<110;k++)
  122.                                 {
  123.                                         Motor(1,0);
  124.                                         Motor(2,50);
  125.                                 }                       
  126.                 }
  127.                 DJ=0;
  128.                 Delay(200);
  129.         }       
  130. }

  131. void Move()
  132. {
  133.         H_detect();
  134.         if((S_L==0)&&(S_R!=0))
  135.         {
  136.                 Motor(1,-10);
  137.                 Motor(2,80);
  138.         }
  139.         else
  140.         {
  141.                 if((S_R==0)&&(S_L!=0))
  142.                 {
  143.                         Motor(1,80);
  144.                         Motor(2,-10);
  145.                 }
  146.                 else
  147.                 {if((S_R==0)&&(S_L==0))
  148.                         {
  149.                                 Motor(1,80);
  150.                                 Motor(2,80);
  151.                         }
  152.                 }
  153.         }
  154. //        Delay(100);         
  155.         Motor(1,80);
  156.         Motor(2,80);
  157. }
  158. void Init()
  159. {
  160.    IN_L1=1;            
  161.    IN_L2=1;             //左轮电机刹车      
  162.    IN_R1=1;            
  163.    IN_R2=1;             //右轮电机刹车      

  164.         PWMA=0;            //左轮电机PWM波初始化
  165.         PWMB=0;             //右轮电机PWM波初始化
  166.    
  167.    TMOD=0x01;        // 设定T0的工作模式为1,GATE=0说明以TR0启动定时器,C/T为0说明选择了定时模式
  168.    TR0=0;             //关闭定时器0
  169.    TF0=0;             //定时器溢出复位
  170.    IE=0x00;             //所有中断关闭
  171.    TH0=(65536-1000)/256;               
  172.    TL0=(65536-1000)%256;      //装入TO定时初值,定时时间为50us
  173.    EA=1;             //开中断
  174.    ET0=1;            //开定时器0的中断   
  175.    TR0=1;            //启动定时器0
  176. }
  177. void main()
  178. {        Init();
  179.         DJ=0;
  180.         n=1;
  181.         while(n)
  182.         {
  183.                 Motor(1,80);
  184.                 Motor(2,80);
  185.                 if((S_R!=0)&(S_L!=0))
  186.                 {
  187.                         for(i=1;i<95;i++)
  188.                                 for(k=1;k<110;k++)
  189.                                         {
  190.                                                 Motor(1,80);
  191.                                                 Motor(2,0);
  192.                                         }                         //右转九十度
  193.                         n=0;
  194.                 }
  195.         }
  196.         Delay(200);
  197.            for(i=1;i<150;i++)
  198.                 for(k=1;k<110;k++)
  199.                         {
  200.                                 Move();
  201.                         }
  202.         for(i=1;i<180;i++)
  203.                                 for(k=1;k<110;k++)
  204.                                         {
  205.                                                 Motor(1,0);
  206.                                                 Motor(2,80);
  207.                                         }                         //zuo转九十度       
  208.         while(1)
  209.         {
  210.                 Move();
  211.         }       
  212. }
  213. void PwmTimer0() interrupt 1     //定时器0的中断服务程序来产生PWM波
  214. {     
  215.    TH0=(65536-1000)/256;
  216.    TL0=(65536-1000)%256;        //恢复定时器0的初值,定时时间50us
  217.    
  218.    if(Timer0==0)         //1个PWM周期完成后才会接受新数值 ,即500us内锁定速度
  219.    {
  220.     SpeedTemp1=SpeedLeft;  //锁定左轮电机的速度
  221.     SpeedTemp2=SpeedRight; //锁定右轮电机的速度
  222.     }
  223.    
  224.     if(Timer0<SpeedTemp1)
  225.        PWMA=1;
  226.     else
  227.        PWMA=0;       //产生左轮电机的PWM波
  228.    
  229.     if(Timer0<SpeedTemp2)
  230.        PWMB=1;
  231.     else
  232.        PWMB=0;      //产生右轮电机的PWM波

  233.     Timer0++;         //中断计数变量增1
  234.     if(Timer0>=100) //设定PWM波周期为500us
  235.     Timer0=0;       //中断计数变量清0
  236. }
复制代码

所有资料51hei提供下载:
用51单片机做的灭火机器人程序,能够实现自动寻找火源并灭火。此机器人在电子竞赛中获.rar (32.79 KB, 下载次数: 161)



作者: yyyttt_2007    时间: 2017-11-10 18:25
好资料,51黑有你更精彩!!!
作者: teast_tea    时间: 2018-5-6 15:15
非常需要,谢谢搂住
作者: bleach    时间: 2018-5-8 09:23
谢谢分享
作者: ck夏    时间: 2018-5-8 10:11
谢谢大神
作者: zcmthr    时间: 2018-7-3 14:53

谢谢分享
作者: wis98    时间: 2018-9-18 14:36
好资料,51黑有你更精彩!!!
作者: dyx811    时间: 2018-10-16 18:12
太精彩了,久久不愿离开
作者: 好又快维修部    时间: 2018-10-18 10:30
楼主这是大爱啊
作者: 秦沐    时间: 2018-11-14 09:36
完美的51hei
作者: 范饭饭    时间: 2018-11-16 10:23
大爱无言
作者: 笑天我    时间: 2018-11-19 18:28

大爱无言
作者: 梦里见回复    时间: 2018-11-21 11:07
谢谢分享
作者: li972695398    时间: 2019-3-28 14:16
感谢分享,能不能看下原理图
作者: 冰醋混合物    时间: 2019-4-3 09:56
楼主,你确定 定时50us话,赋的初值是65536-1000?比如你的是12M晶振,怎么算都是65536-50吧?就算是11.0592的晶振,也绝不可能是这个数值。
作者: 絮尘    时间: 2019-4-26 10:51
请问能不能发下硬件原理图
作者: sky505050w    时间: 2019-4-26 12:15
楼主,你这个PWM里面的速度锁定变量是为了防止电机产生冲击吗,变速的时候
作者: hzsstudy    时间: 2020-4-9 09:19
非常需要,谢谢搂住
作者: mszw2100    时间: 2020-4-9 10:34

好资料,51黑有你更精彩!!!




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1