微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 看完这些 你舵机也就掌握了

看完这些 你舵机也就掌握了

时间:10-02 整理:3721RD 点击:
单片机交流群  创建最强群 200257396
第一种方法用两个定时器
# include<reg52.h>
typedef unsigned int uint;
typedef unsigned char uchar;
sbit pwm=P0^3;//输出PWM信号
sbit hw=P1^0; //红外传感器 有人来 电平拉低 低电平
uint pwm_value=1500;//初值为1.5ms
uint value[]={2000,500};//
uint i;
void delay_ms(uint x)//延时函数
{
     uint K;
     while(x--)for(K=0;K<125;K++);
}
void InitTimer(void)
{
   TMOD=0x11;//开定时器0,1
   TH0=-20000/256;//定时20MS,20MS为一个周期
   TL0=-20000%256;
   TH1=-1500/256;//定时1.5MS,这时舵机处于0度
   TL1=-1500%256;
   EA=1;//开总断
   TR0=0;//关定时器0
   ET0=1;
   TR1=0;//关定时器1
   ET1=1;
}
void timer0(void) interrupt 1//定时器0中断函数
{
   pwm=1;
   TH0=-20000/256;
   TL0=-20000%256;
   TR1=1;
}
  void timer1(void) interrupt 3//定时器1中断函数
{
   pwm=0;
   TH1=-pwm_value/256;
   TL1=-pwm_value%256;
   TR1=0;
}
void main(void)//主函数
{
   InitTimer();
       
    while(1)//不断检测是否有人来
  {  
      if(hw==0)//判断语句如果有人来
             {
                 TR0=1;
             TR1=1;
              pwm_value=1500;
            for(i=0;i<2;i++)
          {
             pwm_value=value[i];//通过数组就可以改变舵机的转角度
             delay_ms(2500);//延时2.5s       
           }
        }
    }
}

第二种方法只用延时来控制舵机转角
      for( i=200; i>0; i-- )  
          {          
                        PWM = 1;   //舵机先转向-90度
             delayms( 4 );//0.5MS
             PWM = 0;
             delayms( 129 );//19.5MS
          }
       for(j=100;j>0;j--)//delayms( 16500 );//延时2.5MS          
                  {
                     PWM = 1;        //延时2.5s后 舵机转向0度
                     delayms( 10 );//1.5MS
                     PWM= 0 ;
                     delayms( 123 );//18.5MS
                   }       
第三种方法用一个定时和延时
#include <reg52.h>
#define uint unsigned int
sbit pwm=P1^0;
sbit PIS=P1^1;
uint PWM_W=0,PWM_T=0,PWM_data[]={13,4};
uint k=0,i=1,h=0 ;
/*******************************************/
/*          中断初始化                    */
/*******************************************/
void InitTimer()
{
  TMOD=0X01;
  TH0=(65536-78)/256;
  TL0=(65536-78)%256;
  EA=1;
  TR0=0;
  ET0=1;  
}
/*void delay_ms(uint x)//延时函数
{
     uint K;
     while(x--)for(K=0;K<125;K++);
} */
/*******************************************/
/*          中断初始化                    */
/*******************************************/
void DropLitter()
{
           if(PIS==0) //检测到人 舵机开始工作
        {
          TR0=1;
              //h=0;
        }
                //else TR0=0;
}
void main()
{
  InitTimer();
  while(1)
    {
                 DropLitter();
    }
}
void T0_time() interrupt 1//100微秒中断一次
{
  TH0=(65536-78)/256;
  TL0=(65536-78)%256;
  PWM_W++;
  PWM_T++;
  i++;
  //k++;
     if(PWM_T<200) //是否小于20MS
       {
            if(PWM_W<PWM_data[h]) //转向一个角度
                  {
                      pwm=1;
                  }
                  else pwm=0;
           }
         if(PWM_T==200)
           {  
                   //delay_ms(2500);
               PWM_W=0;
               PWM_T=0;
                   //TR0=0;
                   //h++;
           }
  
     if(i==25000) //延时2.5s后再转个角度
           {  //i=0;
              //delay_ms(2500);
             //PWM_T=0;
             //PWM_W=0;
               h=1;
             //if(h==2)//转向-90度
             //h=0;
           }
         if(i>=26500)
         { i=0;
           TR0=0;
           h=0;
         }
}

这三个舵机的程序很基础 看完理解 你舵机也就会了(这是我从我写的比赛程序里COPY下来的   就是多了个红外传感器检测到人的部分)  

有意思

文字多点就好了 不过还行了 。 小编是女生么?不容易啊 可以互粉下啊

整需要谢谢!

谢谢分享!

