找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2197|回复: 7
收起左侧

单片机定时器中断0为什么中断中打开的灯一直亮

[复制链接]
ID:95352 发表于 2019-11-9 14:04 | 显示全部楼层 |阅读模式
#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;
                        
}
回复

使用道具 举报

ID:56665 发表于 2019-11-9 17:17 | 显示全部楼层
你试一下,if(t==20){t=0;p10=~p10;}
回复

使用道具 举报

ID:235200 发表于 2019-11-9 17:52 | 显示全部楼层
因为t==20时灯灭的时间相当短,而t!=20时灯亮的时间相当长而已
回复

使用道具 举报

ID:638764 发表于 2019-11-9 18:26 | 显示全部楼层
当你的t=20的时候,你又令t=0了,所以又会进入下一个if,具体怎么改可以参考楼上那位的代码
回复

使用道具 举报

ID:245004 发表于 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;
  }


回复

使用道具 举报

ID:638300 发表于 2019-11-9 20:09 来自手机 | 显示全部楼层
建议还用定时器1,比较好用
回复

使用道具 举报

ID:640309 发表于 2019-11-12 11:41 来自手机 | 显示全部楼层
把if(t!=20)放主函数里试试
回复

使用道具 举报

ID:415088 发表于 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;        
        }              
} 我测试可以的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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