嘿嘿H2 发表于 2012-6-14 09:25:18

多路PWM舵机控制

//制作:猴子
//制作思路:舵机周期为20ms,控制范围在0.5-2.5ms内,一路输出高电平时段,其它所有输出低电平,一路一路轮流切换,最多控制8路,可以随意调节。
                  
      小弟菜鸟,刚接触c语言,有不足之处,请多多指教。

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define ZQ 20000
uint PWM_S;
uint PWM_DD;
uchar BC,RXS; //       路标,第几路PWM、接收数据存储器
sbit PWM_0=P1^0;
sbit PWM_1=P1^1;
sbit PWM_2=P1^2;

voidtt0()
{TMOD=0x01;

      TH0=(65536-PWM_S)/256;
      TL0=(65536-PWM_S)%256;

      EA = 1;//打开总中断
       ET0 = 1;//打开定时器0中断
       TR0 = 1;//启动定时器0
      EX0= 1;
         PT0=1;//定时器0 设置为最高优先中断
         PX0=0; // 外部中断0 设置最低中断


}

void timer0(void) interrupt 1
{         
      switch(BC)
      {
                case 1:PWM_0=0;
                                           PWM_2=1;
                                                   PWM_DD=PWM_DD+PWM_S ;
                           TH0=-(65536-PWM_S)/256;   //第一路 输出低电平时长
                           TL0=-(65536-PWM_S)%256;
                           break;
                case 2:PWM_2=0;
                                     PWM_1=1;
                                           PWM_DD=PWM_DD+PWM_S ;
                           TH0=-(65536-PWM_S)/256;   //第二路 输出低电平时长
                           TL0=-(65536-PWM_S)%256;
                           break;
                case 3:PWM_1=0;
                                     PWM_0=1;
                                                   PWM_DD=PWM_DD+PWM_S ;
                           TH0=-(65536-PWM_S)/256;   //第三路 输出低电平时长
                           TL0=-(65536-PWM_S)%256;
                           break;
                case 4:           PWM_2=0;
                                           PWM_1=0;
                                                   PWM_0=0;
                           TH0=-(65536-ZQ+PWM_DD)/256;
                           TL0=-(65536-ZQ+PWM_DD)%256;
                                                   PWM_DD=0;
                                                   BC=0;
                           break;
               
                }
                BC++;
}
void WBZD0(void) interrupt        0           //有接收信号中断
{
   
    RXS=P2 ;

}

void KEY()           //处理控制信号
{
    switch(RXS)
      {
                case 1:
                                  PWM_S ++;
                                       break;
                                case 2:
                                          PWM_S --;
                                       break;
}
       }
void main(void)
{
PWM_S=100;
PWM_S=100;
PWM_S=1500;

      tt0();
while(1)
   {
   if(RXS!=0)          //        判断有无接收
   {
       KEY();
       
          }
   }

}

风起 发表于 2013-2-3 23:32:35

在学,在顶
页: [1]
查看完整版本: 多路PWM舵机控制