2016.06.05 周日 实训课第二课 “中断”讲解

课程内容:

  外部中断   引用------- 单片机教程网例子    ←链接

    单片机在自主运行的时候一般是在执行一个死循环程序,在没有外界干扰(输入信号)的时候它基本处于一个封闭状态。比如一个电子时钟,它会按时、分、秒的规律来自主运行并通过输出设备(如液晶显示屏)把时间显示出来。在不需要对它进行调校的时候它不需要外部干预,自主封闭地运行。如果这个时钟足够准确而又不掉电的话,它可能一直处于这种封闭运行状态。但事情往往不会如此简单,在时钟刚刚上电、或时钟需要重新校准、甚至时钟被带到了不同的时区的时候,就需要重新调校时钟,这时就要求时钟就必须具有调校功能。因此单片机系统往往又不会是一个单纯的封闭系统,它有些时候恰恰需要外部的干预,这也就是外部中断产生的根本原由。
实际上在第二个示例演示中,就已经举过有按键输入的例子了,只不过当时使用的方法并不是外部中断,而是用程序查询的方式。下面就用外部中断的方法来改写一下第二个示例中,通过按键来更改闪烁速度的例子(第二个例子)。电路结构和接线不变,仅把程序改为下面的形式。
#include <iom16.h>
unsigned int t=500; //定义一个全局变量t,并设定初始值为500次
//===========延时子函数,在8MHz晶振时约1ms=============
void delay_ms(unsigned int k)
{
unsigned int i,j;
for(i=0;i<k;i++)
{
for(j=0;j<1140;j++)
;
}
}
//============主函数==================================
void main( void )
{
DDRB = 0xFF; //设置端口B为输出方向
PORTB = 0xFF; //设置端口B的输出为全高电平
DDRD = 0x00; //设置端口D为输入方向
PORTD = 0xFF; //设定端口D为内部上拉方式,无信号输入时处于高电平状态
MCUCR = 0x0A; //设定INT0、INT1为下降沿触发
GICR = 0xC0; //使能INT0、INT1中断
SREG = 0x80; //使能总中断
while(1)
{
PORTB = 0x55; //让接在端口B上的LED显示01010101
delay_ms(t); //延时t个ms
PORTB = 0xAA; //让接在端口B上的LED显示01010101
delay_ms(t); //延时t个ms
}
}
//============中断函数(外部0)==========================
#pragma vector = INT0_vect
__interrupt void INT0_Server(void)
{
t = 100; //设定t的值为100次
}
//============中断函数(外部1)==========================
#pragma vector = INT1_vect
__interrupt void INT1_Server(void)
{
t = 500; //设定t的值为500次
}
把上述程序进行编译并下载到单片机中,可以看到结果与第二个示例中的完全一致。下面就来分析一下键盘中断的程序原理。
在分析程序之前,先来了解一下什么叫“外部中断”。前面已讲述过,在没有打扰的情况下,单片机的程序在封闭状态下自主运行,但如果在某一时刻需要响应一个外部事件(比如有按键被按下),这时就需要用外部中断。具体来讲,外部中断就是在单片机的一个引脚上,由于外部因素导致了一个电平的变化(比如由高变低),而通过捕获到这个变化,单片机内部自主执行的程序就被暂时打断,转而去执行相应的中断处理程序,执行完后又回到原来中断的地方继续执行原程序。这个引脚上的电平变化,就申请了一个外部中断事件,而这个能申请外部中断的引脚就是外部中断的触发引脚。在上面的例子中,可以看到两个按键S1、S2被接到了ATMega16的PD3和PD2引脚,而这两个引脚正是该单片机的两个外部中断(INT1和INT0)的触发引脚(第二功能)。当按键没有按下时,这两个引脚都为高电平(执行过PORTD=0xFF),当按键被按下时,引脚电平跳变为低电平,这时若单片机设置成允许中断申请,就会触发外部中断事件,从而转去执行中断服务程序。明白了这个过程之后,接下来就可以分析程序了。
程序执行后,主程序就一直在不停的运行while(1)内的这个死循环,让LED以t=500ms的初始值来交替闪烁,直到有外部中断来打断它。假设某一时刻按键S2被按下,这时由于引脚PD2上的电平突然被拉低,申请了一个外部中断0(INT0),这时的程序就转去执行外部中断0的中断服务程序(即__interrupt void INT0_Server(void)函数)。这时全局变量t的值被该函数重新赋值为100(即延时为100ms),完成后又回到主函数中的while(1)内去继续执行,因此LED闪烁的速度就变快了。
观察程序可看出,如果没有中断去调用中断服务子程序,在主程序中是没有语句去调动它的。也就是说如果没有外部中断,中断服务子程序(即__interrupt void INT0_Server(void)函数)是永远不会被执行的。这也说明,中断服务子程序是一类特殊的子程序,它不能被主程序调用,只能被中断申请调用。因此,中断服务子程序有它固定的格式和写法。在不同的编译系统中的写法不完全一样,下面给出IAR下的中断服务子程序的格式。
#pragma vector = INT0_vect
__interrupt void INT0_Server(void)
{
中断服务程序代码
}
以上是固定格式,除斜体部分外,其余部分不可更改。斜体部分中的INT0_vect表示中断的向量号,不同的中断名称不一样(原型在头文件iom16.h中)。斜体部分中的INT0_Server是中断函数的名称,是由开发者自己定义的。虽然可以自定义,但名称还是要取得“见名知义”,这样一看就知道是什么中断服务了。

      注意事项:

          1、中断服务子程序内不能加延时,解决方式可参照上文的例子

          2、代码标准格式很重要,要养成好的编写代码的习惯,否则会死在不该死的地方!!!!  细节链接 →  点这里

          2、多文件全局变量的使用

            a)先创建一个.h文件  内容为  extern  数据类型 变量名称  如:extern  int  var;

            b)在用到该变量的文件内加 #include".h文件名"   在任意一个.c文件中赋初始值(只能在一个文件赋初始值,否则出错!!!)

            如:

            #include".h文件名" //必须是用双引号 不能用尖括号

            unsigned int var1=58;

