C51 中断

Posted 一只小阿大:)

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C51 中断相关的知识,希望对你有一定的参考价值。

中断的概念

通过标志位的设定,降低CPU的占用率,另一方面也实现了单片机对复杂情景的处理。
什么是中断呢?
我在放家里打游戏,有人敲门,出去开门,然后回房间继续打游戏。
打游戏->CPU;敲门->发生了中断;按门铃的人->中断源
出去开门->中断过程;继续打游戏->返回工作
 
CPU与外设并行工作,当外设数据准备好或者有某种突发事件发生时,向CPU提出请求,CPU暂停正在进行的工作,转而为该外设服务(或者是处理紧急事件),处理完毕后再回到原断点继续执行原程序。这个过程称为中断。

一般情况下指 片上外设,如定时器,串行口等。

什么是中断源

引起中断的原因和发出中断请求的来源,称为中断源
中断源可以是外设,紧急事件,定时器或者人为设置用于单步断点调试程序。

中断系统要解决什么问题?

①CPU在不断的执行程序的过程中,如何检测到随机发生的中断请求
②是否允许中断
③如何正确的进入中断
④怎么排列优先级
⑤中断完成后,怎么返回原断点处

中断源

基础51单片机有5个中断源,增强型52系列增加了一个定时计数器2,共有6个中断源。其中包含两个外部中断源,其余为内部中断源。

中断源符号名称中断引起原因中断服务程序入口地址(汇编用)
INT0外部中断0P3^2引脚低电平或者下降沿信号0003H
INT1外部中断1P3^3引脚低电平或者下降沿信号0013H
T0定时器0中断定时器/计数器0计数回0溢出000BH
T1定时器1中断定时器/计数器1计数回0溢出001BH
T2定时器2中断定时器/计数器2计数回0溢出002BH
TI/RI串行口中断串行通信完成一帧数据发送或接受引起中断0023H


从图中可以看出,我们的51单片机中断部分流程如下:

①检测对应中断源标志位
②检测对应中断开关是否打开
③检测总中断是否打开
④查询是否有优先级更高或同优先级中断正在执行
⑤有高优先级或同级,等待其执行完毕进行中断;无高优先级和同级,直接进行中断

中断控制相关寄存器



中断控制主要由两方面:
A: 是否允许中断
B:中断的优先级设置
EA :中断总控开关 , 1-CPU开中断,0-关闭

如何使用外部中断


1.开启总中断   : EA
2.开启外部中断  : EX0/1
3.设置中断触发方式: IT0
4.编写中断服务程序:
返回值 函数名([参数])[模式][ 再入]interrupt n [using m]
interrupt n
n=0  外部中断
n=1  定时/计数器0溢出
n=2  外部中断1
n=3  定时计数器1溢出中断

代码

注意:震动传感器引脚连接的是P3.2(INT0)
main.c

#include <REGX52.h>
#include <INTRINS.H>

/*¼ÌµçÆ÷µÆ*/
sbit LED = P2^1;

/**
 *¹¦ÄÜ£ºÑÓʱ500ms
 *²ÎÊý£ºvoid
 *·µ»ØÖµ£ºvoid
 */
void Delay500ms(void)		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	_nop_();
	i = 22;
	j = 3;
	k = 227;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

/**
 *¹¦ÄÜ£º³õʼ»¯ÖжÏ
 *²ÎÊý£ºvoid
 *·µ»ØÖµ£ºvoid
 */
void interruptInit(void)
{
		EA  = 1;//¿ªÆô×ÜÖжÏ
		EX0 = 1;//¿ªÆôEX0µÄÍⲿÖжÏ
		IT0 = 1;//µÍµçƽ´¥·¢·½Ê½

}

int main()
{
		interruptInit();

		return 0;
}

/**
 *¹¦ÄÜ£ºÖжϷþÎñ³ÌÐò
 *²ÎÊý£ºvoid
 *·µ»ØÖµ£ºvoid
 */
void int0(void) interrupt 0
{
		LED = 0;
		Delay500ms();
		LED = 1;
		Delay500ms();

}

以上是关于C51 中断的主要内容,如果未能解决你的问题,请参考以下文章

对于c51外部中断和程序调用的理解

C51程序不能进入中断

C51 串口

单片微机原理P2:80C51外部中断与定时器系统

C51 定时器

突破KEIL软件编译时 C51中断号最大只能为31限制的补丁,使中断号可以达到256