来源:http://www.51hei.com/mcu/2477.html

什么是中断?就是打断当前要做的事,转而去执行别的事情。比如小七我现在正在电脑前写帖子,突然老妈叫我帮她下楼拿点东西,于是我就收到了老妈给我的一个中断(可以叫做外部中断),当我去拿东西时,突然尿急(内部中断,尿袋快要撑爆了),这又是一个中断,!我们把引起中断的事件叫做中断源(如老妈给我的任务,以及我的尿意。。。外部引起的叫外部中断,内部引起的叫内部中断),产生中断后就要去处理它,这称为中断的响应。

由于尿急这个内部中断的优先级比老妈给我的外部中断还要高,尿急了,我总得先去撒尿吧?所以我就先去执行撒尿这个语句(小七:怎么我觉得这个比喻很别扭呢?!)。当我撒完尿后(还是觉得很别扭。。。)我会返回来帮老妈拿东西(高优先级的中断处理完后返回执行优先级较低的中断),拿完东西了我再回到电脑前继续写帖子(全部中断处理完后继续接手中断前的工作)。这个就叫做中断的返回。这么通俗的比喻,大家对中断的概念应该都明白了吧,那么在单片机里面,中断有什么用呢?

当单片机正在执行程序的时候,突然某个按键按下了(产生外部中断),单片机就必须得去处理那个按键(中断的响应),看看是发生了什么事,按键处理完后继续回来执行程序(中断的返回)。

同样,单片机正在执行程序的时候,内部的定时器溢出(定时器后面会单独讲到),或者检测到单片机的电压低于正常值等等(单片机内部产生的中断叫内部中断),单片机就得去处理这些事情,然后再返回来。

在单片机里面,中断是有特殊的功能寄存器控制的,单片机里面一共有两个中断,一个是中断0,一个是中断1 ,和两个定时器T0,T1,定时器就是你打开它后,它会自动数数,当数到你给它限定的值时,它就会溢出,产生中断让CPU处理(就像一个桶,你打开水龙头后,水越来越多,当达到你需要的水位时,就会产生中断叫你去处理它)。这些我们先不深入了解他是什么东西,我们只需知道中断是用下面这几个关键词控制的就行了:

IT0      声明外部中断0的类型,IT0=1是边沿触发,0是电平触发
边沿触发就是当检测到外部电平发生变化,即由低变高,或者由高变低时,就会产生一个中断
电平触发就是检测到高电平或者低电平时,产生中断

IE0     外部边沿触发产生中断后,它的值会变1,当CPU响应后,会自动变为0

IT1      和IT0一样的含义
IE1     和IT0一样的含义

EX0    外部中断0控制器,EX0=1是允许外部中断,0是禁止外部中断,也就是不理会外部中断
ET0    这个是定时器中断控制器,ET1=1是允许定时器产生中断,0是禁止
EX1,ET1的含义跟上面的都一样。
EA      总中断控制器,1是允许有中断产生,0是禁止所有中断,就算天打雷劈也不理会

另外,还有一个中断优先级的控制器,就是控制是去帮妈妈拿东西的优先级高还是去撒尿的优先级高。

PX0 外部中断0的优先级控制,假如内外都产生了中断,1就是优先处理外部中断,0就是优先处理内部中断

PT0 定时器0优先级控制器,1就是优先相应定时器0

PT1 定时器1优先级控制器,1就是优先相应定时器1

另外还有串口的RI,TI,PS等我们先不学习了,不然大伙该乱了
(众人:其实我们早已凌乱了。。。一头雾水!)

还有个概念,就是中断请求的撤销,也就是说,产生中断后,会产生一个中断请求,为1,当CPU处理完中断后,必须清除这个请求,不然CPU又会认为这个中断没有处理又跑去处理它……

对于两个定时器产生的中断,当CPU响应后,会自动清除TF0,TF1这两个定制器中断请求,处理完后就跳出来,回到原来的地方继续执行。

对于外部中断INT0,INT1,如果中断类型是边沿触发,单片机会自动清除中断请求IE0,IE1
若是电平触发,如果有一个电平,使中断产生后,这个电平仍然还保持着,那么这个电平还会触发中断,这样CPU就死在中断的石榴裙下出不来了。。。

(众人:说了那么多,没例子你说个J8)

例子来啦!用外部中断来控制一个LED的亮灭。对了,外部中断并不是单片机的每个引脚都能产生,标有INT0或INT1的才行,我们看看11F02E的引脚图

中断的引脚是INT0:P3^2和 INT1:P3^3,我们用边沿触发(由高电平变成低电平时,就会触发)的中断方式来控制LED,

