微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求教:51单片机控制360度舵机旋转圈数的问题。

求教:51单片机控制360度舵机旋转圈数的问题。

时间:10-02 整理:3721RD 点击:

我用的是360度舵机(注意不是180度的),想编个程序来控制舵机实现功能如下:
输入一个圈数(程序里赋值),使得单片机能控制舵机转对应的圈数,并且转到对应的圈数后能停住
拜托各位大神给来个程序,C语言的就行,

我现在自己改了一个程序,通过更改t1的数的大小来控制360度舵机旋转圈数,但是我现在有个问题就是,舵机是顺时针转的,怎么让它逆时针转啊。C语言程序如下
#include <reg52.h>
#define uint unsigned int
sbit pwm=P1^0;
//sbit PIS=P1^1;
uint t1=0x200;                                                           //7s        顺时针转7s
uint PWM_W=0,PWM_T=0,PWM_data[]={13,4};
uint k=0,i=1,h=0 ;
/*******************************************/
/*          中断初始化                    */
/*******************************************/
void InitTimer()                                                                //初值在运行过程中计数器不断加1 ,直到溢出时产生中断,因为这种定时方式
{                                                                                                 //(有的方式可以自动重置的),单片机不能重置初值,所以进入中断后必须人工重置初值,
  TMOD=0X01;                                                                        //为下一次中断做准备。 //sec=0.00085069
  TH0=(65536-78)/256;                //TH0=FF;
  TL0=(65536-78)%256;                //TL0=B2;
  EA=1;                                                //定时78=20ms/255
  TR0=0;
  ET0=1;  
}                                                                                         //sec=0.00086046
void delay_ms(uint x)                //延时函数
{
     uint K;
     while(x--)for(K=0;K<125;K++);
}
/*******************************************/
/*          中断初始化                    */
/*******************************************/
void DropLitter()
{
                                         //if(PIS==0) //检测到按键 舵机开始工作
                                                                                     //{
if(t1>0)                                                                        //        delay_ms(10);
{
TR0=1;
t1--;                                                             //                 {TR0=1; //h=0;
}                                                                                          //                while(PIS==0);
else                                                                       //                         }
   TR0=0;                                                            //                                        }      
                                                                                         //                        else TR0=0;
      
}
void main()
{
  InitTimer();                 //主函数里的是初始化的初值,因为有的定时方式,定时器溢出时,单片机没有重装初值的功能。所以定时函数里要重装初值。可以设置不同的值,但定时时间主要是以重装的来计了。
  while(1)                        //while语句的原型是while(表达式)语句,当表达式为非0值时,执行while语句中的嵌套语句。那么while(1)其中1代表一个常量表达式,他永远不会等于0。所以,循环会一直执行下去。除非你设置break等类似的跳出循环语句循环才会中止.
                                           //while(i--)其中i是一个变量,因此表达式i--有不同的值,依次递减,i--是先取值后减,--i先加后取值,所以i--的值同未执行该自减运算时的i相等。因此当i为0时,循环会跳出.
   
    {
  DropLitter();
    }
}
void T0_time() interrupt 1//100微秒中断一次          这个是定时中断,在执行主程序时候,当定时到后,就会触发定时中断,执行完返回断点。很多大型程序都是这样编的。
{                                                                           //sec=0.00096246
  TH0=(65536-78)/256;
  TL0=(65536-78)%256;
  PWM_W++;                   //pwm_w=0,
  PWM_T++;                   //pwm_t=0
  i++;                           //i=1
  //k++;                   //k=0
     if(PWM_T<200) //是否小于20MS                           //sec=0.00099284
       {
            if(PWM_W<PWM_data[h]) //转向一个角度        //pwm_data[]=(13,4)   h=0
                  {
                      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;
         }
}                                                          //sec=0.00103733

谢谢小编分享。

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

网站地图

Top