收藏 分享(赏)

第五模块 单片机中断系统项目实训.ppt

上传人:j35w19 文档编号:8223039 上传时间:2019-06-15 格式:PPT 页数:40 大小:280.50KB
下载 相关 举报
第五模块  单片机中断系统项目实训.ppt_第1页
第1页 / 共40页
第五模块  单片机中断系统项目实训.ppt_第2页
第2页 / 共40页
第五模块  单片机中断系统项目实训.ppt_第3页
第3页 / 共40页
第五模块  单片机中断系统项目实训.ppt_第4页
第4页 / 共40页
第五模块  单片机中断系统项目实训.ppt_第5页
第5页 / 共40页
点击查看更多>>
资源描述

1、第五模块 单片机中断系统项目实训, 项目10 定时/计数器中断控制 项目11 音乐播放控制 项目12 外部中断源中断控制,项目10 定时/计数器中断控制,任务5-10-1 简易数码秒表设计任务5-10-2 使用定时器T0的中断控制数码管倒计数显示任务5-10-3 使用计数器T1的中断控制数码管显示按键计数,任务5-10-1 简易数码秒表设计,一、MCS-51单片机的中断系统,1MCS-51单片机的中断结构MCS-51单片机提供了5个中断源,两个中断优先级控制,可实现两个中断服务嵌套。当CPU支持中断屏蔽指令后,可将一部分或所有的中断关断,只有打开相应的中断控制位后,方可接收相应的中断请求。程序

2、设置中断的允许或屏蔽,也可设置中断的优先级。MCS-51单片机有5个中断源:外部中断0 、定时/计数器T0、外部中断1 、定时/计数器T1、串口中断TI或RI。有两个中断控制寄存器,其中中断允许寄存器IE控制中断源的使用与屏蔽。中断优先级寄存器IP实现中断源的两个优先级控制。 MCS-51单片机的中断结构 如图所示:,任务5-10-1 简易数码秒表设计,一、MCS-51单片机的中断系统,2MCS-51的中断源MCS-51单片机有5个中断源,它们是两个外中断INT0(P3.2)和INT1(P3.3)、两个片内定时/计数器溢出中断TF0和TF1,一个片内串行口中断TI或RI,这几个中断源由TCON

3、和SCON两个特殊功能寄存器进行控制。TCON寄存器的结构如下表所示:,TCON寄存器各位控制功能简要说明如下:(1)TF1:定时/计数器T1的溢出标志位(2)TR1:定时/计数器T1的运行控制位(3)TF0:定时/计数器T0的溢出标志位(4)TR0:定时/计数器T0的运行控制位(5)IE1:外部中断 INT1的中断请求标志位(6)IT1:外部中断 INT1 的触发方式控制位(7)IE0:外部中断 INT0 的中断请求标志位(8)IT0:外部中断 INT0 的触发方式控制位,任务5-10-1 简易数码秒表设计,一、MCS-51单片机的中断系统,3中断的控制有四个特殊功能寄存器可以用来进行中断的

4、控制,它们是TCON、SCON、IE和IP。(1)中断允许控制寄存器IE:MCS-51单片机对中断的开放和屏蔽是由中断允许寄存器IE控制来实现的,IE的结构格式如下表所示:,IE寄存器的各控制位功能说明如下:EA:中断总控制位EX0:外中断INT0的中断控制位ET0:定时/计数器T0的中断控制位EX1:外中断INT1的中断控制位ET1:定时/计数器T1的中断控制位ES:串行口中断控制位,任务5-10-1 简易数码秒表设计,一、MCS-51单片机的中断系统,(2)中断优先级控制寄存器IPMCS-51单片机对中断优先级的控制是由中断优先级控制寄存器IP来实现的,IP的结构格式如下表所示:,IP寄存

5、器的各控制位功能说明如下:PX0:外中断 INT0优先级控制位PT0:定时/计数器T0优先级控制位PX1:外中断 INT1 优先级控制位PT1:定时/计数器T1优先级控制位PS:串行口中断口优先级控制位,任务5-10-1 简易数码秒表设计,一、MCS-51单片机的中断系统,MCS-51单片机的5个中断源由其硬件结构决定的自然优先级别排列顺序与服务程序入口地址:,任务5-10-1 简易数码秒表设计,一、MCS-51单片机的中断系统,4中断的响应MCS-51CPU在每一个机器周期顺序检查每一个中断源,在机器周期的S6按优先级处理所有被激活的中断请求,此时,如果CPU没有正在处理更高或相同优先级的中

