單片機(jī)中斷問題30例
1、單片機(jī)外中斷INT0為下降沿觸發(fā),當(dāng)中斷被觸發(fā)后cpu執(zhí)行中斷程序,若本次中斷的程序還未執(zhí)行完INT0又來了一個(gè)相同的下降沿中斷信號怎么辦?cpu會(huì)怎么處理?若是定時(shí)器中斷呢?串口中斷呢?求解釋
答:再來一個(gè)INT0信號不會(huì)執(zhí)行。相同的優(yōu)先級不會(huì)打斷正在執(zhí)行的中斷。
一. 如果是高優(yōu)先級的中斷來了,會(huì)打斷低優(yōu)先級的正在執(zhí)行的中斷而執(zhí)行高優(yōu)先級的中斷。
51單片機(jī)的默認(rèn)(此時(shí)的IP寄存器不做設(shè)置)中斷優(yōu)先級為:
外部中斷0 > 定時(shí)/計(jì)數(shù)器0 > 外部中斷1 > 定時(shí)/計(jì)數(shù)器1 > 串行中斷;
當(dāng)同時(shí)有幾種中斷到達(dá)時(shí),高優(yōu)先級中斷會(huì)先得到服務(wù)。
例如:當(dāng)計(jì)數(shù)器0中斷和外部中斷1(優(yōu)先級 計(jì)數(shù)器0中斷>外部中斷1)同時(shí)到達(dá)時(shí),會(huì)進(jìn)入計(jì)時(shí)器0的中斷服務(wù)函數(shù);但是在外部中斷1的中斷服務(wù)函數(shù)正在服務(wù)的情況下,這時(shí)候任何中斷都是打斷不了它的,包括邏輯優(yōu)先級比它高的外部中斷0計(jì)數(shù)器0中斷。
51單片機(jī)的中斷優(yōu)先級控制寄存器IP可以把默認(rèn)的中斷優(yōu)先級設(shè)置為高或低級,
例如默認(rèn)是外部中斷0 > 定時(shí)/計(jì)數(shù)器0 > 外部中斷1 > 定時(shí)/計(jì)數(shù)器1 > 串行中斷;
現(xiàn)在設(shè)為定時(shí)1 和串行中斷為高優(yōu)先級 其它為低 ,那么中斷0執(zhí)行時(shí)會(huì)被定時(shí)器1 或串行中斷打斷,如果設(shè)定的兩個(gè)高優(yōu)先級定時(shí)/計(jì)數(shù)器1 和串行中斷同時(shí)響應(yīng),會(huì)再自然排隊(duì),先執(zhí)行定時(shí)1中斷再執(zhí)行串行中斷。
2、單片機(jī)中斷問題,中斷3為什么不執(zhí)行,整個(gè)程序有什么不對的地方呢?
#include
#define uint unsigned int
#define uchar unsigned char
sbit p1_0=P1^0;
sbit p1_1=P1^1;
sbit p1_2=P1^2;
sbit p1_3=P1^3;
sbit p1_4=P1^4;
sbit p1_5=P1^5;
uchar PWM_T1 = 0;
uchar PWM_T2 = 0;
uint i,m;
void delay(uint z)
{
for(i=z;i>0;i--)
for(m=0;m110;m++);
}
void PWM_value_left(int pwm_set)
{
PWM_T1=pwm_set;
}
void PWM_value_right(int pwm_set)
{
PWM_T2=pwm_set;
}
void main(void)
{
bit flag = 1;
uint n;
TMOD=0x22;
TH0=241;
TH1=241;
TL0=241;
TL1=241;
TR0=1;
TR1=1;
ET0=1;
ET1=1;
EA=1;
P1=0xf0;
delay(20);
PWM_value_left(7);
PWM_value_right(10);
delay(100);
PWM_value_left(8);
PWM_value_right(9);
delay(100);
PWM_value_left(9);
PWM_value_right(8);
delay(100);
PWM_value_left(10);
PWM_value_right(7);
}
timer0() interrupt 1 using 2
{
static uint t ;
t++;
if(t==10)
{
t=0;
p1_0=1;
p1_1=0;
}
if(PWM_T1==t)
P1=P10xfc;
}
timer1() interrupt 3
{
static uint t1 ;
t1++;
if(t1==10)
{
t1=0;
p1_2=1;
p1_3=0;
}
if(PWM_T2==t1)
P1=P10xf3;
}
答:沒有主循環(huán),
沒有等到中斷3
程序運(yùn)行一次就跑飛了!!!
在
void main(void)
{
//...你的程序
//在這里加 死循環(huán),等待中斷
while(1)
{
;
}
}
而且,中斷響應(yīng)函數(shù)里必須要清中斷標(biāo)志位(你的沒有)!
3、各位大俠幫我看一下我寫的51單片機(jī)C程序中斷有沒有問題,執(zhí)行中斷后不能繼續(xù)執(zhí)行主程序,注:P3.2口一直接
注:P3.2口一直接地,程序如下:
#include
sbit dula=P2^6;
sbit wela=P2^7;
sbit d0=P1^0;
sbit d1=P1^1;
sbit d2=P1^2;
sbit d3=P1^3;
sbit d4=P1^4;
sbit d5=P1^5;
sbit d6=P1^6;
sbit d7=P1^7;
#define uchar unsigned char
#define uint unsigned int
uchar num;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint z);
void main()
{
EA=1;
EX0=1;
IT0=0;
wela=1;
P0=0xc0;
wela=0;
while(1)
{
for(num=0;num16;num++)
{
dula=1;
P0=table[num];
dula=0;
delay(1000);
}
}
}
void delay(uint z)
{
uint a,b;
for(a=z;a>0;a--)
for(b=110;b>0;b--);
}
void exter0() interrupt 0
{
uint c;
for(c=0;c25000;c++);
d0=0;
for(c=0;c25000;c++);
d0=1;
for(c=0;c25000;c++);
d1=0;
for(c=0;c25000;c++);
d1=1;
for(c=0;c25000;c++);
d2=0;
for(c=0;c25000;c++);
d2=1;
for(c=0;c25000;c++);
d3=0;
for(c=0;c25000;c++);
d3=1;
for(c=0;c25000;c++);
d4=0;
for(c=0;c25000;c++);
d4=1;
for(c=0;c25000;c++);
d5=0;
for(c=0;c25000;c++);
d5=1;
for(c=0;c25000;c++);
d6=0;
for(c=0;c25000;c++);
d6=1;
for(c=0;c25000;c++);
評論