时间: 2024-10-10 14:26:18

2016.06.05 周日 实训课第二课 “中断”讲解的相关文章

于航特训课第二课

蓝桥杯算法特训第二课[递归原理与构造技巧]源代码 三月 7, 2018小蓝 [内容简介]本文章内容为[2018蓝桥杯大赛算法特训(软件)系列课程]第二课[递归原理与构造技巧]中涉及到的课上例题的代码实现,加入赛前算法特训获取全部课程内容请联系[小蓝]. [课程中涉及的源代码]1. 串的翻转[问题描述][源代码][JAVA:于航] 1234567891011 public class A{    static String f(String s){        if(s.length()<=1)

分布式技术一周技术动态 2016.06.05

分布式系统实践 1. HDFS EC:将纠删码技术融入HDFS https://mp.weixin.qq.com/s?__biz=MjM5MjAwODM4MA==&mid=2650686551&idx=1&sn=1369ddcaedbcd58124e77ab19a8cea24&scene=0&key=8d8120cb97983fad822e4657bcb6a25dacefda3adcc4bf94838f48a34e807da9fd6f97dbd17fd0789ac9

我的“便(bian)宜&quot;Python网课第二课

二.变量.字符编码 Variables are used to store infomation to be referenced and manpulated in a computer program. They also provide a way of labeling data with a descriptive name, so our program can be understood more clearly by the reader and ourselves. It is

实训任务05 MapReduce获取成绩表的最高分记录

实训任务05  MapReduce获取成绩表的最高分记录 实训1:统计用户纺问次数 任务描述: 统计用户在2016年度每个自然日的总访问次数.原始数据文件中提供了用户名称与访问日期.这个任务就是要获取以每个自然日为单位的所有用户访问次数的累加值.如果通过MapReduce编程实现这个任务,首先要考虑的是,Mapper与Reducer各自的处理逻辑是怎样的:然后根据处理逻辑编写出核心代码:最后在Eclipse中编写完整代码,编译打包后提交给集群运行. 分析思路和逻辑 (1)       输入/输出

&lt;实训|第二天&gt;掌握linux6.7中安装vmware、vmware安装linux发行版本以及遇到的问题最后libreoffice的安装

期待已久的linux运维.oracle"培训班"终于开班了,我从已经开始长期四个半月的linux运维.oracle培训,每天白天我会好好学习,晚上回来我会努力更新教程,包括今天学到了什么知识点,用了什么方法,使用了什么工具,工具在哪里共享着等等,努力做到让每一位感兴趣的.关注我的.没关注我的老司机都能在自己闲暇的时光学到一点额外的知识,指不定那一天你就用上了少许呢! ------------------------------------------------------------

《JAVA程序设计》实训第二天——《猜猜看》游戏

课程实训第二天,我在第一天的基础上去导入文件夹,第一天那时候一直修改都是修改不到,上网找了相关的知识,问了同学该怎么去导入显示图片. public class weiwei extends JFrame { /** * */ private static final long serialVersionUID = 1L; private JPanel contentPane; private JTextField tfDir; private JTextField tfClass; File[]

2016年秋季软件工程专业实训分组及选题情况

实训意义 综合实训旨在为学生提供参与完整软件开发过程的实践经历,并对所涉及的应用领域进行初步了解,培养面向领域的工程能力.项目来源主要是学校或相关合作企业在校内设立专门的学生研究开发项目,可以聘请企业专家组织和指导学生模拟企业环境进行项目开发,给学生带来真实的企业研发的环境和流程.     实训目标 (1)训练学生软件开发流程和规范:体会企业开发流程:熟悉常用开发工具.模板和表格的使用: (2)体会企业中的团队合作规范:培养团队开发和协同工作的能力:熟悉团队成员在软件开发项目中的角色分工及沟通协

山西高平地域文化导入美术设计实训项目的实践

地域文化,是指某个地域的人们在特定的范围内,在自然环境的基础上,在长期的生产生活中创造的.人类活动的产物.山西高平是神农炎帝的故里,长平之战的发生地,是一个有着很深文化积淀的新兴城市,行政区域是国土面积的万分之一,却浓缩了中国五千年文化的精髓.本文通过对山西高平丰富的历史文化资源的调查研究,探讨如何将地域文化元素导入中职美术设计专业的实训项目教学过程,论证典型地域文化元素在中职美术设计教育中的独特作用,并以此作为教学实训素材,依托带有典型地域文化特征的企业真实案例,结合教育教学实践,探索中职美术

网络实训——服务器应用系统的实践

1 设计内容与设计要求 1.1设计内容 课题10:服务器应用系统的实践 服务器指一个管理资源并为用户提供服务的计算机软件,通常分为文件服务器.数据库服务器和应用程序服务器.运行以上软件的计算机或计算机系统也被称为服务器. 实训内容: (1)搭建简单的三层局域网环境 (2)部署Web服务器,并创建简单网页 (3)部署DNS服务器,并对Web服务器做域名解析 (4)部署DHCP服务器,对终端电脑实现动态IP获取 (5)部署FTP服务器,使终端电脑能访问并存储文件 (6)完成测试并写出详细课设报告 1