51单片机定时器中断总结_第1页
51单片机定时器中断总结_第2页
51单片机定时器中断总结_第3页
51单片机定时器中断总结_第4页
51单片机定时器中断总结_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1 / 32 51单片机定时器中断总结 80C51的中断系统 一、中断的概念 CPU 在处理某一事件 A 时,发生了另一事件 B 请求 CPU 迅速去处理; CPU 暂时中断当前的工作,转去处理事件 B; 待 CPU将事件 B处理完毕后,再回到原来事件 A被中断的地方继续处理事件 A,这一过程称为中断 。 引起 CPU 中断的根源,称为中断源。中断源向 CPU 提出的中断请求。 CPU暂时中断原来的事务 A,转去处理事件 B。对事件 B 处理完毕后,再回到原来被中断的地方,称为中断返回。实现上述中断功能的部件称为中断系统。 80C51中断系统的结构 80C51的中断 系统有 5个中断源 , 2 个优先级,可实现二级中断嵌套 。 TCONIE 硬件查询 IP 2 / 32 SCON 1.可由 IT0()选择其为低电平有效还是下降沿有效。当 CPU检测到引脚上出现有效的中断信号时,中断标志 IE0()置 1,向 CPU申请中断。 2、 ()可由 IT1()选择其为低电平有效还是下降沿有效。当CPU 检测到引脚上出现有效的中断信号时,中断标志 IE1()置 1,向 CPU 申请中断。 3、 TF0,片 内定时 /计数器 T0 溢出中断请求标志。当定时 /计数器 T0 发生溢出时,置位 TF0,并向 CPU 申请中断。 4、 TF1,片内定时 /计数器 T1 溢出中断请求标志。当定时 /计数器 T1发生溢出时,置位 TF1,并向 CPU申请中断。 5、 RI或 TI,串行口中断请求标志。当串行口接收完一帧串行数据时置位 RI或当串行口发送完一帧串行数据时置位 TI,向 CPU申请中断。 二、中断请求标志 1、 TCON 的中断标志 IT0,外部中断 0触发方式控制位。 当 IT0=0 时,为电平触发方式。 3 / 32 当 IT0=1 时,为边沿触发方式。 IE0,外部中断 0中断请求标志位。 IT1,外部中断 1触发方式控制位。 IE1,外部中断 1 中断请求标志位。 TF0,定时 /计数器 T0溢出中断请求标志位。 TF1,定时 /计数器 T1溢出中断请求标志位。 2、SCON的中断标志 RI,串行口接收中断标志位。当允许串行口接收数据时,每接收完一个串行帧,由硬件置位 RI。注意, RI 必须由软件清除。 TI,串行口发送中断标志位。当 CPU 将一个发送数据写入串行口发送缓冲器时,就启动了发送过程。每发送完一个串 (来自 : 海达范文网 :51 单 片机定时器中断总结 )行帧,由硬件置位 TI。 CPU 响应中断时,不能自动清除 TI, TI必须由软件清除。 80C51中断的控制 一、中断允许控制 CPU 对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器 IE控制的。 EX0(),外部中断 0 允许位; ET0() 4 / 32 ,定时 /计数器 T0中断允许位; EX1(),外部中断0 允许位; ET1(),定时 /计数器 T1 中断允许位; ES 位。 二、中断优先级控制 80C51 单片机有两个中断优先级,即可实现二级中断服务嵌套。每个中断源的中断优先级都是由中断优先级寄存器 IP中的相应位的状态来规定的 。 PX0,外部中断 0 优先级设定位; PT0,定时 /计数器 T0 优先级设定位; PX1,外部中断 0 优先级设定位; PT1,定时/计数器 T1优先级设定位; PS ,串行口优先级设定位; PT2 () ,定时 /计数器 T2优先级设定位。 而 80C52 单片机有四个中断优先级,即可实现四级中断服务嵌套。每个中断源的中断优先级由中断优先级寄存器 IP 和IPH中的相应位的状态来规定的 。 5 / 32 PX0,外部中断 0 优先级设定位; PT0,定时 /计数器 T0 优先级设定位; PX1,外部中断 0 优先级设定位; PT1,定时/计数器 T1优先级设定位; PS ,串行口优先级设定位; PT2 () ,定时 /计数器 T2优先级设定位。 同一优先级中的中断申请不止一个时,则有中断优先权排队问题。同一优先级的中断优先权排队,由中断系统硬件确定的自然优先级形成,其排列如所示: 80C51 单片机中断处理过程 中断响应条件和时间 中断响应条件 1.中断源有中断请求; 2.此中断源的中断允许位为 1; 开中断。 以上三条同时满足时, CPU才有可能响应中 断。 定时 /计数器的结构和工作原理 一、定时 /计数器的结构 定时 /计数器的实质是加 1 计数器,由高 8 位和低 8 位两个寄存器组成。 TMOD 是定时 /计数器的工作方式寄存器,确定6 / 32 工作方式和功能; TCON 是控制寄存器,控制 T0、 T1 的启动和停止及设置溢出标志。 外部中断相关位 T1方式 加 1 计数器输入的计数脉冲有两个来源 ,一个是由系统的时钟振荡器输出脉冲经 12 分频后送来;一个是 T0 或 T1 引脚输入的外部脉冲源。每来一个脉冲计数器加 1,当加到计数器为全 1 时,再输入一个脉冲就使计数器回零,且计数器的溢出使 TCON 中 TF0 或 TF1置 1,向 CPU发出中断请求。如果定时 /计数器工作于定时模式,则表示定时时间已到;如果工作于计数模式,则表示计数值已满。 可见,由溢出时计数器的值减去计数初值才是加 1 计数器的计数值。 定时 /计数器的控制 80C51 单片机定时 /计数器的工作由两个特殊功能寄存器控制。 TMOD 用于设置其工作方式; TCON 用于控制其启动和中断申请。 一、工作 方式寄存器 TMOD 7 / 32 工作方式寄存器 TMOD用于设置定时 /计数器的工作方式,低四位用于 T0,高四位用于 T1。其格式如下: GATE:门控位。 GATE 0 时,只要用软件使 TCON中的 TR0或TR1 为 1,就可以启动定时 /计数器工作; GATA 1 时,要用软件使 TR0或 TR1 为 1,同时外部中断 引脚或也为高电平时,才能启动定时 /计数器工作。即此时定时器的启动条件,加上了或引脚为高电平这一条件。 :定时 /计数模式选择位。 0 为定时模式; =1为计数模式。 M1M0:工作方式设置位。定时 /计数器有四种工作方式,由 M1M0进行设置。 二、控制寄存器 TCON TCON的低 4位用于控制外部中断 ,已在前面介绍。 TCON 的高4 位用于控制定时 /计数器的启动和中断申请。其格式如下: TF1: T1溢出中断请求标志位。 T1 计数溢出时由硬件自动置TF1为 1。 CPU 响应中断后 TF1由硬件自动清 0。 T1 工作时,CPU 可随时查询 TF1 的状态。所以, TF1 可用作查询测试的标志。 TF1 也可以用软件置 1 或清 0,同硬件置 1 或清 0 的8 / 32 效果一样。 TR1: T1 运行 控制位。 TR1 置 1 时, T1 开始工作; TR1 置 0时, T1 停止工作。 TR1 由软件置 1 或清 0。所以,用软件可控制定时 /计数器的启动与停止。 TF0: T0 溢出中断请求标志位,其功能与 TF1 类同。 TR0:T0运行控制位,其功能与 TR1类同。 定时 /计数器的工作方式 一、方式 0 方式 0 为 13 位计数,由 TL0 的低 5 位和 TH0 的 8 位组成。TL0的低 5 位溢出时向 TH0进位, TH0 溢出时,置位 TCON 中的 TF0标志,向 CPU 发出中断请求。 TCON D0D7 9 / 32 流水灯实验通过单片机控制 LED的渐亮渐灭,通常在做流水灯时只用到 I/O口的两种状 态,就是输出 “1” 或 “0” ,对于本实验板的发光二极管,采用了共阳联接 简介 要理解 PWM 先要了解其中两个重要参数,周期 T和占空比,图 1 分别标示 10%, 50%,90% 占空比的脉冲信号,对于固定的模拟信号输入值 ,例如, 9V,占空比 10%代表模拟输出值为 9x10%=,同样道理 ; 50%占空比相当于模拟输出值为 ,而 90%占空比相当于模拟输出值为 ,下面举个现实例子来说明,参见图 2 电路,输入电压为 9V,电路中有一个开关和一个小灯炮,如果我们合上开关 50ms, 在此时间隔内,灯炮将得到 9V的供电,然后再断开开关 50ms,在此时间间隔内,灯炮将没有供电,如果我们在一秒内重复上述开合动作 10 10 / 32 次,我们可以看到灯炮的亮度与接在电源时一样。我们定义此种状态为: 50%占空比, 10Hz 的调制频率减去 10000 的数当计数初值 啊? TH0=-(10000/256); TL0=-(10000%256)跟FFFF 减去 10000 的数是一样的。从 TH0=-(10000/256); TL0=-(10000%256)开始计数,计数到 10000刚好满。跟用 FFFF减去 10000的数一样!写起来更简单,不 用算! 看看原码、补码就知道。正数的补码是对应的二进制数,符号位为零,负数的补码是它的绝对值对应的二进制数按位取反再加一,符号位为一。无符号数不考虑符号,那么这个结果就跟用 FFFF减去它的绝对值一样 中断的理解。 这里将涉及到单片机中断的应用,在 cpu的一步步按照指令运行的过程中,可能会有其它的更紧急的需要做的事情,需要 cpu暂时停止当前的程序,做完了之后,又可以继续去运行先前的程序。就像你正在吃饭,一边又在给水桶里放水,吃着吃着,水满了,你就得赶快去把水龙头关掉或者换一个空的水桶,再回来吃饭。 11 / 32 单片机的定时器就像是一个水桶,你让它启动了,也就是水龙头打开了;开始装水了;定时在每个机器周期不断自动加1,最后溢出了;水桶的水不断增加,最也就满出来了;定时器溢出时,你就要去做处理了;水桶的水满了,你也应该处理一下了;处理完后,单片机又可以回到刚刚开停止的地方继续运行;水桶处理了,先前你在做什么也可以继续去做什么了。 单片机的主程序是从 0x0000 开始运行的,单片机服务程序从哪里开始运行呢?在 51里,有多个中断服务程序入口, 0号入口是外中断 0,地址在 0x0003; 1 号入口是定时器 0,在 0x000B; 2 号入口是外中断 1;地址在 0x0013, 3 号入口是定时器 2;地址在 0x001B,等等。当中断发生时,程序就记下当前运行的位置,跳到对应的中断入口去运行中断服务程序,运行完之后,又跳回到原来的位置继续运行。 在 C51中,你不用理会中断服务程序放在哪里,会怎么跳转。你只要把某个函数标识为几号中断服务函数就可以了。在发生了对应的中断时,就会自动的运行这个函数。 请看一下相关的 51 的硬件的书,对定时器工作的寄存器设置做进一步的了解。也可以做完试验再了解,因为例程中都12 / 32 已经为您设置好了。 请看程序,主程 序里的循环里是个死循环,什么也没有做,在实际应用中这里是放的主程序。 在定时器服务函数里,需要重新置入定时器的值,这样才能保证每次溢出时,都是你指定的时间。这里置入的是 0x0006,还需要走 0x10000-0x0006 个机器周期才溢出。换成 10 进制也就是每 65530 个机器周期中断 一次。我们仿真的晶振是 22118400HZ,每 12 个时钟一个机器周期。6553012/22118400 秒。也就是差不多 28HZ 的闪烁频率。 因为 51 的定时器最大只有 0xffff,溢出的速度很快,无法做出更久的闪烁频率来,这一课就先观察一下这个 28HZ 左右频率。在下一课我们会用静态变量的办法,做一个长达 1秒钟的 LED闪烁频率。 另外,由于 51从中断发生到进入中断的时间不定,是 3 至 8个机器周期,我们在进入了中断后才重新置新的定时器初始值,这样就会存在定时误差。也就是不是精确定时,如果要精确定时,需要使用定时器自动装载方式,也就是在定时器13 / 32 溢出的同时,硬件逻辑就自动把定时器初始值装载进去了,而不是在中断服务程序里赋初始值,这样就可以实现精确定时,误差只出现晶振的频率上。这是下一颗的内容。 现在请仔细研究一下程序,并编译,进入仿真,全速运行,观察运行结果。我们可以看到 P10 上的 LED 在快速闪烁。 顺便,也请再练习一下停止,单步,断点等等的调试方法。 一个特殊的地方,使用 DX516在单步时运行时,可能无法进入到中断服务函数中。这是因为中断函数可能在单步处理的瞬间已经运行过去了。如果要单步调试中断服务函数,请在中断服务函数内设置断点,再点全速。稍后就会停止在断点上,就可以继 续单步运行了。 51 单片机 c 程序求助,程序会在 main()函数里循环执行,这是怎么回事?当 main函数执行结束后,程序就结束? #include sbit flag=TCON ; void main() 14 / 32 P1=0xff; TMOD=0x01; TH0=0x15; TL0=0xA0;/定时器初始化,定时初始值为 553 IE=0x82; TR0=1; While(1); void timer0() interrupt 1 P1=P1; 15 / 32 TH0=0x15; TL0=0xA0; 答: 在 TR0=1;后面加上 while(1); 就好了 1.你的程序不会循环执行,因为没有 while(1)楼上说的很清楚! 2.定时时间为 553,整个程序执行时间不到定 时器中断时间就停止。所以定时器不能循环执行! 在 main()函数中,应该有个 while(1); , 否则,会连续执行到下面的 void timer0() interrupt 1 里面去。 16 / 32 在 void timer0() interrupt 1 中的中断返回,就不知道返回到什么地方去了。 keil做了下仿真,虽然你的主函数结束了,但是你的计时器仍然在工作,单步下去,总会进入中断函数。但是在 protues下你的定时器初值要设置合理,也就是在主函数结束前溢出,中断就能发生。然后一直会有定时中断 .挺神奇的 还是烧在板上做吧 C51中断处理过程 C51 编译器支持在 C 源程序中直接开发中断过程,因此减轻了使用汇编语言的繁琐工作,提高了开发效率。中断服务函数的完整语法如下: void 函数名模式 再入 interrupt n using r 其中 n代表中断号。 C51 编译器允许 32个中断,具体使用哪个中断由 80C51 系列的芯片决定。 r 代表第 r 组寄存器。在调用中断函数时,要求中断过程调用的函数所使用的寄存器17 / 32 组必须与其相同。 再入 用于说明中断处理函数有无 再入 能力。 C51 编译器及其对 C 语言的扩充允许编程者对中断所有方面的控制和寄存器组的使用。这种支持能使编程者创建高效的中断服务程序,用户只须在 C 语言下关心中断和必要的 寄存器组切换操作。 例 3 设单片机的 fosc=12MHz,要求用 0的方式编程,在脚输出周期为 2ms 的方波。 用 C 语言编写的中断服务程序如下: include sbit P1_0=P1 ; void timer0(void)interrupt 1 using 1 /*T0中断服务程序入口 */ P1_0=!P1_0; TH0=-(1000/256); /*计数初值重装 */ 18 / 32 TL0=-(1000%256); void main(void) TMOD=0x01; /*T0 工作在定时器方式 1*/ P1_0=0; TH0=-(1000/256); /*预置计数初值 */ TL0=-(1000%256); EA=1; /*CPU 开中断 */ ET0=1; /*T0 开中断 */ TR0=1; /*启动 T0*/ 19 / 32 dowhile(1); 在编写中断服务程序时必须注意不能进行参数传递, 不能有返回值。 4 结论 C51 编译器不但可以缩短单片机控制系统的开发周期,而且易于调试和维护。此外, C51 语言还有许多强大的功能,如提供丰富的库函数供用户直接调用,完整的编译控制指令为程序调试提供必要的符号信息等等。总之, C51 语言是广大单片机开发人员的强有力的工具。 相信很多爱好电子的朋友 ,对单片机这个词应该都不会陌生了吧。不过有些朋友可能只听说他叫单片机,他的全称是什么也许并不太清楚,更不用说他的英文全称和简称了。单片机是一块在集成电路芯片上集成了一台有一定规模的微型计算机。简称为:单片微型计算机或单片机都是从不知道转变成知道的,再转变成精通的。现在我只想把我学习单片机20 / 32 的经历,详细地讲叙给大家听听,可能有些大虾会笑话我,想:那么简单的东西还在这里卖弄。但是你错了,我 只是把我个人学习的经历讲述一遍而已,仅仅对那些想学习单片机,但又找不到好方法或者途径的朋友,提供一个帮助,使他们在学习过程中,尽量少走些弯路而已! 首先,你必须有学习单片机的热情,不是说今天去图书馆看了一个下午关于单片机的书,而明天玩上半天,后天就不知道那个本书在讲什么东西了。还是先说说我吧,我从大二的第一个学期期末的时候才开始接触单片机,但在这之前,正如上面所说的:我知道有种芯片叫单片机,但是具体长成什么样子,却一点也不知道!看到这里很多朋友一定会忍不住发笑。嘿嘿,你可千万别笑,有些大四毕业的人 也同样不知道单片机长成什么样子呢!而我对单片机的痴迷更是常人所不能想象的地步,大二的期末考试,我全放弃了复习,每当室友拿着书在埋头复习的时候,我却捧着自己从图书馆借的单片机书在那看,虽然有很多不懂,但是我还是坚持了下来,当时我就想过,为了单片机值不值得我这样去付出,或许这也是在一些三流学校的好处吧,考试挂科后,明年开学交上几十元一门的补考费,应该大部分都能过了。于是,我横下一条心,坚持看我的单片机书和资料。 当你明白了单片机是这么一回事的时候,显而易见的问题出21 / 32 来了:我要选择那种语言为单片机编写程序呢?这个问题,困扰了我好久。具体选择 C51还是 A51呢?汇编在我们大二之前并没有开过课,虽然看着人家的讲解,很容 外部中断使用步骤: 一、选择响应的中断: INT0还是 INT1, INT0对应 interrupt 0,INT1 对应 interrupt2。 二、选择触发条件: IT0 或者 IT1 为 0 表示低电平触发,为1 表示下降沿触发。 三、编辑中断函数: IT0或者 IT1=0或者 1; /设置触发条件 EA=1; /开总中断 EX0或者 EX1=1; /开外部中断 void 函数名 ()interrupt 0 或者 2 22 / 32 Do what you want; 定时器、计时器使用步骤 一、对 TMOD 赋值,确定定时器、计数器的工作方式。 GATE: 门控位 GATE=0 时,只需要在程序中使 TCON 的 TR0 或者 TR1=1 即可启动定时器、计数器; GATE=1时,需要在程序中使 TCON的TR0或者 TR1=1,同时外部中断引脚 INT0或者 INT1=1 高电平才可以启动定时器、计数器。 C/T: 定时、计数模式; C/T=1 为定时模式, C/T=1 为计数模式。外部事件计数脉冲由 23 / 32 T0 或 T1 引脚输入到计数器。 并且要求脉冲长度大于一个机器周期。 12二、计算 TL0、 TH0或者 TL1、 TH1的初值 Tcy=F N=TcyX=65536-N= 三、编辑定时器中断服务函数: TMOD=0x_ _; /确定工作方式 EA=1; /打开总中断 IP=0x_ _; /设置中断优先级 TR0或者 TR1=1; /启动定时器、计数器 void 函数名 ()interrupt 1 或者 3 24 / 32 Do what you want; t 串口: EXF2: 定时器 2 外部中断标志;当 EXEN2=1,并在引脚T2EX检查到负跳变时置位, 差生中断。 RCLK,TCLK:接送标志,当串行口以 1 或者 3工作方式时,将使用定时器 2的溢出率作为 串行口接送始终的频率。 EXEN2: 定时器 2 外部中断允许位。 C/T2: 定时器 2 工作方式,计数或者定时。 RP/RL2: 捕捉重装标志,当 EXEN2=1 时,如果 CP/RL2=1,T2EX引脚负跳变将造成捕 25 / 32 捉,如果 CP/RL2=0, T2EX 引脚负跳变将造成捕捉。 SCON=0x40 或者 0x50; /04 表示只发送不接收 T2CON=0x34; /设置定时器 2作为串口波特率发生器 RCAP2L=0x_ _; /设置波特率 RCAP2H=0x_ _; /设置波特率 EA=1; /开总中断 ES=1; /开串口中断 IP=0x_ _; /设置优先级 IPH=0x_ _; /设置优先级 void 函数名 ()interrupt 4 26 / 32 Do what you want; 定时器 /计数器接口 TMOD设定定时器 /计数器 T0和 T1的工作方式 GATE=0 定时器的启动不受到外部中断请求信号的影响一般情况下 GATE=0。 GATE=1 T0 的启动受到 /INT0 ()控制, T1 的启动还受到/INT1()控制,只有当外部中断信号 /INT0 和 /INT1 为高电平的时候才启动。 C/T : 定时 /计数方式选择位 C/T=0 工作于定时方式 C/T=1 工作于计数方式 TL0 的低 5 位和 TH0 的 8 位 满值为 2 的 13 次幂为 8192 初值 X=8192-N 方式 1 TL0的 8位和 TH0 的 8 位 27 / 32 满值为 2 的 16次幂为 65536 初值 X=65536-N 方式 2 16位计数器只用了 8位来计数; TH0或者 TH1用来保存初值。 满值为 2 的 8次幂为 256 初值 X=256-N 方式 3 Tl0可以作为定时 /计数器使用; TH0只能用作定时器使用 满值为 2 的 8次幂为 256初值 X=256-N 特殊功能寄存器 TCON: 定时 /计数器的控制寄存器) 外部中断控制 处理后由硬件电路自动清除。 TR1、 TR0:定时计数器 T1、 T0的启动位 TR1=1 启动 TR1=0 停止 TR0=1 启动 TR0=0 停止 IT0、 IT1:外部中断 0触发方式控制位。 IT0=0选择外部中断为电平触发方式 IT0=1选择外部中断为边沿触发方式 28 / 32 IE0、 IE1:外部中断 0 的中断请求标志位 电平触发的时候【 IT0=0】若引脚为高电平,则 IE0 清零 若引脚为低电平,则 IE0 置 1,向 CPU 请求中断, CPU 响应后不能由硬件自动将 IE0 清零 边沿触发的时候【 IT0=1】若第一个机器周期采样到为高电平,第二个机器周期采样到为低电平, 则 IE0置 1,向 CPU 请求中断, CPU 响应后由硬件自动将 IE0清零 经常要用到的位: TMOD :【定时 /计数器的选择以及他们的工作方式】 MOV TMOD,#02H ;定时器 0方式 2 TH0、 TL0 :【赋初值】 EA :【中断允许总控制位】 SETB EA; 开启中断 ET0 (ET1) :【定时计数器 T0 的溢出中断允许位】 SETB ET0; T0 溢出中断允许 TR0 :【启动定时 /计数器】 SETB TR0; 开启定时器 T0 29 / 32 51单片机串行口的功能与结构 串行口控制寄存器 SCON A、方式 0时, SM2 必须为 0 B、方式 1 时,若 SM2=1 则接收到有效的停止位,接受才有效 C、方式 2 和方式 3 接受数据, SM

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论