《定时器中断应用》由会员分享,可在线阅读,更多相关《定时器中断应用(10页珍藏版)》请在金锄头文库上搜索。
1、定时/计数器的编程和应用,1. 定时/计数器的初始化编程步骤 (1)计算计数器初值 (2)确定工作方式TMOD (3)设置计数初值 (4)启动定时(计数)器 采用中断方式,注意开中断。,定时/计数器的编程和应用,2. 计数初值C的计算和装入,定时/计数器的编程和应用,例:分别确定在方式0、1、2要计100个脉冲的计数初值,并编程装入。 解:在方式0、1、2的计数初值分别为: 方式0:C=2000H-64H=1F9CH 方式1:C=10000H-64H=FF9CH 方式2:C=100H-64H=9CH,用T1、工作方式0实现1秒延时函数,晶振频率为12MHz。 方式0采用13位计数器,其最大定时
2、时间为:81921s = 8.192ms,因此,定时时间不可能象任务7中一样选择50ms,可选择定时时间为5ms,再循环200次。 定时时间为5ms,则计数值为5ms/1s =5000,T1的初值为:X = M 计数值= 8192 5000 = 3192 = C78H = 0110001111000B 13位计数器中TL1的高3位未用,填写0,TH1占高8位,所以,X的实际填写值应为: X = 0110001100011000B = 6318H,举 例1,用T1方式0实现任务7中1秒延时函数如下: void delay1s() unsigned char i;TMOD=0x00; / 置T1为
3、工作方式0for(i=0;i0xc8;i+) / 设置200次循环次数TH1=0x63; / 设置定时器初值TL1=0x18;TR1=1; / 启动T1while(!TF1); / 查询计数是否溢出,即定时5ms时间到,TF1=1TF1=0; / 5ms定时时间到,将定时器溢出标志位TF1清零 ,举 例1,用T1方式0实现1秒延时如下: unsigned char i=200; void main() TMOD=0x00; / 置T1为工作方式0TH1=0x63; / 设置定时器初值TL1=0x18;IE=0x88; /开中断TR1=1; / 启动T1while(1) ; / 等待中断,即定时
4、5ms时间到,TF1=1 void T1_int() interrupt 3 i-;if(i=0) i=200; ,举 例1,中断程序设计,用户对中断的控制和管理:IE、IP、TCON、SCON 中断程序的编制中应注意: (1)开中断:总控开关EA、中断源的中断允许位; (2)对外部中断INT0、INT1应选择触发方式; (3)多个中断源,应设定中断优先级,预设IP。,中断程序设计,C语言程序设计 1. 中断服务函数的定义 函数名()模式 Interrupt n Using m (1)Interrupt n:将函数声明为中断服务程序,n为中断源编号;n=04五个中断源:IE0、TF0、IE1、TF1、RI/TI (2)Using m: 定义函数使用的工作寄存器组;,中断程序设计,中断服务程序不允许用于外部函数,它对目标代码影响如下: (1)调用函数时,SFR中的ACC、B、DPTR和PSW当需要时入栈; (2)如果不使用寄存器组切换,中断函数所需的所有工作寄存器Rn都入栈; (3)函数退出前,所有工作寄存器出栈; (4)函数由“RETI”指令终止。,中断程序设计,2. 编程举例 #includevoid Int0() interrupt 0 P1=0x0f;P14; void main() EA=1;EX0=1;IT0=1;while(1); ,