定时器中断延时程序.doc_第1页
定时器中断延时程序.doc_第2页
定时器中断延时程序.doc_第3页
定时器中断延时程序.doc_第4页
定时器中断延时程序.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

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

文档简介

定时器中断延时程序(1)该类型的delay()函数采用的延时是通过对变量进行递减或递增实现的,很难计算精确的延时时间。(2)由于跑马灯的状态函数和延时函数是和主任务耦合到一起的,因此主任务的执行时间要对延时的时间产生影响。如图6-12所示,假设一个跑马灯的延时函数的延时时间是1s,但是由于主函数可能存在不同的分支,因此当主函数执行不同分支程序时,实际的跑马灯延时时间是不一样的。图6-12 程序分支对delay()函数的影响因此,对于某些对定时精度有要求的场合,例如某项工程需要跑马灯1s更换一个状态(最典型的例子就是时钟指示),就不能采用变量递减或递增的延时方法,而要采用更加精确的中断定时方法。中断的概念在前面的章节已经有过详细讲解,这里不再赘述,与采用递增递减延时函数相比,采用中断来进行跑马灯的状态更换有以下几个优点。(1)采用中断函数进行延时,可以精确保证延时的精度,即有效地保证跑马灯状态更换的频率;(2)采用中断函数进行跑马灯状态的更换,在进行延时期间,并不占用单片机资源,单片机可以执行其他的任务。采用中断延时函数来进行跑马灯状态更换的软件结构如图6-13所示,主程序和跑马灯状态变换程序是独立分开的,当中断发生时,主程序被打断,进行跑马灯状态的变换。AT89S51单片机里有两个独立的计时器T0和T1,为了得到精确的定时中断,在这里采用T0的模式0来产生定时中断。如图6-14所示为T0工作于模式0时的结构图。图6-13 采用时间中断函数的程序结构图6-14 计时器T0的工作模式0当T0工作于模式0时,相关需要配置的寄存器如下:(1)TMOD寄存器:TMOD寄存器是管理计时器T0和T1工作模式和相关配置的寄存器,寄存器内各位如图6-15所示,需要配置的功能位如下所示。M10-M00:M10-M00用于选择T0的工作模式,工作于模式0时,T0是一个13位的定时器/计数器,如图6-14所示,THx和TLx分别为8bits和5bits长度,共为13位计数器。C/T0#:如图6-14所示,C/T0#决定T0的工作方式是计时器还是计数器,当配置为0时,T0工作方式是计时器,T0的计数器由晶振脉冲时钟的6分频进行触发;而当配置为1时,T0工作方式是计数器,T0的计数器由来自T0引脚的外部脉冲进行触发,可以用于记录外部输入脉冲数。此处应将C/T0#配置为0。GATE0:如图6-14所示,GATE0位决定T0的启动方式,当配置为0时,由TR0启动计时器;当配置为1时,由外部中断启动计时器。此处应将GATE0配置为0。图6-15 TMOD寄存器(2)TCON寄存器:TCON寄存器是对T0和T1进行控制的寄存器,寄存器各位如图6-16所示,需要配置和使用的功能位如下:TR0:如图6-14所示,TR0控制计数器THx和TLx的停止与启动,该位由软件进行置位与复位,在模式0时,TR0置1为启动T0计数;TR0清零时为停止T0计数。TF0:如图6-14所示,当T0计数器溢出时,TF0置1,并向CPU请求中断,当CPU响应时,硬件自动对TF0清零,同时TF0也可以由程序查询或清零。图6-16 TCON寄存器(3)TH0和TL0:TH0和TL0在模式0下是一个13位长度的计数器,TH0为高8位,TLx为低5位。TH0和TL0在单片机复位时的初值都是0,当计数器累加溢出时产生中断,因此,为了得到指定频率的中断,必须要计算计数器的装载的初值,下面以产生2ms的中断为例。如图6-14所示,单片机的外部晶振脉冲在6分频以后对计数器T0进行触发,如使用的是24MHz的外部晶振,则触发的频率如下所示。f = 24MHz/6 = 4MHz则2ms共需要的触发数或计数值如下:2ms * 4MHz = 8000 = 0x1F40因此可知,需要计数8000后T0溢出产生中断,则T0的初始装载值如下:213 8000 = 192 = 0x00C0 = 0000000011000000B;因此T0计数器的初始装载值为0x00C0,需要注意的是,T0是由THx和TLx组成的,因此0x00C0要按照如图6-17所示的方式装载到THx和TLx中去,其中TH0的初始值为0x06,TL0的初始值为0x00。图6-17 T0计数器初始值的装载除了对计时器T0相关寄存器进行配置以外,为了使T0能够产生中断,还需要对单片机的中断寄存器IE进行配置,IE寄存器的结构如图6-18所示,需要配置的功能位如下:EA:EA位对AT89S51的所有中断进行管理,当EA置1时,单片机开放中断资源,当EA清零时,单片机屏蔽所有的中断请求。因此在完成必要的初始化后,需要产生中断时,EA位必须置1。ET0:ET0位对T0产生的中断进行管理,当ET0置1时,T0溢出时,TF0置1将产生中断,当ET0清零时,T0产生的中断被屏蔽。图6-18 IE寄存器由前面的分析,可以得到采用T0计时器中断进行延时的跑马灯状态控制程序如下,该段代码采用龙舞花样作为示例。/*File: T0IntLEDsExample.c*Description: LEDs T0 Int Triggle*Created Date: 2007-09-14* Last Modified: 2007-09-14* Author: Jeffrey - S* Notes: None*/#include #define TH0_VALUE 0x06#define TL0_VALUE 0x00unsigned int timer_tick;unsigned int timer_tick_1s;void LEDs_Move();void LEDs_Error();void LEDs_Gragon();void TIMER_Init();void TIMER_Start();#ifndef true#define true 1#endif#define TASK_1 1#define TASK_2 2/*Function: main()*Input Variables: None* Return Variables: None* Usage: Program Entry*/void main()unsigned char System_Status = true;unsigned char System_Task = TASK_2;EA = 1;/开全局中断TIMER_Init();/初始化T0TIMER_Start();/启动T0while(1)/ 程序主任务区/ ./ 程序主任务区if(System_Status != true)/当系统发生错误EA = 0;/关中断LEDs_Error();/ 跑马灯指示错误EA = 1;/ 开中断/*Function: LEDs_Move*Input Variables: None* Return Variables: None* Usage: System Normal Status Report*/void LEDs_Move()static unsigned char LEDs = 0x55;/ 静态变量用于存储LEDs发光状态P0 = LEDs;/ LED间隔亮灭并移位delay(LED_FLASH_T);/ 延时LEDs = LEDs;/ 状态改变/*Function: LEDs_Error*Input Variables: None* Return Variables: None* Usage: System Error Status Report*/void LEDs_Error()static unsigned char LEDs = 0x00; / 静态变量用于存储LEDs发光状态P0 = LEDs;/ LED警告报警亮灭delay(LED_FLASH_T);/ 延时LEDs = LEDs;/ 状态改变/*Function: LEDs_Dragon*Input Variables: None* Return Variables: None* Usage: System Dragon LED Animation*/void LEDs_Dragon()static unsigned char Direction = 1; / 静态变量用于存储龙舞方向static unsigned char LED_status = 0x0F;/ 静态变量用于存储LEDs发光状态if(Direction=1)if(LED_status=0x0F)LED_status=LED_status1;else if(LED_status=0x07)LED_status=0x0F;else if(LED_status=0x03)LED_status=0x07;else LED_status=0x03;if(LED_status=0xC0)Direction=0;else if(LED_status=0xE0)LED_status=0xF0;if(LED_status=0xC0)LED_status=0xE0;else if(LED_status1;if(LED_status=0x03)Direction=1;P0=LED_status;/*Function: TIMER_Init*Input Variables: None* Return Variables: None* Usage: T0 Initialization*/void TIMER_Init(void)ET0 = 0;/ 关闭T0的中断TMOD = 0x00;/ T0工作在模式0TCON = 0x00;/ 暂时未启动T0TL0 = TL0_VALUE;TH0 = TH0_VALUE;/ 产生2ms中断 |24 MHz 晶振ET0 = 1; / 打开T2的中断timer_tick = 0;timer_tick_1s = 0;/*Function: timer0_interrupt*Input Variables: None* Return Variables: None* Usage: TIMER_Interrupt Service Routine */void timer0_interrupt(void) interrupt 5 using 1 EA = 0;/ 关全局中断TF0 = 0;/ 清中断标志timer_tick+;/ 2ms 500if ( timer_tick = 500 ) / 1s = 2ms timer_tick_1s += 1;/ 秒计数增1timer_tick = 0;/ 2ms计数清零void LEDs_Dragon();/ 龙舞花样状态变换TL0 = TL0_VALUE;/ T0初值装载TH0 = TH0_VALUE;/ 产生2ms中断 |24 MHz 晶振EA = 1;/ 开中断/*Function: TIMER_Start*Input Variables: None* Return Variables: None* Usage: Start T0 */void TIMER_Start()TR0 = 1;/ 启动T0注意上面的代码有以下几个特点。(1)跑马灯龙舞花样状态的变换由中断每一秒进行

温馨提示

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

评论

0/150

提交评论