c51第06课,用定时器中断闪灯,定时器中断的学习
- 格式:pdf
- 大小:177.25 KB
- 文档页数:3
《C51单片机》课程标准一、课程性质本课程为智能产品开发与应用专业核心课程,目标是让学生掌握单片机系统的硬件电路组成,学会单片机系统的软件设计方法,体会真实、完整的单片机开发工作过程(硬件电路焊接、电路调试、软件编程、程序下载等)。
从而使学生能够胜任小型智能化电子产品的设计与开发岗位。
它要以《实用电工技术》、《模拟与数字电路》、《C语言程序设计》课程的学习为基础,也是进一步学习《嵌入式技术应用》、《智能产品开发与实践》课程的基础。
二、课程设计思路本课程联合采用讲授法、案例教学法、多媒体组合教学法等多种教学方式,针对该课程特点,努力走实践、理论、再实践之路,将理论学习、实践应用、产品制作有机地结合为一体,以理论教学为基础,以实践训练为重点,以掌握知识和技能为教学目标,充分发挥教与学的积极性,激发学生的学习热情,提高课堂教学效果。
三、课程目标(一)总体目标通过本课程学习,使学生能够理解单片机应用系统的组成,能够根据实际控制系统要求,合理地选择单片机并对其硬件、软件进行设计;养成良好的沟通能力;培养团队协作精神;具有安全文明的工作习惯,良好的职业道德;较强的质量意识和创新精神。
具体应具备以下能力:(二)具体目标1.专业能力学生能够掌握微型计算机的基本知识和基本概念;学生能够掌握51系列单片机的基本结构和工作原理;学生能够掌握51系列单片机I/O口的特征和使用方法;学生能够掌握51系列单片机中断的工作原理和使用方法;学生能够掌握51系列单片机定时/计数器的工作原理和使用方法;学生掌握51系列单片机C51程序设计方法;学生能够掌握51系列单片机接口扩展技术和编程方法。
2.方法能力学生具有单片机应用产品电路识图、绘图能力;学生具有单片机应用产品焊接、制作、调试、故障排除、维修能力;学生具有单片机应用产品分析能力;学生具有单片机应用产品设计能力;学生具有单片机产品C语言编程能力;学生具有单片机产品软、硬件调试能力;学生具有资料查询、收集、分析、归类应用能力;学生具有常用测量工具和测量仪器使用能力。
c51中interrupt关键字的作用C51中interrupt关键字的作用C51是一种经典的单片机开发工具,具有广泛的应用范围。
在C51中,interrupt关键字起着非常重要的作用,它用于定义中断服务函数,实现单片机的中断功能。
本文将详细介绍C51中interrupt 关键字的作用及其应用。
一、中断的概念及作用在单片机系统中,中断是指由硬件或软件触发的一种特殊事件,它可以打断程序的正常执行流程,转而执行一段预定义的中断服务函数。
中断的作用在于实现对特定事件的及时响应,提高系统的实时性和可靠性。
二、中断的分类在C51中,中断可以分为外部中断和定时器中断两种。
1. 外部中断:C51单片机通常具有多个外部中断引脚,当外部中断引脚的电平发生变化时,会触发相应的中断事件。
外部中断常用于实现对外部事件的响应,如按键输入、传感器信号等。
2. 定时器中断:C51单片机通常具有多个定时器模块,定时器中断可以根据计时器的设定时间周期性地触发中断事件。
定时器中断常用于实现定时任务,如周期性的数据采集、数据发送等。
三、使用interrupt关键字定义中断服务函数为了实现中断功能,C51提供了interrupt关键字,用于定义中断服务函数。
使用interrupt关键字定义的函数,会在相应的中断事件发生时自动被调用。
下面是使用interrupt关键字定义外部中断服务函数的示例代码:```c#include <reg51.h>void ExternalInterrupt() interrupt 0{// 中断服务函数的代码}void main(){// 主函数的代码}```在上述示例代码中,使用interrupt关键字定义了一个外部中断服务函数ExternalInterrupt,并使用interrupt 0指定了它对应的中断号。
当外部中断0事件发生时,该中断服务函数会被自动调用。
类似地,使用interrupt关键字定义定时器中断服务函数的示例代码如下:```c#include <reg51.h>void TimerInterrupt() interrupt 1{// 中断服务函数的代码}void main(){// 主函数的代码}```在上述示例代码中,使用interrupt关键字定义了一个定时器中断服务函数TimerInterrupt,并使用interrupt 1指定了它对应的中断号。
内容提要单片微型计算机简称单片机,是典型的嵌入式微控制器,常用英文字母的缩写MCU表示单片机,它最早是被用在工业控制领域。
单片机由芯片内仅有CPU的专用处理器发展而来。
最早的设计理念是通过将大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更容易集成进复杂的而对体积要求严格的控制设备当中。
单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。
相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。
概括的讲:一块芯片就成了一台计算机。
它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。
同时,学习使用单片机是了解计算机原理与结构的最佳选择。
单片机是靠程序运行的,并且可以修改。
通过不同的程序实现不同的功能,尤其是特殊的独特的一些功能,这是别的器件需要费很大力气才能做到的,有些则是花大力气也很难做到的。
一个不是很复杂的功能要是用美国50年代开发的74系列,或者60年代的CD4000系列这些纯硬件来搞定的话,电路一定是一块大PCB板!但是如果要是用美国70年代成功投放市场的系列单片机,结果就会有天壤之别!只因为单片机的通过你编写的程序可以实现高智能,高效率,以及高可靠性!目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。
导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统,录像机、摄像机、全自动洗衣机的控制,以及程控玩具、电子宠物等等,这些都离不开单片机。
更不用说自动控制领域的机器人、智能仪表、医疗器械以及各种智能机械了。
所以说对于单片机课程的学习对于我们电子信息工程专业的学生来说至关重要,然而学习单片机课程设计是其一个极为重要的实践环节,无论是硬件扩展、接口应用还是编程方法、程序调试,都离不开该环节。
单片机课程设计过程中,学生通过查阅资料、接口设计、程序设计、安装调试等环节,完成一个涉及MCS-51单片机多种资源应用并具有综合功能的小系统目标板的设计与编程应用。
51单片机中断控制在单片机的世界里,中断控制就像是一位高效的调度员,能够让单片机在处理各种任务时更加灵活和高效。
今天,咱们就来好好聊聊 51 单片机的中断控制。
咱们先来了解一下啥是中断。
简单说,中断就是在单片机正常执行主程序的时候,突然有个更紧急或者更重要的事情需要处理,这时候单片机就会暂停主程序,先去处理这个紧急的事情,处理完了再回来继续执行主程序。
51 单片机有 5 个中断源,分别是外部中断 0 和 1、定时器/计数器 0 和 1 的溢出中断,还有串行口中断。
每个中断源都有自己的中断标志位和中断允许位。
外部中断 0 和 1 可以通过单片机的引脚来触发。
比如说,当外部引脚检测到一个下降沿或者低电平时,就可以产生中断。
这在很多实际应用中非常有用,比如检测按键按下、外部设备的信号变化等。
定时器/计数器 0 和 1 的溢出中断则是当定时器或者计数器的值达到设定的最大值时产生中断。
这就好比一个闹钟,设定好时间,时间一到就响铃提醒单片机去做相应的处理。
串行口中断则是在串行通信过程中,当发送或者接收完一帧数据时产生中断,方便单片机及时进行数据处理。
要让中断能够正常工作,还得设置好相关的寄存器。
中断允许寄存器 IE 用来控制各个中断源是否允许中断。
比如说,如果要允许外部中断 0 中断,就需要把 IE 寄存器中的相应位设置为 1。
中断优先级寄存器 IP 则用来确定各个中断源的优先级。
当多个中断同时发生时,优先级高的中断会先得到处理。
在编写中断服务程序的时候,有几个要点需要注意。
首先,中断服务程序要有一个特定的函数格式,一般是以“void 中断服务函数名()interrupt 中断号”这样的形式来定义。
然后,在中断服务程序中,要尽量快速地完成关键处理,因为中断服务程序会打断主程序的执行,如果处理时间过长,可能会影响主程序的实时性。
比如说,在一个温度控制系统中,主程序负责采集温度数据、显示温度等常规操作。
而外部中断0 可以用来检测温度超过设定的上限值,一旦触发中断,中断服务程序就会迅速采取降温措施,比如启动风扇或者关闭加热设备,然后迅速返回主程序。
定时器中断程序设计实验定时器中断程序设计实验简介定时器中断是嵌入式系统中的常见应用之一,通过配置定时器的相关寄存器,可以定时产生中断信号,从而实现定时功能。
本文档将介绍定时器中断的基本概念和在实验中如何设计和实现定时器中断程序。
一、定时器中断的概念定时器中断是通过硬件定时器产生的中断信号,可以用于在嵌入式系统中实现定时功能。
定时器中断的原理是定时器内部的计数器自动递增,并在计数到一个特定值时产生中断信号。
通过配置定时器的相关寄存器,可以设置定时器的计数范围、计数速度和中断触发条件等参数。
二、定时器中断的实验设计步骤以下是一个基本的定时器中断程序设计实验的步骤:1. 确定定时器的类型和工作模式根据实际需求和硬件平台的支持情况,选择合适的定时器类型和工作模式。
常见的定时器类型包括定时器/计数器和看门狗定时器,常见的工作模式包括定时模式和计数模式。
2. 配置定时器的相关寄存器根据定时器的类型和工作模式,配置定时器的相关寄存器。
主要包括计数范围、计数速度和中断触发条件等参数的设置。
3. 初始化中断控制器如果使用的嵌入式系统具有中断控制器,需要初始化中断控制器,并使能相应的中断通道。
4. 编写中断服务程序通过注册中断处理函数,并在其中编写中断服务程序。
中断服务程序主要包括对中断标志位的清除、中断处理、中断函数返回等操作。
5. 启动定时器配置完成后,启动定时器开始计数。
定时器将根据配置的参数自动递增,并在计数到设定的特定值时产生中断信号。
6. 整合定时器中断功能到主程序在主程序中,可以使用定时器中断提供的功能来实现定时任务。
可以通过在中断服务程序中设置标志位,并在主循环中检测该标志位来执行相应的任务。
三、实验注意事项在设计和实现定时器中断程序时,需要注意以下事项:1. 根据实际需求进行定时器的配置,确保定时器的参数设置合理。
2. 在中断服务程序中应尽量减少对全局变量和共享资源的访问,以避免竞态条件和数据不一致等问题的发生。
51单片机中断函数单片机的中断是指当单片机在正常运行的过程中,突然接收到来自外部设备或者其他源的信号时,能够立即停止正在执行的程序,转而执行一个特定的子程序,完成接收到的信号处理。
单片机中断函数是在中断发生时执行的一段程序代码。
下面将详细介绍51单片机中断函数的原理和使用方法。
首先,需要了解51单片机的中断原理。
51单片机有5个中断源,分别是外部中断0和1(INT0和INT1),定时器/计数器0和1的中断,以及串口中断(RI/TI)。
每个中断源都有自己的中断标志位,当中断源发生时,相应的中断标志位会被设置为1在单片机的中断函数中,需要首先设置中断使能位,使能相应的中断源。
然后,需要编写中断服务子程序(ISR)的函数体,该函数用于处理中断发生时需要完成的任务。
在ISR中,需要首先清除中断标志位,以防止重复中断。
然后,根据需要进行相关的处理,例如读取外部触发的信号或者发送/接收数据等。
以下是一个简单的外部中断0的中断函数示例:```C#include <reg52.h>void ExtInt0_ISR( interrupt 0//处理中断//...//清除中断标志位EX0=0;//使能外部中断0//...EX0=1;void main//设置中断使能位EA=1;//总中断使能位EX0=1;//使能外部中断0//...while (1)//主程序代码//...}```在上述代码中,`ExtInt0_ISR`函数是外部中断0的中断服务子程序,它使用`interrupt 0`关键字来声明,表示该函数用于处理外部中断0。
在`ExtInt0_ISR`函数体中,可以编写处理中断的代码。
在`main`函数中,首先使用`EA=1`来使能总中断,然后使用`EX0=1`使能外部中断0。
在主程序中的循环中,单片机会一直运行,直到外部中断0发生。
当外部中断0发生时,单片机会立即跳转到`ExtInt0_ISR`函数执行相应的任务。
c51中断函数的介绍C51编译器允许用c51创建中断服务程序,大家仅仅需要关心中断号和寄存器组的选择就可以了。
编译器自动产生中断向量和程序的入栈及出栈代码。
在函数声明时包括interrupt,将把所声明的函数定义为一个中断服务程序。
另外,可以用using定义此中断服务程序所使用的寄存器组。
一、中断函数的定义1、中断函数定义的格式为:函数类型函数名interrupt n using n其中:Interrupt后面的n是中断号。
关键字using后面的n是所选择的寄存器组,取值范围是0-3.定义中断函数时,using是一个选项,可以省略不用。
如果不用则由编译器选择一个寄存器组作为绝对寄存器组。
2、8051的中断过程通过使用interrupt关键字和中断号来实现,中断号告诉编译器中断程序的入口地址。
中断号对应着IE寄存器中的使能位,换句话说,IE 寄存器中的0位对应着外部中断0,相应的外部中断0的中断号是0.IE寄存器中的使能位与外部中断对应关系:中断号中断源0 外部中断01 定时器02 外部中断13 定时器1中断4 串行口中断5 定时器2中断二、使用中断函数时要注意的问题:1. 在设计中断时,要注意的是哪些功能应该放在中断程序中,哪些功能应该放在主程序中。
一般来说中断服务程序应该做最少量的工作,这样做有很多好处。
首先系统对中断的反应面更宽了,有些系统如果丢失中断或对中断反应太慢将产生十分严重的后果,这时有充足的时间等待中断是十分重要的。
其次它可使中断服务程序的结构简单,不容易出错。
中断程序中放入的东西越多,他们之间越容易起冲突。
简化中断服务程序意味着软件中将有更多的代码段,但可把这些都放入主程序中。
中断服务程序的设计对系统的成败有至关重要的作用,要仔细考虑各中断之间的关系和每个中断执行的时间,特别要注意那些对同一个数据进行操作的ISR.2. 中断函数不能传递参数。
3. 中断函数没有返回值。
4. 中断函数调用其他函数,则要保证使用相同的寄存器组,否则出错。
51单片机中断系统详解51 单片机中断系统详解(定时器、计数器)51 单片机中断级别中断源INT0---外部中断0/P3.2 T0---定时器/计数器0 中断/P3.4 INT1---外部中断1/P3.3 T1----定时器/计数器1 中断/P3.5 TX/RX---串行口中断T2---定时器/计数器 2 中断第5 最低4 5 默认中断级别最高第2 第3 第4 序号(C 语言用) 0 1 2 3 intrrupt 0中断允许寄存器IE位序号符号位EA/0 ------ET2/1 ES ET1 EX1 ET0 EX0 DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 EA---全局中允许位。
EA=1,打开全局中断控制,在此条件下,由各个中断控制位确定相应中断的打开或关闭。
EA=0,关闭全部中断。
-------,无效位。
ET2---定时器/计数器2 中断允许位。
ET2=1, 打开T2 中断。
ET2=0,关闭T2 中断。
关,。
ES---串行口中断允许位。
关,。
ES=1,打开串行口中断。
关,。
ES=0,关闭串行口中断。
关,。
ET1---定时器/计数器1 中断允许位。
关,。
ET1=1,打开T1 中断。
ET1=0,关闭T1 中断。
EX1---外部中断1 中断允许位。
EX1=1,打开外部中断1 中断。
EX1=0,关闭外部中断1 中断。
ET0---定时器/计数器0 中断允许位。
ET0=1,打开T0 中断。
EA 总中断开关,置1 为开;EX0 为外部中断0 (INT0) 开关,。
ET0 为定时器/计数器0(T0)开EX1 为外部中断1(INT1)开ET1 为定时器/计数器1(T1)开ES 为串行口(TX/RX)中断开ET2 为定时器/计数器2(T2)开ET0=0,关闭T0 中断。
EX0---外部中断0 中断允许位。
EX0=1,打开外部中断0 中断。
EX0=0,关闭外部中断0 中断。
中断优先级寄存器IP位序号位地址------PS/0 PT1/0 PX1/0 PT0/0 PX0/0 DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 -------,无效位。
51单片机中断函数(原创版)目录1.51 单片机中断函数概述2.51 单片机中断函数的分类3.51 单片机中断函数的响应过程4.51 单片机中断函数的应用实例5.总结正文一、51 单片机中断函数概述在 51 单片机中,中断函数是一种在程序运行过程中,响应外部或内部事件的机制。
通过中断函数,单片机可以在执行过程中,暂停当前任务,转去处理其他更重要的任务,待处理完毕后,再回到原任务继续执行。
这种机制可以有效提高程序的实时性和响应速度,使得单片机更加智能化和灵活。
二、51 单片机中断函数的分类51 单片机的中断函数主要分为两大类:外部中断函数和内部中断函数。
1.外部中断函数:外部中断函数是由外部设备产生的中断请求信号触发的,例如按键、传感器等。
当外部设备产生中断请求时,单片机会暂停当前任务,转去处理外部中断,待处理完毕后,再回到原任务继续执行。
2.内部中断函数:内部中断函数是由单片机内部产生的中断请求信号触发的,例如定时器中断、串行通信中断等。
当单片机内部产生中断请求时,单片机会暂停当前任务,转去处理内部中断,待处理完毕后,再回到原任务继续执行。
三、51 单片机中断函数的响应过程当外部或内部事件产生中断请求时,51 单片机会进行如下响应过程:1.中断请求信号被捕获:当外部或内部事件产生中断请求时,单片机会捕获到该信号。
2.中断响应:单片机接收到中断请求信号后,会立即停止当前任务的执行,转去处理中断请求。
3.中断处理:单片机会根据中断类型,调用相应的中断服务函数进行处理。
4.中断返回:中断服务函数处理完毕后,单片机会返回原任务继续执行。
四、51 单片机中断函数的应用实例以定时器中断为例,定时器中断是一种常见的内部中断,当定时器计数值到达设定值时,会产生中断请求。
单片机接收到中断请求后,会调用定时器中断服务函数进行处理,例如更新计时器计数值、执行特定任务等。
处理完毕后,单片机会返回原任务继续执行。
五、总结51 单片机中断函数是一种在程序运行过程中,响应外部或内部事件的机制。
单片机定时器中断程序实例在单片机编程中,定时器是一种非常重要的功能模块。
它可以用来产生精确的时间延迟,实现定时触发事件等功能。
而定时器中断则是利用定时器来实现中断功能的一种方式。
下面是一个单片机定时器中断程序实例,供大家参考。
首先,我们需要初始化定时器。
以51单片机为例,定时器的初始化函数如下所示:void Init_Timer0(void){TMOD |= 0x01; //设置为模式1TH0 = (65536 - 50000) / 256; //设置初值TL0 = (65536 - 50000) % 256;EA = 1; //打开总中断ET0 = 1; //打开定时器0中断TR0 = 1; //启动定时器0}其中,TMOD寄存器用于设置定时器的工作模式。
这里设置为模式1,即16位定时器模式。
TH0和TL0寄存器则是定时器的计数器。
我们需要通过初值来设置定时时间。
在这个例子中,我们设置的定时时间为50ms。
接下来,我们需要编写定时器中断服务程序。
定时器中断服务程序是由中断向量表中的相应位置调用的,用于响应定时器中断。
在这个例子中,我们将定时器中断服务程序命名为Timer0_isr,定义如下:void Timer0_isr(void) interrupt 1{TH0 = (65536 - 50000) / 256;TL0 = (65536 - 50000) % 256;//定时器中断处理代码}在定时器中断服务程序中,我们需要重新设置计数器的初值,以实现定时器的循环工作。
同时,在这个例子中,我们需要在定时器中断处理代码中实现某些功能,例如周期性的输出一个信号、更新某个计数值等等。
最后,在主程序中,我们只需要调用Init_Timer0函数即可开始定时器的工作。
当定时器中断发生时,定时器中断服务程序会被自动调用。
这样,我们就实现了一个简单的单片机定时器中断程序。
定时器中断流程图定时器中断是指在特定时间间隔内触发的一种中断方式,它可以用来实现定时任务、定时采样等功能。
在嵌入式系统中,定时器中断是非常常见的应用场景,下面我们来看一下定时器中断的流程图。
首先,定时器中断的触发是由硬件定时器来完成的。
硬件定时器通常包括计数器、比较器和中断控制器等部分。
当计数器的值达到比较器设置的值时,就会触发中断请求,然后中断控制器会将中断信号发送给CPU。
接着,CPU在接收到定时器中断的中断请求后,会根据中断向量表找到对应的中断服务程序。
中断服务程序是由用户编写的,它通常包括中断处理函数和中断返回指令。
中断处理函数是用来处理定时器中断事件的,它可以执行一些特定的操作,比如更新定时器的计数值、执行定时任务等。
而中断返回指令则是用来结束中断服务程序,将CPU的控制权返回给原来的程序。
最后,当中断服务程序执行完毕后,CPU会继续执行原来的程序。
如果定时器中断是周期性的,那么硬件定时器会在下一个周期内再次触发中断请求,整个流程就会循环执行。
总的来说,定时器中断的流程图可以简单描述为,硬件定时器触发中断请求 -> CPU响应中断请求 -> 执行中断服务程序 -> 中断服务程序结束 -> CPU恢复原程序执行。
这样的流程图清晰地展现了定时器中断的工作原理和执行过程。
在实际应用中,定时器中断的流程图可以根据具体的硬件平台和软件需求进行定制和优化。
比如可以根据不同的定时任务设置不同的定时器中断周期,也可以通过中断嵌套或者优先级设置来实现多个定时器中断的协同工作。
因此,对于嵌入式系统开发人员来说,熟练掌握定时器中断的流程图和原理是非常重要的。
总之,定时器中断是嵌入式系统中常用的中断方式,它通过硬件定时器和CPU的配合,实现了定时任务的精确执行。
通过上面的流程图,我们可以清晰地了解定时器中断的工作流程,这对于嵌入式系统的开发和调试都具有重要的指导意义。
希望本文对您有所帮助,谢谢阅读!。
定时器中断的一般步骤
定时器中断的一般步骤如下:
1. 设置定时器参数:首先,需要确定定时器的工作模式、计数值和预分频系数等参数。
根据需求选择合适的定时器配置。
2. 初始化定时器寄存器:将定时器相关的寄存器初始化为指定的初始值,例如将计数器清零。
3. 配置中断控制器:如果系统使用中断控制器来管理中断,需要配置中断控制器以使能定时器中断,并设置中断优先级等相关参数。
4. 启动定时器:将定时器启动,开始进行计时。
根据具体的硬件平台,可能需要设置相应的控制位或触发信号来启动定时器。
5. 等待中断触发:在定时器开始计时后,系统会周期性地产生定时器中断请求。
此时,处理器会检测到中断请求并暂停当前任务。
6. 中断服务程序:当定时器中断请求被检测到后,处理器会跳转到预先设定的中断服务程序(ISR)。
在ISR中,可以执行所需的操作,如更新显示、处理数据、采集传感器数据等。
7. 清除中断标志位:在中断服务程序中,需要清除定时器中断标志位,以便允许再次触发定时器中断。
具体的清除操作根据硬件平台而定,可以是写入相应的寄存器或执行特定指令。
8. 恢复任务执行:在中断服务程序执行完毕后,处理器会返回到之前被中断的任务,并继续执行下去。
以上步骤是定时器中断的一般流程,具体实现可能会因硬件平台、操作系统等的差异而有所不同。
1。
6课,用定时器中断闪灯,定时器中断的学习
在第二课,我们学习了用指令延时闪灯,但是用指令方式闪灯有cpu不能做其他工作的
缺点。
这一课,我们将学习如何使用定时器方式使灯闪烁。
中断的理解。
这里将涉及到单片机中断的应用,在cpu的一步步按照指令运行的过程中(主程序),
可能会有其它的更紧急的需要做的事情(中断服务程序),需要cpu暂时停止当前的程序(主
程序),做完了(中断服务程序)之后,又可以继续去运行先前的程序(主程序)。
就像你正在吃饭,一边又在给水桶里放水,吃着吃着,水满了,你就得赶快去把水龙头关掉或者换一个空的水桶,再回来吃饭。
单片机的定时器就像是一个水桶,你让它启动了,也就是水龙头打开了;开始装水了;
定时在每个机器周期不断自动加1,最后溢出了;水桶的水不断增加,最也就满出来了;定时器溢出时,你就要去做处理了;水桶的水满了,你也应该处理一下了;处理完后,单片机又可以回到刚刚开停止的地方继续运行;水桶处理了,先前你在做什么也可以继续去做什么了。
单片机的主程序是从0x0000开始运行的,单片机服务程序从哪里开始运行呢?在51
里,有多个中断服务程序入口,0号入口是外中断0,地址在0x0003;1号入口是定时器0,在0x000B;2号入口是外中断1;地址在0x0013,3号入口是定时器2;地址在0x001B,等等。
当中断发生时,程序就记下当前运行的位置,跳到对应的中断入口去运行中断服务程序,运行完之后,又跳回到原来的位置继续运行。
在C51中,你不用理会中断服务程序放在哪里,会怎么跳转。
你只要把某个函数标识
为几号中断服务函数就可以了。
在发生了对应的中断时,就会自动的运行这个函数。
请看一下相关的51的硬件的书,对定时器工作的寄存器设置做进一步的了解。
也可以
做完试验再了解,因为例程中都已经为您设置好了。
请看程序,主程序里的循环里是个死循环,什么也没有做,在实际应用中这里是放的
主程序。
在定时器服务函数里,需要重新置入定时器的值,这样才能保证每次溢出时,都是你
指定的时间。
这里置入的是0x0006,还需要走0x10000-0x0006个机器周期才溢出。
换成10进制也就是每65530个机器周期中断一次。
我们仿真的晶振是22118400HZ,每12个时钟一
个机器周期。
65530×12/22118400=0.036秒。
也就是差不多28HZ的闪烁频率。
因为51的定时器最大只有0xffff,溢出的速度很快,无法做出更久的闪烁频率来,这
一课就先观察一下这个28HZ左右频率。
在下一课我们会用静态变量的办法,做一个长达1秒钟的LED闪烁频率。
另外,由于51从中断发生到进入中断的时间不定,是3至8个机器周期,我们在进入
了中断后才重新置新的定时器初始值,这样就会存在定时误差。
也就是不是精确定时,如果要精确定时,需要使用定时器自动装载方式,也就是在定时器溢出的同时,硬件逻辑就自动把定时器初始值装载进去了,而不是在中断服务程序里赋初始值,这样就可以实现精确定时,
现在请仔细研究一下程序,并编译,进入仿真,全速运行,观察运行结果。
我们可以
看到P10上的LED在快速闪烁。
顺便,也请再练习一下停止,单步,断点等等的调试方法。
一个特殊的地方,使用DX516在单步时运行时,可能无法进入到中断服务函数中。
这
是因为中断函数可能在单步处理的瞬间已经运行过去了。
如果要单步调试中断服务函数,请在中断服务函数内设置断点,再点全速。
稍后就会停止在断点上,就可以继续单步运行了。
如图:
还有,在使用DX516仿真器时,你输入EA查看它的值时,会发现它等于0,而你明
明在程序中置了1。
作业:
试着设置一个新的定时器初始值,看看闪烁频率会不会变化。
注意如果太快,肉眼就
无法观察到闪烁了。