标题: 单片机定时器中断0为什么中断中打开的灯一直亮 [打印本页]

作者: wuxinzhen    时间: 2019-11-9 14:04
标题: 单片机定时器中断0为什么中断中打开的灯一直亮
#include<reg52.h>
sbit p10=P1^0;

int t=0;

void InitTimer0()    //初始化函数
{        
     TMOD=0x01;    //设置定时器0工作模式1
     TH0=(65536-45872)/256;    //计数器装初值
     TL0=(65536-45872)%256;
     EA=1;              //开总中断
     ET0=1;             //开计数器0中断
     TR0=1;             //启动定时器0
}

void main()
{        
        InitTimer0();
                while(1);
        {

        ;
        }
}


void time0() interrupt 1
{
        TH0=(65536-45872)/256;    //计数器装初值
    TL0=(65536-45872)%256;
        t++;

                if(t==20)
                {
                        p10=0;
                        t=0;        
                }
        if(t!=20)
                p10=1;
                        
}

作者: m182892    时间: 2019-11-9 17:17
你试一下,if(t==20){t=0;p10=~p10;}
作者: csmyldl    时间: 2019-11-9 17:52
因为t==20时灯灭的时间相当短,而t!=20时灯亮的时间相当长而已
作者: 圈圈圆圈    时间: 2019-11-9 18:26
当你的t=20的时候,你又令t=0了,所以又会进入下一个if,具体怎么改可以参考楼上那位的代码
作者: bh2030693    时间: 2019-11-9 19:02

#include <reg52.h>
sbit p10 = P1 ^ 0;
code unsigned int kTimeValue = 65536 - 45872;

//初始化函数
void InitTimer0(void) {
  TMOD = 0x01;                            //设置定时器0工作模式1
  TL0 = kTimeValue;
  TH0 = kTimeValue >> 8; //计数器装初值
  ET0 = 1;                                //开计数器0中断
  TR0 = 1;                                //启动定时器0
  EA = 1;                                 //开总中断
}

void main(void) {
  InitTimer0();
  while (1) {
  }
}

void time0(void) interrupt 1 {
  static int t;

  TL0 = kTimeValue;
  TH0 = kTimeValue >> 8; //计数器装初值

  t++;
  if (t >= 20) {
    t = 0;
    p10 = !p10;
  }
}




没实际测试,你可以试一下。
P1.0是bit,不能用“~”取反,可以用“!”取反。
如果亮灭时间不同,需要稍稍修改一下:

  t++;
  if (t == 20) {
    p10 = 0;
  } else if (t >= 60) {
    t = 0;
    p10 = 1;
  }



作者: 人间不许有白头    时间: 2019-11-9 20:09
建议还用定时器1,比较好用
作者: chao123456    时间: 2019-11-12 11:41
把if(t!=20)放主函数里试试
作者: 八月初    时间: 2019-11-21 16:33
试试我这个:
#include<reg52.h>

sbit p10 = P1^0;
unsigned char t = 0;

void InitTimer0()    //初始化函数
{        
        TMOD=0x01;    //设置定时器0工作模式1
        TH0=(65536-45872)/256;    //计数器装初值
        TL0=(65536-45872)%256;
        EA=1;              //开总中断
        ET0=1;             //开计数器0中断
        TR0=1;             //启动定时器0
}

void main()
{        
        InitTimer0();
       
        while(1);
}


void time0() interrupt 1
{
        TH0=(65536-45872)/256;    //计数器装初值
        TL0=(65536-45872)%256;

        t++;
        if(t == 20)
        {
                p10 = ~p10;
                t=0;        
        }              
} 我测试可以的




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1