hncel 发表于 2012-2-20 11:22:44

51中断是不是挂起了?请指教

一,程序想要达到的效果。
接上电源定时器启动,计数值达到后P1.1输出0,同时关闭定时器,打开外中断(所以在计数值未达到时,外中断是无效的)。
二,出现的问题。
定时器计数值未达到时外中断无效(因为未打开),但此时按下外中断按键,定时器计数值达到后竟然,转而处理外中断处理程序(计数值达到后未按下按键)。
       OUT        BIT                P1.0
       LED        BIT                P1.1               

       ORG        0000H
        LJMP        MAIN

       ORG         000BH                        ;定时器0中断处理入口
        LJMP         TNII0                         ;中断处理程序

       ORG        0003H                        ;外中断INT0入口
        LJMP        INTT                        ;外中断处理程序
       
       ORG        0030H
MAIN:
       MOV         TMOD,        #01H        ;工作模式设定T0工作在模式1
       MOV         TH0,        #3CH        ;装初值,定时时间,大概在50MS
       MOV         TL0,        #0B0H        ;装初值,定时时间,大概在50MS
        SETB         ET0                                ;开定时器中断
        SETB         EA                                ;开总中断
        SETB         TR0                                ;开定时器

        SETB        PT0                                ;定时器0为最高优先级
        SETB         IT0                                ;外中断INT0下降沿触发

       MOV        R7,        #0                ;
       CLR        OUT                                ;初始化为低电平
        SETB        LED                                ;用于查看定时器中断处理结束
LOOP:
       NOP
       NOP
       NOP
        LJMP        LOOP                        ;

TNII0:                                                ;定时器中断处理子程序       
        PUSH         PSW                         ;入栈
        PUSH         ACC                                ;入栈
       
       INC        R7                                ;
        CJNE        R7,#20,        OVER        ;
       MOV        R7,        #0                ;清零
        SETB        EX0                                ;开外中断
       CLR        TR0                                ;关闭定时器
       CLR        LED                                ;用于查看中断时间(结束)
OVER:
       POP         ACC                                ;出栈
       POP         PSW                                   ;出栈
         RETI
INTT:                                                ;外中断处理子程序
   PUSH         ACC                                 ;保护现场
   PUSH         PSW                                ;保护现场
   SETB                OUT                                ;切断OUT保护
    POP         ACC                                ;出栈
    POP         PSW                                   ;出栈
   RETI                                                ;返回
    END

附件:程序和仿真文件ourdev_720347YOGO8I.rar(文件大小:27K) (原文件名:中断实验.rar)

hncel 发表于 2012-2-20 11:32:00

还请多多指教!

hncel 发表于 2012-2-20 12:47:55

多谢点击!确实有挂起,已经解决!

xiaobendan001 发表于 2012-2-20 12:48:00

还是用C吧
唉,看不懂了

hncel 发表于 2012-2-20 12:48:46

个人习惯51用汇编!其它用C

zhpowerpcb 发表于 2012-2-20 13:01:53

你的定时器是在1S后打开外部中断。你的外部中断是一直处于打开的状态,外部中断一产生,OUT 就是一直会是高电平。
而且你没有在出外部中断的时候关闭外部中断。所以外部中断一直存在。

hncel 发表于 2012-2-20 13:31:54

感谢zhpowerpcb 冷月的回答,
程序的意思是1S后才打开外中断的,那么说1S之前按下外中断是无效的,问题就在1S前按下外中断后仍会挂起外中断,但不马上处理,等到1S后才处理!这就是我不明白的,明明是1S后才打开外中断的!
就算在初始化外中断为CLR EX0 时,也会发生以上情况!

欢迎深入!

hncel 发表于 2012-2-20 14:13:03

为方便用C的大大们分析!以下贴上C写的!
#include <reg51.h>

sbit OUT=P1^0;
sbit LED=P1^1;

#define ON0
#define OFF 1
#define RELOADTH0 0x3c
#define RELOADTL0 0x0b0

typedef unsigned char uchar;
uchar time=0,delaytime=20;

void inter1(void) interrupt 0 using 1
{
OUT=OFF;
}

void time0(void) interrupt 1 using 2
{
    time++;            
    TH0=RELOADTH0;           //装初值,定时时间,大概在50MS
    TL0=RELOADTL0;           //装初值,定时时间,大概在50MS
    if(time==delaytime)

      {         
      TR0=0;         //关闭定时器0
      ET0=0;         //禁止定时器0中断
       time=0;               
      EX0=1;         //允许外部中断0
      LED=ON;      //led亮
             }            

}

void main()
{
    TH0=RELOADTH0;           //装初值,定时时间,大概在50MS
    TL0=RELOADTL0;           //装初值,定时时间,大概在50MS
    OUT=ON;           //初始化为低电平
    LED=OFF;           //用于查看定时时间
   TMOD=0x01;           //工作模式设定T0工作在模式1
    IT0=1; //脉冲触发
   EA=1;
    ET0=1;          //允许定时0中断
    TR0=1;          //启动定时0
while(1);

}

zhpowerpcb 发表于 2012-2-20 14:14:21

我看你也是初学者
给你讲啊:你上电一瞬间(1S)后就把外部中断打开拉,而且你把定时器关闭拉(之后没有打开定时器),然后一直运行
LOOP:
NOP
NOP
NOP
LJMP LOOP
外部中断产生OUT输出高电平,就会一直是高电平,不会变成低电平拉,因为你在定时器里已关闭了
CLR TR0 ;关闭定时器
改成
进入外部中断后打开定时器
SETB TR0

hncel 发表于 2012-2-20 14:32:49

再次感谢zhpowerpcb 冷月的回答,但不完全理解我的意思。
我要的是那1S后按外中断才有效,也就是说1S后按下外中断才会OUT输出高电平。
问题是在1S内按下外中断,1S后OUT也会输出高电平。很明显,1S内外中断未打开。


已经解决,不能在定时处理中关闭定时器!完毕!
再次感谢!!./emotion/em007.gif
页: [1]
查看完整版本: 51中断是不是挂起了?请指教