社区导航

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

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

[复制链接]

16

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2017-12-6 20:48:04 | 显示全部楼层 |阅读模式
为什么我用外部中断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单片机论坛


回复

使用道具 举报

108

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

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


回复

使用道具 举报

1292

TA的帖子

0

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

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


回复

使用道具 举报

1万

TA的帖子

15

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-12-7 09:11:13 | 显示全部楼层
是的,你中断处理函数有WHILE就死终在那里转,死秋秋了
http://shop34182318.taobao.com/


回复

使用道具 举报

2927

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-12-7 13:04:42 | 显示全部楼层
死秋秋了


回复

使用道具 举报

2927

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

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


回复

使用道具 举报

16

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

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

可以嵌套,,,,,


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


回复

使用道具 举报

363

TA的帖子

1

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

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


回复

使用道具 举报

16

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

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

那应该怎么改???

点评

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


回复

使用道具 举报

16

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

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

哦(⊙o⊙)


回复

使用道具 举报

16

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

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

那要延时怎么办.。。。


回复

使用道具 举报

16

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

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

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


回复

使用道具 举报

363

TA的帖子

1

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

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

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


回复

使用道具 举报

16

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

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

okok,试试


回复

使用道具 举报

7

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

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

               
        
        


回复

使用道具 举报

20

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-12-8 10:23:31 | 显示全部楼层
注意优先级
MCU单片机QQ37806425
一级代理,免费开发。


回复

使用道具 举报

3080

TA的帖子

0

TA的资源

纯净的硅(高级)

Rank: 6Rank: 6

发表于 2017-12-8 17:19:50 来自手机 | 显示全部楼层
嗯,死扣扣了


回复

使用道具 举报

1676

TA的帖子

0

TA的资源

裸片初长成(高级)

Rank: 12Rank: 12Rank: 12

发表于 2017-12-14 00:28:03 来自手机 | 显示全部楼层
main()下加一句PX0=1;


回复

使用道具 举报

16

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

 楼主| 发表于 2017-12-15 19:58:03 | 显示全部楼层

为什么???

点评

一个中断要想打断另一个中断,必须具有比另一个中断更高的中断优先级,PX0=1就是设置了外部中断0比其余中断的中断优先级高,其余未置1的均为0,“0”是低优先级。  详情 回复 发表于 2018-1-7 18:07


回复

使用道具 举报

1

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2017-12-16 11:34:22 | 显示全部楼层
不修改优先级前,默认都是外部中断0优先!

点评

不修改的话,它们是同级别的,都是低优先级,互相不能打断的。 只是当若干个中断在单片机某同一周期到达时,CPU最先采样谁,谁就最先被执行。采样顺序是外部引脚P3.2中断0、定时器0中断、外部引脚P3.2中断1、定时器  详情 回复 发表于 2018-1-7 18:12


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

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

GMT+8, 2018-2-22 16:27 , Processed in 0.553173 second(s), 18 queries , Redis On.

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