单片机舵机控制!急!!

来源:百度知道 编辑:UC知道 时间:2024/09/22 15:38:06
#include<reg52.h>
#include<stdio.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

sbit IN1=P0^0;
sbit IN2=P0^1;
sbit EA1=P0^5;
sbit dj=P0^7; //舵机口
uint t=0;//中断次数
uchar zk;//高电平中断次数
uchar p=0;//定义pwm占空比

void delay(uint z)
{ uint i,j;
for(i=0;i<z;i++)
{
for(j=0;j<100;j++);
}
}

void time0() interrupt 1
{
TH0=-100>>8;//100us一次中断
TL0=-100%256;
if(t==0)zk=p;
if(t<zk)
dj=1;
if(t>=zk)
dj=0;
t++;
if(t>=200)
t=0;//20mspwm周期
}
void turn_left()
{ IN1=1;IN2=0;EA1=1;//电机工作
p=5;//0.5ms
delay(600);

}

void turn_right()
{ IN1=1;IN2=0;EA1=1;//电机工作
p=25;//2.5ms
delay(600);
}
void mian()
{
TMOD=0x01;//定时器0工作在方式1
TH0=-100>>8;
TL0=-100%2

TH0=-100>>8;
TL0=-100%256;

你的晶振应该是12MHZ,这样才能100US中断一次。赋值的话最好直接写
65536-100,你只写-100我差点没看出来。
t用uint也行,考虑效率还是uchar好。

主函数是MAIN,你写错了,我编译时才发现。

delay(600);太短,舵机还没反应,这个函数就过去了,你放到2000试试。

一般的航模舵机的标准脉宽是1000us到2000us,不是500us和2500us这一说法是机器人舵机传出来的,但实际是有不少舵机只认1000us到2000us的,只有那些标明是机器人舵机的舵机,才认500和2500,其它的要看人品!

程序似乎没有问题,除了变量t似乎应该用uchar型,以及我不知道你的delay(600)会延时多长时间。
你怎么知道占空比没有改变?你跟踪了吗?或者你将主函数中的turn_right()先去掉试一试。