打印
[51单片机]

求指点程序关于51单片机控制舵机转动

[复制链接]
1630|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
464846382|  楼主 | 2014-6-11 21:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
四天时间加老师完善搞出来的程序,晶振12M,周期20ms,占空比j自己设定。利用占空比产生pwm波控制电机转动,用示波器输出的波形是正确的,但是连接舵机是舵机不转,或者转一个角度然后回来。想了一天完全没头绪,希望有懂的朋友帮帮忙。下面的写的程序。恳请各位大神帮帮忙,找出错误。
#include<reg52.h>
sbit P10=P1^0;
unsigned char i,t,flag;
float j;//占空比
void delayms(unsigned int a)
{
        unsigned char b;//基准延时时间
  while(a--)
  {
                for(b=0;b<125;b++)
                {;}
}
}
main()
{
        TMOD=0x10;//定时器方式1
        TH1=0xFC;//高八位,定时器1ms
        TL1=0x18;//低八位
        EA=1;//开总中断
        ET1=1;//选择定时器1
        TR1=1;//启动定时器
        P10 =1;
        while(1)//利用占空比产生的pwm波驱动舵机旋转,不同占空比舵机旋转角度不同
        {
                j = 0.025;
                delayms(1000);
                j = 0.05;//定义占空比为0.1,无限死循环
                delayms(1000);
                /*j = 0.075;
                delayms(1000);
                j = 0.10;
                delayms(1000);
                j = 0.125;
                delayms(1000);*/
               
        }
}

void timer1(void) interrupt 3     //定时器1中断符号
{
          TH1=0xFC;//工作在定时器方式1下,每次计数后高低8位必须重新置数
          TL1=0x18;
                t++;
                i++;
                if(i==20*j)//正向导通时间,通过定时器*定时次数实现
                {
                        P10 = 0;//正向导通结束P10口改为下降沿
                }
                if(t == 20)//总周期,通过定时器*定时次数实现
                {
                        P1 = 1;//总周期结束P10口重新改为正脉冲
                        i = 0;//正向导通计数清零
                        t = 0;//总周期计数清零
                }

}

相关帖子

沙发
xjycug| | 2014-6-11 21:41 | 只看该作者
看了看程序,这真是你们老师帮忙完善的吗???
就说说中断吧, 判断条件if(i==20*j)  i是字符型,而j是浮点型,逻辑比较的可比性暂时打个问号。还有判断语句中P10 = 0;//接着的判断语句怎么就是P1 = 1;呢。
再说说程序本身吧,初始化中EA = 1这种开总中断,最好放在初始化的最后,不过也无所谓,这个编程的习惯。还有,主程序中,使用固定频率的PWM,最好开两个定时器,一个定时器控制频率,一个定时器控制占空比。不要在主循环中使用delay

使用特权

评论回复
板凳
yuanquan12345| | 2015-2-2 22:23 | 只看该作者
学习了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

1

粉丝