新闻中心

EEPW首页>嵌入式系统>设计应用> 单片机中断问题30例

单片机中断问题30例

作者: 时间:2013-05-07 来源:网络 收藏

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)两个中断是因为一般的单片机有两个中断源,可以实现两级中断嵌套,在实现复杂功能上两级中断嵌套很有用。

(2)

EA--总中断允许位,必须为1

ES--串行中断允许位,不必开,为0

EX0--外部中断0允许位,应为1

ET0--定时计数溢出中断允许位,不必开,为0


上一页 1 2 3 4 5 6 7 8 下一页

评论


相关推荐

技术专区

关闭