微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 单片机中断问题30例

单片机中断问题30例

时间:05-07 来源:互联网 点击:

也有的CPU具有“优先次序”机制,可以在某一级的中断服务程序里禁止优先级不比自己高的其他中断来打断自己。同时,也提供给程序员有“放弃优先权”以及“修改优先级”的灵活性。

而被优先机制暂时“屏蔽”的那些较低优先级的中断申请,同样挂号仍在,以后高优先级的中断结束以后,还能响应。

不过需要注意,大多数的CPU中,“中断挂号”是只能挂一个的。也就是说,在前一次的中断申请所挂的号还没有被清除以前,又来了下一个中断申请,那么,第二个挂号是挂不上的。

不过某些处理器中,中断挂号可能分成几个层次:CPU里面是一层,外围针对各个具体的设备,还有另外一级“预备挂号”,那就比较复杂了。

另外多说几句:上面已经说,程序员可以自己决定你的中断服务程序允许还是不允许“嵌套”。

如果不允许,您可以采用关中断的办法,或者利用优先机制,来屏蔽同一中断源的第二个中断请求。

这样,第二个中断就不会被响应。但它仍可以挂上一个号(只要它发生在上一个中断挂号已经被清除掉以后的时间)。然后,中断服务程序结束时,一般都会开中断并释放优先级屏蔽。然后,第二个中断请求就会被响应,于是再一次执行中断服务程序。

如果允许“嵌套”,那就会如我上面所说:

一次中断服务程序的执行中途又被打断并进入了和自己一样的中断服务程序,并从头到尾执行一遍,结束后返回到先前打断的那一点,并继续执行后半截服务程序。

26、我用51单片机定时/计数器1计数为什么不计数?想让它记数产生中断让蜂鸣器响。

sbit fengming=P1^6;

void main()

{

TMOD=0x50;

EA=1;

ET1=1;

TH1=0xff;//来一次中断记一次数

TL1=0xff;

TR1=1;

}

void time1(void) interrupt 3

{

fengming=0;

}

答:

不知道是你在网页上打错了,还是怎么回事。

void time1(void) interrupt 3-------》void timer1(void) interrupt 3

主程序最后,要加个死循环:while(1){};

还有,你在这用了方式1,这个方式在你进中断后,TH1和TL1会变成0000H。你不对他重新赋值,你要等FFFFH次计数,才会进中断。

27MCS-51 单片机定时器/计数器1的中断入口地址是: 一共有四个A. 0003H B. 000BH C. 0013H D. 001BH,到底是是哪一个?

答:答案是D.1BH

因为:

外中断0——03h

定时器0——0bh

外中断1——13h

定时器1——1bh

串口———23h

请背熟

28、我看很多程序都是主程序进入while(1),就死在while(1)里了,然后等待外中断。那么现在的问题是我想让它进入外中断完事后,跳过while(1),执行下边的程序,该怎么办?

while里边用break吗?不知道好使不好使,还有标志位我看是硬件自动清零,查询标志应该不能用吧,那该怎么办呢?

答:

结束while(1)语句最好的方法就是使用break来跳出死循环,关键就是选择合适的flag(标志位),如果说中断标志位是硬件自动清零的话,那么楼主不妨在中断服务子程序中自己加入一个标志位:如果用汇编语言的话,PSW中的F0位就可以很好的使用;如果用C的话,就可以随便定义一个位变量,如bit a=0;。也就是说,楼主需要在程序中定义一个位变量a,在中断服务子程序中将a置1,退出中断后查询a是否为1,例如:if(a) {a=0;break;}这样就跳出了while语句了。

比方说,如果楼主想写一个等待按键按下中断的程序,就可以用while(!a);而不用while(1)语句了。

29、我用外部中断1,中断一次显示下一个数,数码管显示没问题。但是我用P3-3口用导线连接,接触一次地线,松开一次,这时候数码管显示会乱跳,有时候加两次数,有时候加好多次数,反正就是不稳定。假如p3-3口通过按键接地的话,按一次按键一般情况会加一次数,但有时候也是不稳定,可能中断好几次。

程序如下:

#include

#define uint unsigned int

#define uchar unsigned char

uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

uchar times;

uchar i=0;

void delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=112;y>0;y--);

}

void main()

{

EA=1;

EX1=1;

IT1=1;

while(1)

{

P1=table[i];

P2=0x00;

}

}

void into() interrupt 2

{ delay(1000);

i++;

if(i==10) i=1;

}

答:

是抖动的问题。

应该采取消抖措施,硬件、软件方法皆可。

----

楼主在中断函数中,延时,时间看来很是不短!

但是延时后,并没有检测按键是否还在按下,这就不能算是软件消抖。

30、 (1) 为什么单片机有两个外部中断0允许位?有什么作用?

(2)在51内核单片机中,当允许响应外部中断0的中断请求时,其特殊功能寄存器ie中的位必须为1 es exo ea et0?

答:

(1)两个中断是因为一般的单片机有两个中断源,可以实现两级中断嵌套,在实现复杂功能上

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top