菜鸟自结,大神飘过。
发现自己以前学习51单片机存在很多问题!
今天被问到一个问题才发现自己的学习态度很糟糕。初学51时,不是很理解51中断和while(1)的关系,一直以为中断就应该有while(1)。今天才了解,其实并不是这样的。
while(1)和中断的关系其实可以理解为程序时长和中断的关系。
程序时长就是运行一次程序所要花费的时间。
只要程序时长>中断时长就可以满足中断的时长条件。当程序时长小于中断时长时,在一次程序执行完成,中断还没有发生,所以没有达到中断服务的目的。
看一下这两个程序
程序1
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit led=P1^0;
sbit led1=P1^1;
uint num=0;
void delay(uint z)
{
uint a,b;
for(a=z;a>0;a--)
for(b=110;b>0;b--);
}
void main()
{
TMOD=0x01; //定时器0工作方式一
TH0=(65536-50000)/256; //50ms一次中断
TL0=(65536-50000)%256;
EA=1; //打开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0中断
led1=0;
while(1);
}
void zhongduan() interrupt 1
{
TH0=(65536-50000)/256; //50ms一次中断
TL0=(65536-50000)%256;
num++;
if(num==4) //50*4ms让led取反
{
num=0;
led=~led;
}
}
程序2
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit led=P1^0;
sbit led1=P1^1;
uint num=0;
void delay(uint z)
{
uint a,b;
for(a=z;a>0;a--)
for(b=110;b>0;b--);
}
void main()
{
TMOD=0x01; //定时器0工作方式一
TH0=(65536-50000)/256; //50ms一次中断
TL0=(65536-50000)%256;
EA=1; //打开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0中断
led1=0;
delay(230);
}
void zhongduan() interrupt 1
{
TH0=(65536-50000)/256; //50ms一次中断
TL0=(65536-50000)%256;
num++;
if(num==4)
{
num=0;
led=~led;
}
}
这两个程序几乎一模一样。就是main函数尾部的while(1)和delay(230)不一样。但是他们都可以达到中断的时长。效果几乎是一样的。可能不一样的就是程序被处理器执行的次数了,有while(1)的程序执行的次数可以做到只有一次,delay(230)被执行的次数为N。N可以很大,N也可能为1,N取决于运行时长。
所以while(1)和中断的关系就是程序执行时长与中断时长的关系了!
其实自己又有了一个疑问?为什么程序时长=中断时长时,中断还是产生不了呢?是时间片的原因?
目前还没有办法验证猜想,有答案的朋友可以评论告诉我。