当我们没按下按键的时候,由于上拉电阻(不懂的问百度姐姐哦~)的原因,P3^2是高电平,当我们按下按键后,P3^2的电平就会变低,这个从高变低的过程就会产生一个中断(边沿触发),CPU会第一时间来相应这个中断,看看是谁看帖不回贴,看完帖子不评分,然后根据小七写的中断处理程序去处理他!

O(∩_∩)O 。

程序怎么写呢?

#include <reg52.h> 
sbit led=P1^7;  //定义LED 
void zhongduan() interrupt 0 using 1       //声明中断处理函数,由于是外部中断,所以 interrupt X 里X的值是 0 

  led=!led;  //CPU响应中断后会跑来这里执行(让led的状态取反) 

void main()      //主函数,程序执行的起点 

  EA=1;              //允许CPU响应所有中断 
  IT0=1;             //设外部中断0的响应模式为边沿触发 
  EX0=1;             //允许中断0产生中断 
  while(1);         //CPU不断在这里死循环,中断产生后放下工作去响应中断,处理完后然后再返回来继续死循环 
}

按下按键,CPU会跑去中断处理函数执行,执行完中断处理后返回原处继续执行

(众人:这个中断跟我们前面学习的按键有什么区别么?)

当然有区别啦!虽然都是控制LED,但是按键是当CPU执行到按键检测如 if(key==0) 语句后,才去改变LED的状态,如果没有执行到,那么即使你按下按键单片机也不会响应的,也就是CPU主动去问按键有没有被按下。而中断呢,就是无论CPU在干嘛,只要触发中断后,CPU就会放下手中的活,第一时间赶回来处理,也就是按键被按下后主动告诉CPU。。。就像windows 系统的 ctrl+alt+del 组合键,你一按下这个组合键,无论系统在做什么,都会弹出任务管理器。

另外中断的处理函数是这样声明的

void abc() interrupt X using n
{
    处理语句;
}

我们看到,只是普通的函数 加上了 interrupt X using Y 了而已,X 的取值是有规定的:

如果是外部中断0的中断处理函数,则X为0 即void abc() interrupt 0 using n

若是定时器0的中断处理函数,则 X 为1

若是外部中断1的中断处理函数,则 X 为2

若是定时器1的中断处理函数,则 X 为3

若是串口中断的中断处理函数,则 X 为4

n 是中断号,取值范围为 0 - 31

关于中断的学习,也到此告一段落了,当然还有一些问题没解决.......

Q1: 为什么count==40的时候数码管也不能闪烁???


 
/*
实现目的:
让LED灯以1000ms(即1s)产生流水灯效果,并用定时器0让数码管以500ms从0~F闪烁
*/
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit d1=P2^1;
uchar weixuan=0x00;//位选全开
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};//段选
uchar temp,count,num;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
{
for(y=0;y<113;y++)
{
}
}
}
void main()
{
count=0;
num=0;
P1=weixuan;
P0=table[num];
temp=0xfe;
P2=temp;
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
ET0=1;
TR0=1;
while(1)
{
delay(1000);
temp=_crol_(temp,1);
P2=temp;
/*
if(count==10)
{
count=0;
num++;
if(num==16)
{
num=0;
}
P0=table[num];
} */
}
}
void time0() interrupt 1
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
count++;
if(count==10)
{
count=0;
num++;
if(num==16)
{
num=0;
}
P0=table[num];
}  
}

 

 
/*
PS:我们不能把数码管500ms闪烁时间是否到达的语句写在主程序中,
若写在主程序中,有可能发生如下错误情况:当主程序在LED灯显示语句当中时,
此时恰好定时器0进入中断并且count刚好加到了10,当定时器0中断再次进入时,
主程序仍未退出LED流水灯的显示程序,那么此时count的值便变成了11,
这样的话,count==10这个点永远检测不到,因此数码管闪烁失去了控制

在调试代码当中发现delay(uint z)函数与中断是同时执行的。。。

*/  