6、断,或者现在的机器周期不是所执行指令的最后一个机器周期,或者CPU不是正在执行RETI指令或访问IE和IP的指令(因为按MCS-51中断系统的特性规定,在执行完这些指令之后,还要在继续执行一条指令,才会响应中断),CPU在下一个机器周期响应激活了的最高级中断请求。中断响应的主要内容就是由硬件自动生成一条长调用LCALL addr16指令,这里的addr16就是程序存储器中相应的中断区入口地址。生成LCALL指令后,CPU紧跟着便执行之。首先将PC(程序计数器)的内容压入堆栈保护断点,然后把中断入口地址赋予PC,CPU便按新的PC地址(即中断服务程序入口地址)执行程序。各中断区只有8个单元,一般

7、情况下(除非中断程序非常简单),都不可能安装下一个完整的中断服务程序。因此,通常是在这些入口地址区放置一条无条件转移指令,使程序按转移的实际地址去执行真正的中断服务程序。,二、硬件电路设计,三、软件程序设计,任务5-10-1 简易数码秒表设计,任务5-10-2 使用定时器T0的中断控制数码管倒计数显示,一、MCS-51单片机寄存器组的切换,当单片机正在执行一个特定的任务时,可能有更紧急的事情需要CPU来处理。在一个具有优先级的系统中,CPU不是等待第一个任务完成,而是假定前一个任务已完成,立即处理新任务。但是若程序流程立即转向新任务,则新任务使用的各寄存器破坏了第一个任务使用的中间信息。当新任

8、务完成后返回来重新执行第一个任务时,寄存器的值可引起错误发生。解决的办法是,在每次发生任务变化时,执行一些必要的现场保护指令,这就叫做上下文切换。,8051是一种基于累加器的单片机,具有8个通用寄存器(R0R7)。每个寄存器都是一个单字节的寄存器。这8个通用寄存器可以认为是一组寄存器或者一个寄存器组。8051提供了4个可用的寄存器组。当使用中断时,多组寄存器将带来许多方便。典型的8051C程序不需要选择或切换寄存器组,默认使用寄存器组0。寄存器组1、2或3最好在中断服务程序中使用,以避免用堆栈保存和恢复寄存器。,任务5-10-2 使用定时器T0的中断控制数码管倒计数显示,一、MCS-51单片机

9、寄存器组的切换,8051有4个寄存器组,每组8字节位于内部RAM的起始位置。分配R0R7对应这8字节,具体位置取决于PSW(程序状态字)的两位(RS0、RS1)设置。这两位决定给定时间内R0R7对应的HEX地址07、8F、1017或181F。寄存器组使得程序流程有非常快的上下文切换。当中断发生时,典型变化包括由一动作移到另一动作。不是推进和弹出堆栈,两位(RS0、RS1)的改变可保存所有8个寄存器。当运行一个中断任务时,采用不同的寄存器组。一个任务的8字节保留,另一个不同的8字节用在新任务中。,高优先级中断可以中断正在处理的低优先级中断,因而必须注意寄存器组的分配。最好给每种优先级程序分配不同

10、的寄存器组。当前工作寄存器可由PSW中的两位设置,也可使用using指定,using后的变量为一个03的常整数。,任务5-10-2 使用定时器T0的中断控制数码管倒计数显示,一、MCS-51单片机寄存器组的切换,Using不允许用于外部函数。它对函数的目标代码影响如下:函数入口处将当前寄存器组保留;使用指定的寄存器组;函数退出前,寄存器组恢复。,中断服务函数的完整语法如下:返回值 函数名(参数)模式重入interrupt n using n中断不允许用于外部函数。它对函数的目标代码影响如下:当调用函数时,SFR中的ACC、B、DPH、DPL和PSW(当需要时)入栈;如果不使用寄存器组切换,则甚

