一、中断
1.中断系统结构
中断系统共有5个中断请求源:
(1)INT0*—外部中断请求0,外部中断请求信号(低电平或负跳变有效)由INT0*引脚输入,中断请求标志为IE0。 (2)INT1*—外部中断请求1,外部中断请求信号(低电平或负跳变有效)由INT1*引脚输入,中断请求标志为IE1。 (3)定时器/计数器T0计数溢出的中断请求,标志为TF0。 (4)定时器/计数器T1计数溢出的中断请求,标志为TF1。 (5)串行口中断请求,标志为发送中断TI或接收中断RI。
2.一级中断
#include <reg51.h>
#define uchar unsigned char
void Delay(unsigned int i)
{
unsigned int j;
for(;i>0;i--)
{
for(j=0;j<333;j++)
{;}
}
}
void main()
{
EA=1;
EX0=1;
IT0=1;
while(1)
{
P2=0;
}
}
void int0() interrupt 0 using 0
{
uchar m;
EX0=0;
for(m=0;m<5;m++)
{
P2=0x0f;
Delay(400);
P2=0xf0;
Delay(400);
EX0=1;
}
}
3.二级中断
#include <reg51.h>
#define uchar unsigned char
void Delay(unsigned int i)
{
uchar j;
for(;i>0;i--)
{
for(j=0;j<125;j++)
{;}
}
}
void main()
{
uchar display[9]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned int a;
for(;;)
{
EA=1;
EX0=1;
EX1=1;
IT0=1;
IT1=1;
IP=0;
for(a=0;a<9;a++)
{
Delay(500);
P2=display[a];
}
}
}
void int0_isr(void) interrupt 0 using 1
{
uchar n;
for(n=0;n<10;n++)
{
P2=0x0f;
Delay(500);
P2=0xf0;
Delay(500);
}
}
void int1_isr(void) interrupt 2 using 2
{
uchar m;
for(m=0;m<10;m++)
{
P2=0xff;
Delay(500);
P2=0;
Delay(500);
}
}
4.嵌套中断
#include <reg51.h>
#define uchar unsigned char
void Delay(unsigned int i)
{
unsigned int j;
for(;i>0;i--)
for(j=0;j<125;j++)
{;}
}
void main()
{
uchar display[9]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar a;
for(;;)
{
EA=1;
EX0=1;
EX1=1;
IT0=1;
IT1=1;
PX0=0;
PX1=1;
for(a=0;a<9;a++)
{
Delay(500);
P2=display[a];
}
}
}
void int0_isr(void) interrupt 0 using 0
{
for(;;)
{
P2=0x0f;
Delay(500);
P2=0xf0;
Delay(500);
}
}
void int1_isr(void) interrupt 2 using 1
{
uchar m;
for(m=0;m<5;m++)
{
P2=0;
Delay(500);
P2=0xff;
Delay(500);
}
}
二、定时器
1.工作原理
定时器/计数器T0由特殊功能寄存器TH0、TL0构成,T1由特殊功能寄存器TH1、TL1构成。
T0、T1都有定时器和计数器两种工作模式,两种模式实质都是对脉冲信号进行计数,只不过计数信号来源不同。
计数器模式是对加在T0(P3.4)和T1(P3.5)两个引脚上的外部脉冲进行计数;
定时器模式是对系统时钟信号经12分频后的内部脉冲信号(机器周期)计数。由于系统时钟频率是定值,可根据计数值计算出定时时间。两个定时器/计数器属于增1计数器,即每计一个脉冲,计数器增1。
2.应用
P1口外接的8只LED每0.5s闪亮一次
#include <reg51.h>
char i=100;
void main()
{
TMOD=0x01;
TH0=0xdc;
TL0=0x00;
P2=0x00;
EA=1;
ET0=1;
TR0=1;
while(1);
{;}
}
void timer0() interrupt 1
{
TH0=0xdc;
TL0=0x00;
i--;
if(i<=0)
{
P2=~P2;
i=100;
}
}
三、总结
通过本次实验,我们学习了解了单片机中断与定时计数的概念和用法。此博客为学习实验报告,多有不足。