51单片机中断与定时计数

本文详细介绍了AT89S51单片机的中断原理,包括中断技术概述、中断系统结构、外部中断与定时器/计数器的应用、中断嵌套以及定时器和计数器中断的编程实例。通过实例演示,读者能掌握中断响应机制和高级中断处理技巧。
摘要由CSDN通过智能技术生成

目录

一、任务要求

二、中断系统

1.AT89S51中断技术概述          

2.AT89S51中断系统结构  

3.单一中断应用       

4.两个外部中断        

5.中断嵌套      

6.定时器中断

7.计数器中断

三、总结


一、任务要求

  1. 深入了解51单片机中断原理。掌握外部中断、定时器/计数器中断的编程方式;

  2. 了解中断响应、中断优先级、中断标志位复位等原理,掌握二级中断、中断嵌套的具体应用编程;

  3. 了解定时器/计数器的工作原理,掌握计数器初值计算方法,定时/计数中断服务的编程开发。

二、中断系统

1.AT89S51中断技术概述  
        中断技术主要用于实时监测与控制,要求单片机能及时地响应中断请求源提出的服务请求,并快速响应与及时处理。       当中断请求源发出中断请求时,如中断请求被允许,单片机暂时中止当前正在执行的主程序,转到中断服务处理程序处理中断服务请求,处理完中断服务请求后,再回到原来被中止的程序之处(断点),继续执行被中断的主程序。
2.AT89S51中断系统结构
        中断系统有5个中断请求源(简称中断源),2个中断优先级,可实现2级中断服务程序嵌套。每一中断源可用软件独立控制为允许中断或关闭中断状态;每一个中断源的优先级均可用软件设置。

(1)INT0*—外部中断请求0,外部中断请求信号(低电平或负跳变有效)由INT0*引脚输入,中断请求标志为IE0。

(2)INT1*—外部中断请求1,外部中断请求信号(低电平或负跳变有效)由INT1*引脚输入,中断请求标志为IE1。

(3)定时器/计数器T0计数溢出的中断请求,标志为TF0。

(4)定时器/计数器T1计数溢出的中断请求,标志为TF1。

(5)串行口中断请求,标志为发送中断TI或接收中断RI。

3.单一中断应用
         在单片机P1口上接有8只LED。在外部中断0输入引脚(P3.2)接一只按钮开关K1。要求将外部中断0设置为电平触发。程序启动时,P1口上的8只LED全亮。每按一次按钮开关K1,使引脚接地,产生一个低电平触发的外中断请求,在中断服务程序中,让低4位的LED与高4位的LED交替闪烁5次。然后从中断返回,控制8只LED再次全亮。
原理图:

代码如下:

#include<reg51.h>
#define uchar unsigned char
void Delay0(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)
	{P1=0;}
}
void int0() interrupt 0 using 0
{
	uchar m;
	EX0=0;
	for(m=0;m<5;m++)
	{
		P1=0x0f;
		Delay0(400);
		P1=0xf0;
		Delay0(400);
		EX0=1;
	}
}

4.两个外部中断
        在单片机P1口上接有8只LED。在外部中断0输入引脚(P3.2)接有一只按钮开关K1。在外部中断1输入引脚(P3.3)接有一只按钮开关K2。要求K1和K2都未按下时,P1口的8只LED呈流水灯显示,仅K1(P3.2)按下再松开时,上下各4只LED交替闪烁10次,然后再回到流水灯显示。如果按下再松开K2(P3.3)时,P1口的8只LED全部闪烁10次,然后再回到流水灯显示。设置两个外中断的优先级相同。
原理图:

代码如下:

#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);
		P1=display[a];
	}
	}
}
void int0_isr(void) interrupt 0 using 1
{
	uchar n;
	for(n=0;n<10;n++)
	{
		P1=0x0f;
		Delay(500);
		P1=0xf0;
		Delay(500);
	}
}
void int1_isr(void) interrupt 2 using 2
{
	uchar m;
	for(m=0;m<10;m++)
	{
		P1=0xff;
		Delay(500);
		P1=0;
		Delay(500);
	}
}

5.中断嵌套
        设计一中断嵌套程序:要求K1和K2都未按下时,P1口8只LED呈流水灯显示,当按一下K1时,产生一个低优先级外中断0请求(跳沿触发),进入外中断0中断服务程序,上下4只LED交替闪烁。此时按一下K2时,产生一个高优先级的外中断1请求(跳沿触发),进入外中断1中断服务程序,使8只LED全部闪烁。当显示5次后,再从外中断1返回继续执行外中断0中断服务程序,即P1口控制8只LED,上、下4只LED交替闪烁。设置外中断0为低优先级,外中断1为高优先级。
原理图:

代码如下:

#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};
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);
		P1=display[a];
	}
	}
}
void int0_isr(void) interrupt 0 using 0
{
 
	for(;;)
	{
		P1=0x0f;
		Delay(400);
		P1=0xf0;
		Delay(400);
	}
}
void int1_isr(void) interrupt 2 using 1
{
	uchar m;
	for(m=0;m<5;m++)
	{
		P1=0;
		Delay(500);
		P1=0xff;
		Delay(500);
	}
}
6.定时器中断
        在AT89S51的P1口上接有8只LED,原理电路见图7-13。采用T0方式1的定时中断方式,使P1口外接的8只LED每0.5s闪亮一次。

原理图:

代码如下:

#include<reg51.h>
char i=100;
void main()
{
	TMOD=0x01;
	TH0=0xee;
	TL0=0x00;
	P1=0x00;
	EA=1;
	ET0=1;
	TR0=1;
	while(1);
	{;}
}
void timer0() interrupt 1
{
	TH0=0xee;
	TH0=0x00;
	i--;
	if(i<=0)
	{
			P1=~P1;
			i=100;
	}
}

7.计数器中断
        T1采用计数模式,方式1中断,计数输入引脚T1(P3.5)上外接按钮开关,作为计数信号输入。按4次按钮开关后,P1口的8只LED闪烁不停。

原理图:

代码:

#include<reg51.h>
void Delay(unsigned int i)
{
	unsigned int j;
	for(;i>0;i--)
	for(j=0;j<125;j++)
	{;}
}
void main()
{
		TMOD=0x50;
		TH1=0xff;
		TL1=0xfc;
		EA=1;
		ET1=1;
		TR1=1;
		while(1);
}
void T1_int(void) interrupt 3
{
	for(;;)
	{
	P1=0xff;
	Delay(500);
	P1=0;
	Delay(500);
	}
}

三、总结

       本次学习了解了51单片机的中断和定时/计数器的原理和基本用法,可以更加全面的使用单片机的功能。本次任务完成度不高,望海涵。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值