51单片机中断!!!

2019-03-24 17:00发布

为什么我用外部中断0不能打断定时器中断0?????
是不是定时器中断服务函数有while(1)???










#include"reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit led=P0^0;
sbit k4=P3^2;
sbit led1=P0^1;
void delay(u16 i)
{
         while(i--);
}
void int0init()
{
        IT0=1;
    EX0=1;
        EA=1;
}
void timer0init()
{         
     TMOD|=0X01;
     TH0=0XFC;
         TL0=0X18;
         ET0=1;
         EA=1;
         TR0=1;
}
void main()
{    int0init();timer0init();
         led=0;led1=0;
     while(1);
         
                                         
}
void int0() interrupt 0
{
          if(k4==0)
          {         
             delay(1000);
                   led1=1;       
          }
}
void timer0() interrupt 1
{        while(1)
        { static u16 i;
      TH0=0XFC;                       
      TL0=0X18;          
          i++;
          
             if(i==1000)
             {  
                     delay(50000);
                 i=0;
                 led=~led;
                     led1=0;          
             }
          }
}

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
飞翔荷兰人号
1楼-- · 2019-03-25 23:32
你的定时器中断第一次进去就再也出不来了,外部中断就算打断一下,把led1变成1,很快又被你的死循环变成0了,所以你看不到灯的变化
Lenmon丶绪
2楼-- · 2019-03-26 01:01
 精彩回答 2  元偷偷看……
Lenmon丶绪
3楼-- · 2019-03-26 03:13
风过琴弦 发表于 2017-12-6 23:44
中断的“打断”和while无关,while挡不住中断。应该是和优先级有关,仔细看一下你单片机优先级部分的说明

哦(⊙o⊙)
Lenmon丶绪
4楼-- · 2019-03-26 06:10
sint27 发表于 2017-12-7 08:19
中断里不要使用延时函数,更不能直接使用while循环

那要延时怎么办.。。。
Lenmon丶绪
5楼-- · 2019-03-26 11:56
 精彩回答 2  元偷偷看……
飞翔荷兰人号
6楼-- · 2019-03-26 13:08
Lenmon丶绪 发表于 2017-12-7 20:34
那应该怎么改???

直接把while(1)和中括号去掉就可以了,你需要让程序不断地进入定时器中断,而不是卡在第一次出不来。但是这样的程序总体来说还是有问题,但估计至少能看到点现象了

一周热门 更多>