找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1799|回复: 4
收起左侧

51单片机用定时器控制舵机程序问题,想让舵机在两个角度循环

[复制链接]
ID:308765 发表于 2019-10-20 15:28 | 显示全部楼层 |阅读模式
各位大神,请教一下我用定时器中断产生pwm方波控制舵机,想让舵机在两个角度循环然后用了两个定时器,但是定时器1死活不管用,但是定时器0是有用的,是不是我的代码有问题啊
代码如下,我现在是把定时器0先放在一边然后用定时器1的,就是没有反应
#include <reg52.h>
#define uint unsigned int         
#define uchar unsigned char
sbit P1_0=P1^0;                         //PWM信号输出端                 
void Init_t0(void);    //子函数声明   
void Init_t1(void);
void delay(unsigned int x) //延时 x ms
{
unsigned int i,j;
for(i=x;i>0;i--);
for(j=110;j>0;j--);
}
void main()  
{         
        P1_0=0;                                 //置PWM初始输出为高电平                        

     //Init_t0();
    //   TR0=1;
     // while(1);           //等待中断
    //   TR0=0;
       Init_t1();
       TR1=1;
       while(1);
    //   TR1=0;
}
void Init_t0(void)
{   
        TMOD=0x01;                  //设置定时器0工作方式1后面运行TR位启动
        TH0=(65536-1500)/256;
        TL0=(65536-1500)%256;         //1.5ms 的高电平
        EA=1;
        ET0=1;
      //  TR0=1;         
}
void Init_t1(void)
{   
        TMOD=0x10;                  //设置定时器1工作方式1后面运行TR位启动
        TH1=(65536-1500)/256;
        TL1=(65536-1500)%256;         //1.5ms 的高电平
        EA=1;
        ET1=1;
      //  TR0=1;         
}
/*******************中断服务程序**********************/  
void PWM0() interrupt 1         //定时器0中断,产生方波
{  
        if(P1_0==1)                         //如果上个电平为1,则下个低电平的时间为18.5ms
        {  
                TH0=(65536-18000)/256;                 //试过t1=1500;t0=20000-t1;但舵机老是吱吱的响,推测:运算耗时.
                TL0=(65536-18000)%256;                 //1800是抓取
        }
        else                                         //如果上个电平为0,则下个高电平为1.5ms
        {
                TH0=(65536-2000)/256;
                TL0=(65536-2000)%256;
        }
        P1_0=~P1_0;
}
void PWM1() interrupt 2         //定时器0中断,产生方波
{  
        if(P1_0==1)                         //如果上个电平为1,则下个低电平的时间为18.5ms
        {  
                TH1=(65536-18000)/256;                 //试过t1=1500;t0=20000-t1;但舵机老是吱吱的响,推测:运算耗时.
                TL1=(65536-18000)%256;
        }
        else                                         //如果上个电平为0,则下个高电平为1.5ms
        {
                TH1=(65536-2000)/256;
                TL1=(65536-2000)%256;
        }
        P1_0=~P1_0;
}


回复

使用道具 举报

ID:56665 发表于 2019-10-20 16:23 | 显示全部楼层
仔细看一下芯片规格书,有没有定时器1。
回复

使用道具 举报

ID:98195 发表于 2019-10-20 18:28 来自手机 | 显示全部楼层
   改成void PWM1() interrupt 3呀
回复

使用道具 举报

ID:308765 发表于 2019-10-20 18:31 来自手机 | 显示全部楼层
m182892 发表于 2019-10-20 16:23
仔细看一下芯片规格书,有没有定时器1。

是stc89c52,有的吧
回复

使用道具 举报

ID:308765 发表于 2019-10-21 15:56 | 显示全部楼层
丶念 发表于 2019-10-20 18:28
改成void PWM1() interrupt 3呀

好的,这个的确错了,谢谢!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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