社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
  • 干货
搜索
查看: 284|回复: 16

[求助] 51单片机中断!!!

[复制链接]

13

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 6 天前 | 显示全部楼层 |阅读模式
为什么我用外部中断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;          
             }
          }
}

此帖出自51单片机论坛


回复

使用道具 举报

100

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

发表于 6 天前 | 显示全部楼层
中断的“打断”和while无关,while挡不住中断。应该是和优先级有关,仔细看一下你单片机优先级部分的说明


回复

使用道具 举报

1276

TA的帖子

0

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

发表于 5 天前 | 显示全部楼层
中断里不要使用延时函数,更不能直接使用while循环


回复

使用道具 举报

1万

TA的帖子

15

TA的资源

版主

Rank: 6Rank: 6

发表于 5 天前 | 显示全部楼层
是的,你中断处理函数有WHILE就死终在那里转,死秋秋了
http://shop34182318.taobao.com/


回复

使用道具 举报

2867

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

发表于 5 天前 | 显示全部楼层
死秋秋了


回复

使用道具 举报

2867

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

发表于 5 天前 | 显示全部楼层
51的中断是不能嵌套的,只有一个优先级决定同时来的中断先处理哪个。


回复

使用道具 举报

13

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

 楼主| 发表于 5 天前 | 显示全部楼层
huo_hu 发表于 2017-12-7 13:06
51的中断是不能嵌套的,只有一个优先级决定同时来的中断先处理哪个。

可以嵌套,,,,,


CVX@URK4ZBN{[(A8}{N5YRT.png


回复

使用道具 举报

359

TA的帖子

1

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 5 天前 | 显示全部楼层
你的定时器中断第一次进去就再也出不来了,外部中断就算打断一下,把led1变成1,很快又被你的死循环变成0了,所以你看不到灯的变化


回复

使用道具 举报

13

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

 楼主| 发表于 5 天前 | 显示全部楼层
飞翔荷兰人号 发表于 2017-12-7 20:27
你的定时器中断第一次进去就再也出不来了,外部中断就算打断一下,把led1变成1,很快又被你的死循环变成0了 ...

那应该怎么改???

点评

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


回复

使用道具 举报

13

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

 楼主| 发表于 5 天前 | 显示全部楼层
风过琴弦 发表于 2017-12-6 23:44
中断的“打断”和while无关,while挡不住中断。应该是和优先级有关,仔细看一下你单片机优先级部分的说明

哦(⊙o⊙)


回复

使用道具 举报

13

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

 楼主| 发表于 5 天前 | 显示全部楼层
sint27 发表于 2017-12-7 08:19
中断里不要使用延时函数,更不能直接使用while循环

那要延时怎么办.。。。


回复

使用道具 举报

13

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

 楼主| 发表于 5 天前 | 显示全部楼层
ddllxxrr 发表于 2017-12-7 09:11
是的,你中断处理函数有WHILE就死终在那里转,死秋秋了

意思是高级中断不能打断含while(1)的低级中断了???


回复

使用道具 举报

359

TA的帖子

1

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 5 天前 | 显示全部楼层
Lenmon丶绪 发表于 2017-12-7 20:34
那应该怎么改???

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


回复

使用道具 举报

13

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

 楼主| 发表于 5 天前 | 显示全部楼层
飞翔荷兰人号 发表于 2017-12-7 20:51
直接把while(1)和中括号去掉就可以了,你需要让程序不断地进入定时器中断,而不是卡在第一次出不来。但 ...

okok,试试


回复

使用道具 举报

7

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 4 天前 | 显示全部楼层
你的意思是在定时器中断过程中,跳入外部中断?
如果是这样:
1、中断时间一般都很短,你很难把握在定时器中断中跳入外部中断的时间点,我是说调试有点麻烦。
2、可以实现
   (1)将外部中断设置为更高一层的中断优先级。同一层次的中断,虽然也排序(有优先级),仅在中断同时到来时,抢得中断先执行。
   (2)程序中巧妙设置,进入中断即退出,如:
    int_t0:
         LCALL EXIT_T0
               ...
                定时器中断程序
         ...
                RET     ;主意该句
         EXIT_T0:
                RETI    ;主意该句

               
        
        


回复

使用道具 举报

9

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 4 天前 | 显示全部楼层
注意优先级
MCU单片机QQ37806425
一级代理,免费开发。


回复

使用道具 举报

3033

TA的帖子

0

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

发表于 4 天前 来自手机 | 显示全部楼层
嗯,死扣扣了


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2017-12-12 12:36 , Processed in 0.578125 second(s), 17 queries , Redis On.

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