实验报告:中断与定时计数

一、中断

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由特殊功能寄存器TH0TL0构成,T1由特殊功能寄存器TH1TL1构成。

T0T1都有定时器和计数器两种工作模式两种模式实质都是对脉冲信号进行计数,只不过计数信号来源不同。

     计数器模式是对加在T0P3.4)和T1P3.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;
  }
}

三、总结

通过本次实验,我们学习了解了单片机中断与定时计数的概念和用法。此博客为学习实验报告,多有不足。

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值