单片机中断问题30例
一、单片机中断问题30例
1、单片机外中断INT0为下降沿触发,当中断被触发后cpu执行中断程序,若本次中断的程序还未执行完INT0又来了一个相同的下降沿中断信号怎么办?cpu会怎么处理?若是定时器中断呢?串口中断呢?求解释
答:再来一个INT0信号不会执行。相同的优先级不会打断正在执行的中断。
一. 如果是高优先级的中断来了,会打断低优先级的正在执行的中断而执行高优先级的中断。
51单片机的默认(此时的IP寄存器不做设置)中断优先级为:
外部中断0 > 定时/计数器0 > 外部中断1 > 定时/计数器1 > 串行中断;
当同时有几种中断到达时,高优先级中断会先得到服务。
例如:当计数器0中断和外部中断1(优先级 计数器0中断>外部中断1)同时到达时,会进入计时器0的中断服务函数;但是在外部中断1的中断服务函数正在服务的情况下,这时候任何中断都是打断不了它的,包括逻辑优先级比它高的外部中断0计数器0中断。
51单片机的中断优先级控制寄存器IP可以把默认的中断优先级设置为高或低级,
例如默认是外部中断0 > 定时/计数器0 > 外部中断1 > 定时/计数器1 > 串行中断;
现在设为定时1 和串行中断为高优先级 其它为低 ,那么中断0执行时会被定时器1 或串行中断打断,如果设定的两个高优先级定时/计数器1 和串行中断同时响应,会再自然排队,先执行定时1中断再执行串行中断。
2、单片机中断问题,中断3为什么不执行,整个程序有什么不对的地方呢?
#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;
}
答:没有主循环,
没有等到中断3
程序运行一次就跑飞了!!!
在
void main(void)
{
//...你的程序
//在这里加 死循环,等待中断
while(1)
{
;
}
}
而且,中断响应函数里必须要清中断标志位(你的没有)!
3、各位大侠帮我看一下我写的51单片机C程序中断有没有问题,执行中断后不能继续执行主程序,注: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++);
d7=0;
for(c=0;c25000;c++);
d7=1;
}
答:
IT0=0;//低电平触发,只要单片机监测到是低电平,就触发中断
你P3.2一直接地,一直是低电平,那中断就不断的执行,当然回不到主程序中了。
改成IT0=1;//下降沿触发,单片机监测到高电平到电平跳变,就触发中断
就算P3.2一直接地,也只触发一次,中断执行完了,就回到主程序中了。
4、我的单片机这个程序为什么不能完全执行整个程序谁能告
- FPGA的DSP性能揭秘(06-16)
- 基于单片机通用引脚的软件UART设计(10-16)
- 分时操作系统思想在单片机中的具体应用 (10-30)
- 基于AT89C51+DSP的双CPU伺服运动控制器的研究(05-26)
- 关于RTX51 TINY的分析与探讨(05-30)
- 基于MC9S12DGl28单片机的智能寻迹车设计(04-03)