现在的问题:1、PWM_2输出的舵机控制信号,舵机乱转。定时中断程序里面是不是有问题啊
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define ZQ 20000
uint PWM_Z[3];
uint PWM_S[3];
uint PWM_DD;
uchar BC=0,BC1=0,JS; // 路标,第几路PWM、接收数据存储器
sbit PWM_0=P1^0;
sbit PWM_1=P1^1;
sbit PWM_2=P1^2;
sbit led=P1^3;
void ys(uint ss)
{ uchar i,j;
for(i=ss;i>0;i--)
for(j=110;j>0;j--);
}
void timer0(void) interrupt 1
{
switch(BC)
{
case 1:
if(PWM_Z[0]!=0)
{
PWM_0=1;
TH0=(65536-PWM_Z[0])/256; //第一路 输出低电平时长
TL0=(65536-PWM_Z[0])%256;
}
break;
case 2:
PWM_0=0;
if(PWM_Z[1]!=0)
{
PWM_1=1;
TH0=(65536-PWM_Z[1])/256; //第二路 输出低电平时长
TL0=(65536-PWM_Z[1])%256;
}
break;
case 3: PWM_1=0;
if(PWM_Z[2]!=0)
{
PWM_2=1;
TH0=(65536-PWM_Z[2])/256; //第三路 输出低电平时长
TL0=(65536-PWM_Z[2])%256;
}
break;
case 4: PWM_2=0;
TH0=PWM_DD/256;
TL0=PWM_DD%256;
BC=0;
break;
}
BC1=BC;
BC++;
}
void enst (char RXS)
{ JS=0;
led=1;
if(RXS<=8)
switch(RXS)
{
case 7: //舵机复位
PWM_S[2]=1500;
break;
case 8:
PWM_S[0]=5000;
PWM_S[1]=5000;
TR0 = 1;//启动定时器0
ys(200);
break;
}
qidong()
{ TMOD=0x01;
TH0=(65536-PWM_Z[2])/256;
TL0=(65536-PWM_Z[2])%256;
EA = 1;//打开总中断
ET0 = 1;//打开定时器0中断
PT0=1; //定时器0 设置为最高优先中断
PX0=0;
PWM_S[0]=0;
PWM_S[1]=0;
PWM_S[2]=0;
}
void main()
{
led=0;
P2=0x0f;
qidong();
while(1)
{
if(led==1)
{ led=0;
ys(20);
if(led==1)
enst(P2);
}
if(BC1==0)
{ PWM_Z[0]=PWM_S[0];
PWM_Z[1]=PWM_S[1];
PWM_Z[2]=PWM_S[2];
PWM_DD=65536-ZQ+PWM_S[0]+PWM_S[2]+PWM_S[1];
BC1++;
}
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>