单片机中断程序详解(转)相关推荐

  1. 中断程序_ABB机器人中断程序详解(安川FANUC)

    ABB机器人中断程序详解 1.新建一个中断程序 test001,类型中断 TRAP hanmianshadiaoliao StopMove; SetDO DO04, 0; !Stop; StartMo ...

  2. 51单片机PWM程序详解

    #include<reg51.h> //程序是基于KEIL-C51编写,引入8051头文件 sbit P10=P1^0; sbit P11=P1^1; unsigned int scale ...

  3. 单片机c语言程序流程图,ds1302时钟程序详解,ds1302程序流程图(C程序)

    ds1302时钟程序详解 DS1302 的控制字如图2所示.控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RA ...

  4. c语言编写51单片机中断程序,执行过程是怎样的?

    Q:c语言编写51单片机中断程序,执行过程是怎样的? 例如程序: #include<reg52.h>   void main(void)   {    EA=1;      //开放总中断 ...

  5. 英飞凌 AURIX 系列单片机的HSM详解(1)——何为HSM

    本系列的其它几篇文章: <英飞凌 AURIX 系列单片机的HSM详解(2)--与HSM相关的UCB和寄存器> <英飞凌 AURIX 系列单片机的HSM详解(3)--开发方法> ...

  6. 51单片机步进电机角度控制详解(免费提供代码+仿真)

    51单片机步进电机控制详解 目录 51单片机步进电机控制详解 一.步进电机基本介绍 1. 步进电机结构 2. 步进电机驱动 二.硬件&仿真设计 0.设计要求 1. 硬件设计 显示模块 输入模块 ...

  7. 单片机执行指令过程详解

    单片机执行指令过程详解: 单片机执行程序的过程,实际上就是执行我们所编制程序的过程,即逐条指令的过程. 计算机每执行一条指令都可分为三个阶段进行.即取指令-----分析指令-----执行指令. (1) ...

  8. 英飞凌 AURIX 系列单片机的HSM详解(5)——HSM硬件加速模块的使用

    本系列的其它几篇文章: <英飞凌 AURIX 系列单片机的HSM详解(1)--何为HSM> <英飞凌 AURIX 系列单片机的HSM详解(2)--与HSM相关的UCB和寄存器> ...

  9. 英飞凌 AURIX 系列单片机的HSM详解(4)——Tricore核与HSM核之间的通信方法

    本系列的其它几篇文章: <英飞凌 AURIX 系列单片机的HSM详解(1)--何为HSM> <英飞凌 AURIX 系列单片机的HSM详解(2)--与HSM相关的UCB和寄存器> ...

  10. 中断系统结构及中断控制详解

    中断系统结构及中断控制详解 MCS-51提供5个中断请求源,2个中断优先级,可实现两级中断服务程序嵌套.当CPU执行关中断指令后(或复位),将屏蔽所有中断请求,只有CPU执行开中断指令后才有可能接受中 ...

最新文章

  1. php qq对话,用php聊QQ
  2. Linux 自定义命令
  3. 面试(后台开发,转载)
  4. 柴油机计算机故障,柴油机故障论文,关于6105小型高速柴油机常见故障处理相关参考文献资料-免费论文范文...
  5. 【NLP】毕设学习笔记(八)“前馈 + 反馈” = 循环神经网络RNN
  6. linux查看tomcat启动内存溢出,Linux下 Tomcat内存溢出
  7. 配置java时找不到匹配项,检索项目的父项时出错:找不到与给定名称匹配的资源...
  8. tensorflow 版本列表_最新|谷歌发布TensorFlow 1.3.0版本,都更新了哪些内容?
  9. Bailian4140 方程求解【二分法】
  10. Atitit Java制作VCARD vcf 以上就是关于vCard的基本介绍,维基百科(英文)https://en.wikipedia.org/wiki/VCard写的比较全,可惜我看不懂。
  11. atitit uke企业行政部 世界行政区域划分表 与邮政编码规划 v5 r88.xlsx
  12. windbg中ntsd使用用户态调试器链接到内核调试器的常用技巧
  13. android ip地址扫描,如何准确扫描Android中连接到wifi的所有设备的IP和Mac地址?
  14. java 传真x2fax_FreeSWITCH的传真发送
  15. SQL语句的各种连接查询
  16. 三菱 PLC ST语言 步进电机正反转
  17. mysql 本月老客户次月留存率_用mysql计算用户留存率
  18. 推荐系统学习之评测指标
  19. 发一个mir2的内挂代码
  20. 语音识别是不是人工智能?

热门文章

  1. Matlab p文件解密,p转m文件 可查看源码
  2. JavaScript的API文档自动生成工具jsdoc
  3. 今天把中国建设银行APP4.2.1版iOS客户端里所有的功能都点了一遍
  4. C语言中文件指针和文件位置指针,位置指针相关库函数
  5. 土方测量-挖方填方量的计算思路
  6. 斐讯k2搭建php环境,宿舍使用斐讯K2路由器详细设置步骤
  7. html中加pyecharts,如何在PPT中插入Pyecharts的图表?
  8. 数学建模Latex简易模板
  9. 如何在 Python 中调用函数?九种方法任你挑选
  10. ConstraintLayout 属性详解 和Chain的使用