PWM 程序中哪里有问题

2020-02-05 08:50发布

现在的问题: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++;
                     }
   
   }
   
   }
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。