11、至中断函数所需的所有工作寄存器都入栈;函数退出前,所有的寄存器内容出栈; 函数由8051的指令RETI终止。,二、硬件电路设计,三、软件程序设计,任务5-10-2 使用定时器T0的中断控制数码管倒计数显示,任务5-10-3 使用计数器T1的中断控制数码管显示按键计数,一、C语言的编译预处理,编译预处理是C语言编译器的一个组成部分。在C语言中,通过一些预处理命令,可以在很大程度上为C语言本身提供许多功能和符号上的扩充,增强C语言的灵活性和方便性。预处理命令可以在编写程序时加在需要的地方,但它只在程序编译时起作用,并且通常是按行进行处理的,因此又称为编译控制行。编译器在对整个程序进行编译之前,先对

12、程序中的编译控制进行预处理,然后再将预处理的结果与整个C语言源程序一起进行编译,以产生目标代码。常用的预处理命令有宏定义、文件包含和条件命令。为了与一般的C语言语句区别,预处理命令由“#”开头。,1宏定义C语言允许用一个标志符来表示一个字符,称为宏。被定义为宏的标志符为宏名。在编译预处理时,程序中的所有宏名都用宏定义中的字符串代替,这个过程称为宏代换。宏定义分为不带参数的宏定义和带参数的宏定义。,(1)不带参数的宏定义的一般形式如下:#define 标志符字符串示例如下:#define PI 3.1415926,任务5-10-3 使用计数器T1的中断控制数码管显示按键计数,一、C语言的编译预处

13、理,(2)带参数的宏定义带参数的宏定义不是进行简单的字符口串替换,还要进行参数替换,其一般形式:#define 宏名(参数表)字符串字符串中包含在括弧中所指定的参数。,2文件包含文件包含是指一个程序将另一个指定的文件的全部内容包含进来。文件包含命令的一般格式如下:#include一条#include命令只能指定一个被包含文件。如果程序中要包含多个文件,则需要使用多个包含命令。当程序中需要调用C51编译器提供的各种库函数时,必须在程序的开头使用#include命令将相应的函数说明文件包含进来。,3条件编译一般情况下,对C语言程序进行编译时,所有的程序都参加编译。但有时希望对其中某一部分内容只在满

14、足一定条件下才进行编译,这就是所谓的条件编译。条件编译可以选择不同的编译范围,从而产生不同的代码。C51编译器的预处理提供的条件编译命令可以分为3种形式。,任务5-10-3 使用计数器T1的中断控制数码管显示按键计数,一、C语言的编译预处理,(1)#ifdef 标志符程序段1#else程序段2#end if如果指定的标志符已被定义,则“程序段1”参加编译,并产生有效代码,而忽略掉“程序段2”。否则,“程序段2”参加编译并产生有效代码,而忽略掉“程序段1”。,(2)#if 常量表达式程序段1#else程序段2#end if如果常量表达式为“真”,则;否则编译“程序段2”。,任务5-10-3 使用

15、计数器T1的中断控制数码管显示按键计数,一、C语言的编译预处理,(3)#ifndef 标志符程序段1#else程序段2#end if该形式编译命令的格式与第一种命令格式只有第一行不同,它的作用与第一种编译命令的作用正好相反。即指定的标志符末被定义,则“程序段1”参加编译,并产生有效代码,而忽略掉“程序段2”。否则,“程序段2”参加编译并产生有效代码,而忽略掉“程序段1”。,二、硬件电路设计,三、软件程序设计,任务5-10-3 使用计数器T1的中断控制数码管显示按键计数, 项目11 音乐播放控制,任务5-11 使用定时器T0的中断实现歌曲的播放,任务5-11 使用定时器T0的中断实现歌曲的播放,

16、一、单片机的音乐播放控制,1音调与频率的对应关系下表列出了C调的音调与频率的对应关系。,任务5-11 使用定时器T0的中断实现歌曲的播放,一、单片机的音乐播放控制,2音调(音频)控制要让蜂鸣器发出某音调的声音,只要给蜂鸣器输送该音调频率的电平信号就可以了。由于单片机是数字电路系统,所以输送给蜂鸣器的音频信号是方波脉冲,其高低电平转换频率即为音调的频率,每一次高电平或低电平的维持时间为该音频的半周期。为此需要利用定时器的中断,让输送给蜂鸣器的电平信号按音频的半周期取反。本书使用的单片机晶振频率为11.0592MHz,它的一个机器周期为1.085s。设需要发出的音调频率为f(Hz),则其半周期为1

