单片机_AT89S52定时器计数器

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1第8章定时器/计数器第一节概述第二节模式0、模式1及其应用第三节模式2及其应用第四节模式3及其应用第五节定时器/计数器22第一节概述回忆8051结构特点:由单一内部总线连接各功能模块,通过特殊功能寄存器(SFR)集中控制。嵌入式结构,不同型号引脚定义和SFR定义有所不同,因此,从两个方面来认识和掌握某一个功能模块。相关引脚功能相关SFR功能4两个16位定时计数器,最大计数范围:0000-FFFFH。相关的SFR:TMOD、TCON、TH0、TL0、TH1、TL1。相关引脚:T0、T1、INT0、INT1。4种工作方式。8051定时器/计数器概况5T0、T1相关引脚T0、T1:计数脉冲输入,定时方式时不用,作I/OINT0、INT1:与定时器运行控制有关,也可以无关,可编程设定6T0、T1相关SFR7定时器/计数器原理8定时功能:对固定频率的机器周期计数,每个机器周期定时器加1,计数速率=Fosc/12计数功能:对外部引脚(T0和T1)上的负跳变计数,每产生一个负跳变,计数器加1,要求高低电平均要大于1Tm,计数速率Fosc/249以N位计数器构为核心,要解决以下问题:(1)、何时控制启动、停止计数?(2)、如何控制定时还是计数?(3)、如何控制定时/计数的长短?(4)、如何用查询或中断管理溢出事件?10GATE选通门:GATE=0时,只要TRx=1,计数器就开始工作;GATE=1时,只有INTx脚和TRx同时为“1”时,计数器才开始工作.主要用于测量INTx脚上高电平脉冲的宽度.C/T计数/定时方式选择位:C/T=1时,计数方式.即计数器的计数脉冲来自T0或T1引脚的外部事件.C/T=0时:定时方式,计数脉冲来自内部振荡频率fosc的12分频.模式寄存器TMOD(SFR的地址:89H,不可按位寻址)11M1、M0模式选择:分别对应四种模式.M1M0=00,方式0:13位定时计数器M1M0=01,方式1:16位定时计数器M1M0=10,方式2:自动重装入的8位定时计数器M1M0=11,方式3:T0成为两个独立的8位计数器12T=(M-TC)×t其中,T:定时时间,M:计数器的模,TC:计数初值,t:计数器计数脉冲的周期(对于定时方式t=fosc/12)。定时/计数器4种模式比较13TF1,TF0定时器T1,T0的溢出标志:计数器溢出时硬件自动置位,即TFx=1,进入中断后再由硬件自动清除;TR1,TR0计数器T1,T0的控制位:由软件置位(计数器开始工作)或清零(计数器停止工作).IE1,IE0外部中断INT1,INT0的请求标志:当单片机检测到INTx引脚上有低电平或下降沿时,IEx=1,申请中断.IT1,IT0外中断触发类型控制:ITx=1时,外中断信号的下降沿触发IEx标志,ITx=0时,外中断信号的低电平触发IEx标志.控制寄存器TCON(SFR地址:88H)(LSB)(MSB)14第一节概述第二节模式0、模式1及其应用第三节模式2及其应用第四节模式3及其应用第五节定时器/计数器215Timer/Counter0/1Mode0:13-BitCounter(Timer1shown)16Timer/Counter0/1Mode1:16-BitCounter(Timer0shown)171、设置GATE=0,则GATE=1,因此Y=TR0,这样:TR0=1;启动定时器T0运行TR0=0;停止定时器T0运行我们把这种控制定时器运行的方法叫软触发,最常用。2、设置GATE=1,则GATE=0,因此Y=TR0*INT0电平,进一步令TR0=1,则Y=INT0电平,这样:INT0为高电平,启动定时器T0运行INT0为低电平,停止定时器T0运行我们把这种控制定时器运行的方法叫硬触发,较少用,可以用来测量正脉冲的宽度。定时器/计数器运行控制方法18根据要求给方式寄存器TMOD送一个方式控制字,以设定定时器的工作方式;(要考虑定时/计数范围,重装方式)根据需要给C/T送初值以确定需要的定时时间或计数次数;(可选,缺省为0000)根据需要给中断允许寄存器IE送中断控制字,以开放相应的中断和设定中断优先级;(可选)给TCON送命令字以启动或禁止C/T的运行。定时器/计数器的初始化方法19计数器初值:设计数模值为M,计数初值设定为TC,计数器计满为零所需的计数值为C,则:TC=M-C(M=213,216,28)定时器初值:T=(M-TC)Tm,T为需要定时时间初值TC=M-T/Tm当定时或计数范围大于某一模式下的计数范围时,要用软件对溢出计数,以增加定时或计数的范围。初值的计算20例:Fosc=12MHz,试计算定时时间2ms所需的定时器的初值.方式2、方式3TMAX=0.256ms,所以必须将工作方式设在方式0或方式1方式0:TC=213-2ms/1us=6192=1830HTL0=10H,TH0=0C1H注意1830H到TH0、TL0的重新表达,主要是由于TL0已经不是每256进1,而是每32进1方式1:TC=216-2ms/1us=63536=0F830HTL0=30H,TH0=0F8H21采用查询方式:程序一直检测TF0(或TF1),若TF0=1(或TF1=1),说明定时时间到或计满数,从而开始相应处理,如:while(TF0==0);//while(!TF0);TF0=0;//清除标志位……//开始处理溢出事件采用中断方式:程序初始化时,设置定时器溢出中断允许后,内部硬件自动检测到TF0=1(或TF1=1)时,自动响应中断,进入中断服务程序。CPU控制C/T的方式22例1:在P1.7引脚上输出50Hz的方波,已知Fosc=12MHz。23解决定时器/计数器应用问题的一般流程确定定时/计数对象C/T初始化工作模式计算初值中断或查询启动C/T运行编程实现241、确定定时对象:20ms或10ms?应当为10ms,便于产生方波:每隔10ms引脚电平取反。2、Fosc=12MHz,1Tm=1us,产生10ms定时,应选择模式0、1、2、3?应选择模式1,16位定时器,最大范围65.536ms。分析:50Hz的方波,周期为1/50=20ms253、计算初值TC=65536-10ms/1us=55536=0D8F0H分析:50Hz的方波,周期为1/50=20ms26编程实现(查询方式)#includereg51.h//要用到SFRsbitSQW=P1^7;/*定义输出方波引脚*/main(){TMOD=0x01;/*T0模式1,定时,GATE=0*/TR0=1;/*启动T0运行*/while(1)/*无限循环作为main的结束*/{TH0=0xD8;TL0=0xF0;/*每次要重新赋10ms定时的初值*/while(!TF0);TF0=0;/*查询等10ms时间到,并清除标志*/SQW=!SQW;/*引脚每隔10ms电平取反,产生50Hz方波*/}}27编程实现(中断方式)#includereg51.h/*要用到SFR*/sbitSQW=P1^7;/*定义输出方波引脚*/main()/*主程序*/{TMOD=0x01;/*T0模式1,定时,GATE=0*/TH0=0xD8;/*赋初值*/TL0=0xF0;ET0=1;EA=1;/*允许T0中断*/TR0=1;/*启动T0运行*/while(1);/*无限循环作为main的结束*/}28编程实现(中断方式)voidout_sqw(void)interrupt1/*中断服务程序*/{/*TF0标志被自动清除*/SQW=!SQW;/*引脚每隔10ms电平取反,产生50Hz方波*/TH0=0xD8;TL0=0xF0;/*重赋初值*/}29例2:在P1.0引脚上输出周期1秒,占空比为20%的方波,已知Fosc=12MHz。301、确定定时对象:1s、200ms或800ms?应当小于定时器的最大定时时间,对于模式1,最长为65.536ms,为了便于计算,取50ms作为定时对象,再用一个字节对溢出计数。50ms*4=200ms50ms*16=800ms分析:占空比20%的方波,周期为1s312、Fosc=12MHz,1Tm=1us,产生50ms定时,应选择模式0、1、2、3?应选择模式1,16位定时器,最大范围65.536ms。在所有工作模式中,模式1的定时/计数范围是最大的。分析:占空比20%的方波,周期为1s323、计算初值TC=65536-50ms/1us=15536=3CB0H分析:占空比20%的方波,周期为1s33编程实现(查询方式)#includereg51.h//要用到SFRsbitSQW=P1^0;/*定义输出方波引脚*/bitwill_be_high=0;/*定义一个标志位,0:将要输出低电平,1:将要输出高电平*/unsignedcharoverflow_counter=16;/*由800ms低电平开始,减到0,时间到,改200ms定时,overflow_counter=4*/main(){TMOD=0x10;/*T1模式1,定时,GATE=0*/TH1=0x3C;TL1=0xB0;/*赋50ms定时初值*/TR1=1;/*启动T1运行*/34编程实现(查询方式)for(;;)/*无限循环作为main的结束*/{/*如果要输出高电平,则输出高电平,4*50ms,下一次将为低电平;否则输出低电平,16*50ms,下一次将为高电平*/if(will_be_high){overflow_counter=4;SQW=1;will_be_high=0;}else{overflow_counter=16;SQW=0;will_be_high=1;}do{while(!TF1);TF1=0;/*查询等50ms时间到,并清除标志*/TH1=0x3C;TL1=0xB0;/*每次要重新赋50ms定时的初值*/}while(--overflow_counter);}//endoffor(;;)}//endofmain35编程实现(中断方式)#includereg51.h//要用到SFRsbitSQW=P1^0;/*定义输出方波引脚*/bitis_high=0;//当前状态unsignedcharoverflow_counter=16;/*由800ms低电平开始,减到0,时间到,改200ms定时,overflow_counter=4*/main(){TMOD=0x10;/*T1模式1,定时,GATE=0*/TH1=0x3C;TL1=0xB0;/*赋50ms定时初值*/ET1=1;EA=1;/*允许T1中断*/TR1=1;/*启动T1运行*/SQW=0;/*输出低电平*/while(1);/*无限循环作为main的结束*/}36编程实现(中断方式)voidout_sqw(void)interrupt3/*中断服务程序*/{/*TF1标志被自动清除*/TH1=0x3C;TL1=0xB0;/*重赋50ms定时初值*/if(--overflow_counter!=0)return;/*定时未到返回*/if(is_high){overflow_counter=16;SQW=0;is_high=0;}else{overflow_counter=4;SQW=1;is_high=1;}}37例3:在P1.0引脚上每隔2ms产生4us的负脉冲,已知Fosc=6MHz,采用T0模式0。381、确定定时对象:2ms或4us?应当是2ms,而4us负脉冲可以通过指令本身的延时来实现。如:P10=0;//1Tm=2us_nop_();//1Tm=2usP10=1;//1Tm=2us分析:周期性负脉冲392、指定模式0,不用选择。3、计算初值TC=213-2ms/2us=7192=1C18H0001110000011000B,初值:TH0=0E0H,TL0=18H分析:周期性负脉冲(高8位)(低5位)40编程实现(查询方

1 / 76
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功