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) 还请多多指教! 多谢点击!确实有挂起,已经解决! 还是用C吧
唉,看不懂了 个人习惯51用汇编!其它用C 你的定时器是在1S后打开外部中断。你的外部中断是一直处于打开的状态,外部中断一产生,OUT 就是一直会是高电平。
而且你没有在出外部中断的时候关闭外部中断。所以外部中断一直存在。 感谢zhpowerpcb 冷月的回答,
程序的意思是1S后才打开外中断的,那么说1S之前按下外中断是无效的,问题就在1S前按下外中断后仍会挂起外中断,但不马上处理,等到1S后才处理!这就是我不明白的,明明是1S后才打开外中断的!
就算在初始化外中断为CLR EX0 时,也会发生以上情况!
欢迎深入! 为方便用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);
} 我看你也是初学者
给你讲啊:你上电一瞬间(1S)后就把外部中断打开拉,而且你把定时器关闭拉(之后没有打开定时器),然后一直运行
LOOP:
NOP
NOP
NOP
LJMP LOOP
外部中断产生OUT输出高电平,就会一直是高电平,不会变成低电平拉,因为你在定时器里已关闭了
CLR TR0 ;关闭定时器
改成
进入外部中断后打开定时器
SETB TR0 再次感谢zhpowerpcb 冷月的回答,但不完全理解我的意思。
我要的是那1S后按外中断才有效,也就是说1S后按下外中断才会OUT输出高电平。
问题是在1S内按下外中断,1S后OUT也会输出高电平。很明显,1S内外中断未打开。
已经解决,不能在定时处理中关闭定时器!完毕!
再次感谢!!./emotion/em007.gif
页:
[1]