17、/2f(s),需要的机器周期数(即定时器的定时常数)为音频半周期与机器周期之比。用C表示定时器的定时常数,根据上述分析,定时器的定时常数C的计算公式为:,任务5-11 使用定时器T0的中断实现歌曲的播放,一、单片机的音乐播放控制,按照频率范围计算,定时常数C的取值范围在2341759之间,所以定时器工作方式应选用方式0(最大计数值8192)或方式1(最大计数值65536)。定时器工作于方式0时,其初值可设定如下(以定时器T0为例):TH0=(8192-C)/32 /定时器T0高8位赋初值TL0=(8192-C)%32 /定时器T0低5位赋初值定时器工作于方式1时,其初值可设定如下(以定时器T0

18、为例):TH0=(65536-C)/256 /定时器T0高8位赋初值TL0=(65536-C)%256 /定时器T0低8位赋初值,任务5-11 使用定时器T0的中断实现歌曲的播放,一、单片机的音乐播放控制,3节拍控制设简谱的节拍为每分钟72拍,则每个节拍需时间833ms(60s/72)。根据乐谱知识,各相关节拍需时如下:1拍 833ms1/2拍 416ms1/4拍 208ms根据上述分析,可以取1/4拍(约200ms)为一个延时单位,若某音调为1/2拍,则延时2个单位;若某音调为1拍,则延时4个单位。,4乐谱的管理乐谱是由有序的音符(音调与节拍)构成的。有序的音调与节拍可以分别各用一个数组来管

19、理。将简谱中所有音调的频率及其节拍数分别存储于两个数组,乐谱播放时依次从数组中读出频率与节拍数。程序根据频率和定时器延时常数计算公式由定时器中断控制发出该音符的音频与节拍,输出控制电平,控制蜂鸣器播放乐曲。,任务5-11 使用定时器T0的中断实现歌曲的播放,一、单片机的音乐播放控制,5音调的宏定义在音调的存储中,直接将频率存入数组,显然不如以“dao、re、mi、fa、sao、”的形式存储更专业、易读。但是单片机并不认识“dao、re、mi、fa、sao、”这些符号。为了让单片机认识“dao、re、mi、fa、sao、”,需要在程序开头处对各音调的频率进行宏定义。以下是C语言中对音调的频率进行

20、宏定义的几个例句:#define l_dao 262 /将“l_dao”宏定义为低音“1”的频率262Hz#define re 587 将“re”宏定义为中音“2”的频率587Hz#define h_mi 1318 /将“h_mi”宏定义为高音“3”的频率1318Hz有了上述宏定义,只要直接将“dao、re、mi、fa、sao、”及其节拍存入数组,再由单片机读出处理,就可以播放音乐了。,任务5-11 使用定时器T0的中断实现歌曲的播放,一、单片机的音乐播放控制,6本项目要播放的乐谱,二、硬件电路设计,三、软件程序设计,任务5-10-3 使用计数器T1的中断控制数码管显示按键计数, 项目12 外

21、部中断源中断控制,任务5-12-1 使用外中断 对脉冲信号计数,结果送LED数码管显示任务5-12-2 使用外中断 控制数码管显示按键计数任务5-12-3 使用数码管显示倒计数过程穿插中断控制,任务5-12-1 使用外中断 对脉冲信号计数,结果送LED数码管显示,一、MCS-51单片机的中断处理流程,CPU响应中断请求后,就立即转入执行中断服务程序。不同的中断源、不同的中断要求可能有不同的中断处理具体方法,但中断处理的一般流程大致如下:现场保护和现场恢复中断打开和中断关闭中断服务程序中断返回,二、硬件电路设计,三、软件程序设计,任务5-12-1 使用外中断 对脉冲信号计数,结果送LED数码管显

