搜索
bottom↓
回复: 1

多路PWM舵机控制

[复制链接]

出0入0汤圆

发表于 2012-6-14 09:25:18 | 显示全部楼层 |阅读模式
//制作:猴子
//制作思路:舵机周期为20ms,控制范围在0.5-2.5ms内,一路输出高电平时段,其它所有输出低电平,一路一路轮流切换,最多控制8路,可以随意调节。
                    
        小弟菜鸟,刚接触c语言,  有不足之处,请多多指教。

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

void  tt0()
{TMOD=0x01;

        TH0=(65536-PWM_S[2])/256;
        TL0=(65536-PWM_S[2])%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[0] ;
                           TH0=-(65536-PWM_S[0])/256;   //第一路 输出低电平时长
                           TL0=-(65536-PWM_S[0])%256;
                           break;
                case 2:PWM_2=0;
                                       PWM_1=1;
                                           PWM_DD=PWM_DD+PWM_S[1] ;
                           TH0=-(65536-PWM_S[1])/256;   //第二路 输出低电平时长
                           TL0=-(65536-PWM_S[1])%256;
                           break;
                case 3:PWM_1=0;
                                       PWM_0=1;
                                                   PWM_DD=PWM_DD+PWM_S[2] ;
                           TH0=-(65536-PWM_S[2])/256;   //第三路 输出低电平时长
                           TL0=-(65536-PWM_S[2])%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[0] ++;
                                         break;
                                case 2:
                                          PWM_S[0] --;
                                         break;
}
         }
void main(void)
{
  PWM_S[0]=100;
  PWM_S[1]=100;
  PWM_S[2]=1500;

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

}

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2013-2-3 23:32:35 | 显示全部楼层
在学,在顶
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-18 08:09

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表