搜索
bottom↓
回复: 9

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

[复制链接]

出0入0汤圆

发表于 2012-2-20 11:22:44 | 显示全部楼层 |阅读模式
一,程序想要达到的效果。
接上电源定时器启动,计数值达到后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)

出0入0汤圆

 楼主| 发表于 2012-2-20 11:32:00 | 显示全部楼层
还请多多指教!

出0入0汤圆

 楼主| 发表于 2012-2-20 12:47:55 | 显示全部楼层
多谢点击!确实有挂起,已经解决!

出0入0汤圆

发表于 2012-2-20 12:48:00 | 显示全部楼层
还是用C吧
唉,看不懂了

出0入0汤圆

 楼主| 发表于 2012-2-20 12:48:46 | 显示全部楼层
个人习惯51用汇编!其它用C

出0入0汤圆

发表于 2012-2-20 13:01:53 | 显示全部楼层
你的定时器是在1S后打开外部中断。你的外部中断是一直处于打开的状态,外部中断一产生,OUT 就是一直会是高电平。
而且你没有在出外部中断的时候关闭外部中断。所以外部中断一直存在。

出0入0汤圆

 楼主| 发表于 2012-2-20 13:31:54 | 显示全部楼层
感谢zhpowerpcb 冷月的回答,
程序的意思是1S后才打开外中断的,那么说1S之前按下外中断是无效的,问题就在1S前按下外中断后仍会挂起外中断,但不马上处理,等到1S后才处理!这就是我不明白的,明明是1S后才打开外中断的!
就算在初始化外中断为CLR EX0 时,也会发生以上情况!

欢迎深入!

出0入0汤圆

 楼主| 发表于 2012-2-20 14:13:03 | 显示全部楼层
为方便用C的大大们分析!以下贴上C写的!
#include <reg51.h>

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

#define ON  0
#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);

}

出0入0汤圆

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

出0入0汤圆

 楼主| 发表于 2012-2-20 14:32:49 | 显示全部楼层
再次感谢zhpowerpcb 冷月的回答,但不完全理解我的意思。
我要的是那1S后按外中断才有效,也就是说1S后按下外中断才会OUT输出高电平。
问题是在1S内按下外中断,1S后OUT也会输出高电平。很明显,1S内外中断未打开。


已经解决,不能在定时处理中关闭定时器!完毕!
再次感谢!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-7 12:55

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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