C51 中断
Posted 一只小阿大:)
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C51 中断相关的知识,希望对你有一定的参考价值。
中断的概念
通过标志位的设定,降低CPU的占用率,另一方面也实现了单片机对复杂情景的处理。
什么是中断呢?
我在放家里打游戏,有人敲门,出去开门,然后回房间继续打游戏。
打游戏->CPU;敲门->发生了中断;按门铃的人->中断源
出去开门->中断过程;继续打游戏->返回工作
CPU与外设并行工作,当外设数据准备好或者有某种突发事件发生时,向CPU提出请求,CPU暂停正在进行的工作,转而为该外设服务(或者是处理紧急事件),处理完毕后再回到原断点继续执行原程序。这个过程称为中断。
一般情况下指 片上外设,如定时器,串行口等。
什么是中断源
引起中断的原因和发出中断请求的来源,称为中断源
中断源可以是外设,紧急事件,定时器或者人为设置用于单步断点调试程序。
中断系统要解决什么问题?
①CPU在不断的执行程序的过程中,如何检测到随机发生的中断请求
②是否允许中断
③如何正确的进入中断
④怎么排列优先级
⑤中断完成后,怎么返回原断点处
中断源
基础51单片机有5个中断源,增强型52系列增加了一个定时计数器2,共有6个中断源。其中包含两个外部中断源,其余为内部中断源。
中断源符号 | 名称 | 中断引起原因 | 中断服务程序入口地址(汇编用) |
---|---|---|---|
INT0 | 外部中断0 | P3^2引脚低电平或者下降沿信号 | 0003H |
INT1 | 外部中断1 | P3^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 中断的主要内容,如果未能解决你的问题,请参考以下文章