那个大神帮写一个89c52rc单片机控制9g舵机程序

那个大神帮写一个89c52rc单片机控制9g舵机程序, 接一个按键,按下后控制舵机正反转一套动作,一个往复运动。按键控制它做一个回来的运动动作就可以,然后再麻烦说下咋接线,新手呀!谢谢大神拉

首先开明白你的舵机控制原理,它要求输入的脉冲期是20ms,其中高电平在1.5ms时舵臂在0位
在2..0ms时舵臂在右90度位 在1.5ms时舵臂在左90度位 舵机有3根线,一根线是电源正,另一根电源负,还有一根(一般为白线)是控制线,就是输入的脉冲信号的
程序中可以用两个定时器,一个定时20ms,另外一个定时1到2ms可变,就可以让舵机动作
下面程序供参考,先不考虑按键问题,能让舵机动作就 成功一大半
/双定时器产生PWM波,控制舵机
//定时器0负责置高电平和控制定时器1的开停,定时器1负责置低电平
#include<STC12C5A.H>
#define uchar unsigned char
#define uint unsigned int
sbit PWM=P3^7;//经试验,此引脚信号可以直接送舵机不用放大
uchar b=1500;//定时1.5ms的初值
void Delay1ms(uint i) //1ms延时程序
{
uint j;
for(;i>0;i--)
{
for(j=0;j<125;j++)
{;}
}
}
void main()
{
b=1500;
TMOD=0X11;
TH0=(65536-20000)/256;
TL0=(65536-20000)%256;
TH1=(65536-b)/256;
TL1=(65536-b)%256;
ET0=1;
EA=1;
TR0=1;
PWM=1;
P1M0=0X0F; //低4位配置为推挽输出 ,普通51单片机无此寄存器
P1M1=0X00;
while(1)
{
P1=0x0a; //这是让行走电机正向转动的,用的是L298N模块
b=1500;Delay1ms(2000);//直行
b=1000;Delay1ms(1000);//左转
b=1500;Delay1ms(2000);//直行
b=2000;Delay1ms(1000);//右转
b=1500;Delay1ms(2000);//直行
P1=0x05;//这是让行走电机反向转动的
b=1500;Delay1ms(2000);//后退
b=1000;Delay1ms(1000);//后左转
b=1500;Delay1ms(2000);//后退
b=2000;Delay1ms(1000);//后右转
b=1500;Delay1ms(2000);//后退
}
}
void timer0()interrupt 1//定时器0中断
{
TH0=(65536-20000)/256;
TL0=(65536-20000)%256;
PWM=1;
TR1=1;
ET1=1;
}
void timer1()interrupt 3//定时器1中断
{
TH1=(65536-b)/256;//改变b的值就可转向
TL1=(65536-b)%256;
PWM=0;
TR1=0;
ET1=0;
}
温馨提示:答案为网友推荐,仅供参考