标题:
单片机控制舵机的程序源码
[打印本页]
作者:
gzf0017
时间:
2018-7-14 20:53
标题:
单片机控制舵机的程序源码
单片机源程序如下:
#include <reg52.h>
sbit ControlPort = P1^0; //舵机信号端口
sbit Key = P3^4; //按键端口
unsigned int TimeOutCounter = 0 //TimeOutCounter:定时器溢出计数
unsigned char flag=1,num=2;
void InitTimer (void)
{
TMOD=0x10; //定时/计数器1工作于方式1
TH1 = ( 65535 - 50 ) / 256; //0.25ms
TL1 = ( 65535 - 50 ) % 256;
EA=1; //开总中断
ET1=1; //允许定时/计数器1 中断
TR1=1; //启动定时/计数器1 中断
}
void delay(unsigned int z)
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void ControlLeftOrRight (void) //控制舵机函数
{
if(flag==1)
{
if(Key == 0)
{
delay(30);
if(Key == 0)
{
while(!Key);
num=num+1;
if(num==4) flag=0;
}
}
}//使标志等于Stop(0), 在中断函数中将用到
else
{
if( Key == 0 )
{
delay(30);
if(Key==0)
{
while(!Key);
num=num-1;
if(num==0) flag=1;
}
}
}
}
void main (void) //主函数
{
InitTimer();
for(;;)
{
ControlLeftOrRight();
}
}
void Timer1 (void) interrupt 3 //定时器中断函数
{
TH1 = ( 65535 - 50 ) / 256;
TL1 = ( 65535 - 50 ) % 256;
TimeOutCounter ++;
switch ( num)
{
case 0 : //为0时,舵机归位,脉宽1.5ms
{
if( TimeOutCounter <= 8 )ControlPort = 1;
else ControlPort = 0;
break;
}
case 1 :
{
if( TimeOutCounter <= 15 )ControlPort = 1;
else ControlPort = 0;
break;
}
case 2 :
{
if( TimeOutCounter <= 22 )ControlPort = 1;
else ControlPort = 0;
break;
}
case 3 : //为2时,舵机右转,脉宽2ms(理论值),实际可以调试得出
{
if( TimeOutCounter <=29 ) ControlPort = 1;
else ControlPort = 0;
break;
}
case 4 :
{
if( TimeOutCounter <= 36 )ControlPort = 1;
else ControlPort = 0;
break;
}
default : break;
}
if( TimeOutCounter == 400 )TimeOutCounter = 0;
}
复制代码
作者:
51单片机1234
时间:
2018-7-15 08:00
受教了~~~谢谢大神
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1