22、示,任务5-12-2 使用外中断 控制数码管显示按键计数,一、单片机模块化程序设计基础知识,1程序的组成程序包括数据说明(由数据定义部分来实现)和数据操作(由语句来实现)两部分。数据说明主要定义数据结构(由数据类型表示)和数据的初值。数据操作的任务是对数据进行加工处理。从结构化程序设计的角度来说,程序应该分成若干源程序,每个源程序完成特定的功能,源程序中可重复使用的部分由子程序完成。在C语言中,子程序的作用是由函数来完成的,函数是C语言最基本的组成单位。C程序的组成如右图所示。,任务5-12-2 使用外中断 控制数码管显示按键计数,一、单片机模块化程序设计基础知识,2模块化程序设计相关的几个术

23、语 ()文件单片机控制的数据或程序都是以文件的形式来储存的,文件是单片机控制技术中的基本存储单位。在单片机控制技术中要用到各种各样的文件。 ()源程序文件一个C源程序文件是由一个或多个函数组成的。 ()目标文件目标文件包含所要开发使用的单片机的机器代码。目标指的是所要用的单片机,目标文件即目标程序文件,是单片机可执行的程序文件。 (4汇编器/编译器汇编器是针对汇编语言程序的;编译器是针对高级语言(如C语言)程序的。它们的作用是把源程序翻译成单片机可执行的目标代码,产生一个目标文件。一个源程序文件是一个汇编/编译的单位。,任务5-12-2 使用外中断 控制数码管显示按键计数,一、单片机模块化程序

24、设计基础知识,(5)段段和程序存储器或数据存储器有关,可分为程序段和数据段。段可以是重定位的,具有一个段名、类型及其属性。它们在存储器中的最终位置留给链接器/定位器确定,或由编程者指定绝对地址。一个完整段由各个模块中具有相同段名的段组合而成。 (6)模块模块是包含一个或多个段的文件,由编程者命名。模块的定义决定局部符号的作用域。通常模块为显示、计算或用户接口相关的函数或子程序。 (7)库库是包含一个或多个模块的文件。这些模块通常是由编译或汇编得到的可重定位的目标模块,在链接时和其他模块组合。链接器从库中仅仅选择与其他模块相关的模块,即由其他模块调用的模块。,任务5-12-2 使用外中断 控制数

25、码管显示按键计数,一、单片机模块化程序设计基础知识,(8)链接器/定位器链接是把各模块中所有具有相同段名及类型名的段连接起来,生成一个完整程序的过程。链接由链接器完成。它识别所有的公共符号(变量、函数和标号名)。定位器是给每个段分配地址的工具。在链接时把模块的同名段放入一整段,定位时重新填入段的绝对地址。所有同类(程序CODE、内部数据DATA和外部数据XDATA等)组合成相应的单一段。KEIL C软件中,链接器和定位器合二为一,成为链接器/定位器Lx51,如下图所示。,(9 ) 应用程序应用程序是整个开发过程的目的,是单一的绝对目标文件。它把全部输入模块的所有绝对及可重新定位的段链接起来,最

26、后形成单一的绝对模块。应用程序准备下载到仿真器调试运行,调试通过后固化到EPROM中,在用户目标系统中运行,完成所需的功能。,任务5-12-2 使用外中断 控制数码管显示按键计数,一、单片机模块化程序设计基础知识,3文件命名说明程序文件有几个常用的扩展名,需要做一些了解,简要说明如下:“.ASM”或“.A51” :汇编语言源文件“.P51” :PL/M语言源文件“.C51” 或“.C” :C语言源文件“.LST” :包含汇编/编译的程序和错误的列表文件“.OBJ” :可重定位的目标模块文件,(最后的绝对目标文件用同名而无扩展名的文件表示)“.HEX” :转换成的Intel目标文件“.LIB”

27、:库文件“.M51” 或“.MAP” 链接/定位后的映像文件“.LNK” :链接器/定位器使用的文件“.H” :编译时加入到源文件中的头文件,任务5-12-2 使用外中断 控制数码管显示按键计数,一、单片机模块化程序设计基础知识,4模块化程序开发的优点模块化程序开发是一种软件设计方法,各模块程序分别编写、编译和调试,最后各模块一起链接/定位。模块化程序开发有以下优点:(1)模块化程序开发使程序开发更有效。小块程序更容易理解与调试。当知道模块的输入和所要求的输出时,就可以相对独立地直接测试小模块。(2)当同类功能的需求较多时,可以把相关子程序放入库中以备反复调用,而不必每次都要重新编写。(3)模

28、块化程序开发使得要解决的问题与特定模块分离,很容易找到出错的模块,大大简化了程序的调试环节。,任务5-12-2 使用外中断 控制数码管显示按键计数,一、单片机模块化程序设计基础知识,5模块化程序开发过程如右图为C语言模块化程序开发过程示意图。因为需要不断完善,所以这个程序开发过程经常会重复许多遍。优秀的系统开发者会先让各模块正常工作起来,然后再把它们集成到最终的软件当中。,(1)规划整个项目,包括使用哪些硬件以及规划软件怎么分工。(2)编写程序,并把它输入到文件中以便编译。(3)编译源程序,可包括把目标模块放入库中。(4)让目标文件分配到特定的存储位置,这是定位,通常包括链接。对于较为复杂的开

29、发项目,整个程序通常由几个源程序构成,它们分别编写,或许也有库包含在内。(5)让绝对目标文件传入单片机进行控制工作。若是由驻留的监控程序完成,就是下载;若是把文件写入EPROM装入目标单片机中,就是固化。(6)调试程序,对可能存在的问题进行分析诊断与修改完善,直至项目完成。,二、硬件电路设计,三、软件程序设计,任务5-12-2 使用外中断 控制数码管显示按键计数,任务5-12-3 使用数码管显示倒计数过程穿插中断控制,一、单片机C语言程序设计的优化,程序设计的优化,就是改善编程的效率。具体来说,判断编程效率的高低,主要体现在以下几个方面:占用的存储空间是否更少;程序的运行时间是否更短;程序设计

30、所采用的方法是否使编程更省时、省力。上述几个方面实际上是相互联系的,通常占用的存储空间少的程序,其编程会更省时、省力,运行时间会更短。但是从单片机运行的角度来说,程序的效率高,更直接地意味着最终程序代码的长度更短,运行速度更快,而不是对应于编写和调试所耗费的时间长短。以下注意事项对优化程序设计、提高程序效率有很大的影响:,1尽量选择小存储模式。2使用大存储模式(COMPACT/LARGE)时应仔细考虑需要放在内部数据存储器的变量,这些变量要求是经常用的或是用于存放中间结果的。访问内部数据存储器比访问外部数据存储器快得多。内部RAM由寄存器组、位数据区和其他用户用data类型定义的变量共享。由于

31、内部RAM容量的限制(128256字节,由使用的单片机决定),所以必须权衡利弊,以解决访问效率与这些对象的数量之间的矛盾。3要考虑合理的操作顺序,完成一件事再做另一件事。,任务5-12-3 使用数码管显示倒计数过程穿插中断控制,一、单片机C语言程序设计的优化,4注意程序编写细节,使用更加科学合理的指令编写程序。5因为单片机基于二进制,所以合理选择数据存储类型和控制数组大小可以节省CPU的许多不必要的操作。6尽可能使用最小的数据类型。8051系列单片机是8位机,显然对具有char类型对象的操作比int或者long类型对象的操作要更高效。7尽可能使用unsigned数据类型。8051系列单片机并不

32、直接支持有符号数的运算,因而Cx51编译器必须产生与之相关的更多的程序代码以解决这个问题。8尽可能使用局部变量。编译器总是尝试在寄存器里保持局部变量。这样,将循环变量(如for和while循环中的计数变量)说明为局部变量是最好的。使用unsigned char/int的对象通常能获得最好的结果。此外,选择的编译器对产生程序代码的效率也有很大的影响。KEIL编译器性能卓越,KEIL Cx51编译器可将即使是有经验的程序员编制的程序进行进一步的优化,这也是为什么KEIL C51软件会有如此广泛应用的原因之一。,二、硬件电路设计,三、软件程序设计,任务5-12-3 使用数码管显示倒计数过程穿插中断控制,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报