多谢LZ贴出来,不用去下载

  1. #include<reg52.h>
  2. //#include"1602.h"

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

  5. uchar PWM = 15;
  6. uchar  num = 0;
  7. uint cycle = 200;
  8. //uchar beijing[] = "Angle:";
  9. //uchar angle = 0;
  10. //uint ske = 0;
  11. sbit out = P1^0;               

  12. sbit P34 = P3^4;
  13. sbit P35 = P3^2;

  14. void delay_1ms(uchar t)
  15. {               
  16.         uchar k = 245;       
  17.         while(t--)
  18.         {
  19.                 while(k--);
  20.         }
  21. }

  22. void timer0_init(void)
  23. {
  24.         TMOD = 0x01;   //工作方式1
  25.         TH0 = (65536 - 100) / 256;//0.1ms
  26.         TL0 = (65536 - 100) % 256;
  27.         TR0 = 1;
  28.         EA = 1;
  29.         ET0 = 1;
  30. }
  31. void timer0_isr(void) interrupt 1
  32. {
  33.         TH0 = (65536 - 100) / 256;
  34.         TL0 = (65536 - 100) % 256;
  35.        
  36.         num++;         
  37.         if (num > cycle)num = 0;
  38.         if (num < PWM)
  39.         {
  40.                 out = 1;
  41.         }
  42.         else
  43.         {
  44.                 out = 0;
  45.         }
  46.        
  47. }

  48. //void lcdshow(uchar mm)
  49. //{               
  50. //        uchar gei, shi;
  51. //        gei = mm % 10;
  52. //        shi = mm / 10;
  53. //        write_1602_char(7, 0, shi + 48);
  54. //        write_1602_char(8, 0, gei + 48);
  55. //}

  56. void main()
  57. {       
  58.         timer0_init();
  59. //        lcd_1602_init();
  60. //        write_1602_string(0, 0, beijing);
  61.         while(1)
  62.         {               
  63.                 if (P34 == 0)
  64.                 {
  65.                         delay_1ms(20);
  66.                         if (P34 == 0)
  67.                         {
  68.                                
  69.                                 PWM = PWM + 1;
  70.                                 if (PWM > 25)
  71.                                 {
  72.                                         PWM = 25;
  73.                                 }
  74.                         }
  75.                 }
  76.                 if (P35 == 0)
  77.                 {
  78.                         delay_1ms(20);
  79.                         if (P35 == 0)
  80.                         {
  81.                        
  82.                                 PWM = PWM - 1;
  83.                                 if (PWM < 5)
  84.                                 {
  85.                                         PWM = 5;
  86.                                 }
  87.                         }
  88.                 }
  89. //                switch(PWM)
  90. //                {
  91. //                        case 10: angle = 90; break;
  92. //                        case 20: angle = 45; break;
  93. //                        case 30: angle = 0; break;
  94. //                        case 40: angle = 45; break;
  95. //                        case 50: angle = 90; break;
  96. //                }
  97. //                lcdshow(angle);
  98.         }
  99. }

复制代码

你的第二种方法的程序不是全的的吧,我自己加完后,编译出错,你能看看哪错了吗
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit PWM=P1^0;
void delayms(uint x)//延时函数
{
uint K;
while(x--)for(K=0;K<125;K++);
}
unsigned char i,j;
     for(i=200;i>0;i--)
{           
PWM = 1;   //舵机先转向-90度
delayms( 4 );//0.5MS
PWM = 0;
delayms( 129 );//19.5MS
}
for(j=100;j>0;j--)//
delayms( 16500 );//延时2.5MS           
{                    
PWM = 1;        //延时2.5s后 舵机转向0度
delayms( 10 );//1.5MS
PWM= 0 ;
delayms( 123 );//18.5MS
}

你的第二种方法的程序不是全的的吧,我自己加完后,编译出错,你能看看哪错了吗
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit PWM=P1^0;
void delayms(uint x)//延时函数
{
uint K;
while(x--)for(K=0;K<125;K++);
}
unsigned char i,j;
     for(i=200;i>0;i--)
{           
PWM = 1;   //舵机先转向-90度
delayms( 4 );//0.5MS
PWM = 0;
delayms( 129 );//19.5MS
}
for(j=100;j>0;j--)//
delayms( 16500 );//延时2.5MS           
{                    
PWM = 1;        //延时2.5s后 舵机转向0度
delayms( 10 );//1.5MS
PWM= 0 ;
delayms( 123 );//18.5MS
}

好样的 正在学习舵机呢

谢谢小编啦啦啦啦啦啦啦啦啦啦啦

大神们  问一下
MG995舵机里的电位器的杆断了
是不是就是无法正常工作了

学习学习

强烈的关注一下哦,

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top