求教:51单片机控制360度舵机旋转圈数的问题。
我用的是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
谢谢小编分享。