《第6章 单片机的定时器计数器讲义》由会员分享,可在线阅读,更多相关《第6章 单片机的定时器计数器讲义(63页珍藏版)》请在金锄头文库上搜索。
1、第6章 单片机的定时器/计数器,定时/计数器的结构与工作原理,6.1,定时器的控制,6.2,定时/计数器的工作方式,6.3,定时/计数器的编程和应用,6.4,纯软件定时/计数方法: 定时空循环预定周次,等待预定时间 计数读取I/O口电平,统计变化次数,基本思路:由CPU统计状态变化次数,待预定结果出现后结束统计。,delay(unsigned int time ) unsigned int j = 0; for(;time0;time-) for(j=0;j125;j+); ,存在问题:占用过多CPU机时,2019/10/22,3,6.1 定时/计数器的结构和工作原理,定时/计数器的结构,基本
2、型:T0,定时、计数。 T1,定时、计数、串口波特率发生器。,增强型:增加了T2。,TH1、TL1 TH0、TL0 TCON TMOD,定时/计数器的结构,2个16位计数器T0 (TH0、TL0)和T1 (TH1、TL1)加1计数器 2个控制寄存器TCON和TMOD管理计数器的运行,2个外部引脚T0(P3.4)和T1(P3.5)接入外部脉冲,2019/10/22,5,定时/计数器的工作原理,实质是16位加1计数器,定时器模式时,是对内部机器周期计数。计数值乘以机器周期就是定时时间 计数器模式时,是对外部事件计数。脉冲由T0(P3.4)或T1(P3.5)引脚输入。,注意:(若计数值为N,计数初值
3、为X) 溢出信号使TF0或TF1置1,并发出中断请求,16位时有: N=65536-X,或X=65536-N 12MHz晶振时,计数频率低于0.5MHz,单片机软硬件联合定时/计数方法:,定时器的本质是计数器(对时钟脉冲计数),计数器则是对外来脉冲计数.,计数器的溢出空间可随计数初值改变定时时间t,t =(计数器最大空间-计数初值)机器周期 =(2n-a)12/fosc (s),基本工作原理:,t与n、a、fosc三个因素有关,(每个机器周期产生一个计数脉冲),逻辑开关 功能: = 0定时器方式, = 1计数器方式,计数值N = (计数器满计数值 - 计数初值) = (2 n a ),N与n、
4、a两个因素有关,定时/计数器的控制关系(以T1为例),门控位 GATE=0-允许TR1启动计数器 GATE=1-允许INT1启动计数器,启动控制位 TR1=1-启动计数器 TR1=0-停止计数器,外部中断1 参与定时器的启停管理,中断请求标志位 TF1=1-请求 TR1=0-复位,T1,6.2 定时/计数器的控制,2019/10/22,10,工作方式寄存器TMOD,GATE:门控位。GATE0时,只要TRx为1,就可启动计数器工作;GATA1时,定时器的启动还要加上INTx引脚为高电平这一条件。 C/T:模式选择位。 清0为定时模式,置1为计数方式。 M1M0:工作方式设置位。可设置四种工作方
5、式(见下页)。,2019/10/22,11,注意:TMOD不能进行位寻址,GATE,C/T,M1,M0,GATE,C/T,M1,M0,D7,D5,D4,D3,D2,D1,D0,TMOD,D6,(89H),T1,T0,T1方式选择位 00-方式0 01-方式1 10-方式2,注意:TMOD只能以字节方式进行初始化,例如,设置T0为定时器方式1,允许TR0启动; T1为计数器方式0,允许INT1启动。,则 TMOD = 1100 0001B =0xc1,又如,系统上电默认值为TMOD = 0,则默认状态应为:,T0和TI均为定时器方式0,允许TR0、TR1启动。,2019/10/22,14,控制寄
6、存器TCON,TFx:Tx溢出标志位。响应中断后TFx有硬件自动清0。用软件设置TFx可产生同硬件置1或清0同样的效果。 TRx:Tx运行控制位。置1时开始工作;清0时停止工作。TRx要由软件置1或清0(即启动与停止要由软件控制)。,注意,系统上电默认值为TCON = 0,则默认状态应为:,TR0和TR1均为关闭状态、电平中断触发方式、没有外部中断请求,T0工作方式,注意: T0有4种工作方式,每种工作方式都有定时和计数2种方式。 T1只有3种工作方式(T0的方式3中占用了T1的部分资源)。,T1工作方式,学习顺序:方式1方式2 方式0,6.3 定时/计数器的工作方式,2019/10/22,1
7、7,方式1:16位方式,X=216-N=65536-N 计数范围:165536 计数初值要分成2个字节分别送入TH0、TL0,方式1,定时时间:t = (216- a)12/fosc (s),使用16位定时/计数器(THx+TLx),(M0 M1为01组合时),定时范围为165,536 s(65ms)。,最大定时时间(a=0,fosc =12MHz):t = 216(s) = 65536 (s),定时方式,最大计数值:N = 65536 (脉冲),计数值: N = (216 a ),由于检测一个负跳变需要2个机器周期,即24个振荡周期,故最高计数频率= 。,计数方式,故,对于12MHz晶振,最
8、大外部脉冲的频率为0.5MHz 。,实例1 设单片机的fosc=12MHz,采用T0定时方式1在P1.0脚上输出周期为2ms的方波。,虚拟示波器,分析:周期为2ms的方波由2个半周期为1ms的正负脉冲组成,方波输出原理:定时1ms后将端口输出电平取反。,TH0 = 0xfc TL0 = 0x18,1ms定时的计数初值应为: a = 216 t* fos / 12 = 216 1000* 12/ 12 = 64536 = 0xfc18,注意:需要不断重装计数初值。,(1)查询方式 #include sbit P1_0 = P10; main () TMOD = 0x01; /设置T0定时方式1(
9、0000 0001B) TR0=1; /启动T0 for(;) TH0 = 0xfc; /装载计数初值 TL0 = 0x18; do while(!TF0); /等待TF0溢出 P1_0 =!P1_0; /定时时间到P1.0反相 TF0 = 0; /TF0标志清0 ,T0,图6.14 实例1仿真波形图,(2)中断方式 #include sbit P1_0=P10; timer0 () interrupt 1 /T0中断函数 P1_0 = !P1_0; /P1.0取反 TH0 = 0xfc; /装载计数初值 TL0 = 0x18; main () TMOD = 0x01; /T0定时方式1 TH
10、0 = 0xfc; /装载计数初值 TL0 = 0x18; EA=1; /开总中断 ET0=1; /开T0中断 TR0=1; /启动T0 while(1); ,注意:中断响应后系统可自动将TFx标志位清0,小结:使用定时/计数器的步骤,强调:TMOD的设置只能以字节形式给出,T0,(1)设置TMOD确定定时/计数器的工作状态,(2)计算计数初值产生期望的定时间隔,计数初值 a = 216- tfosc/12 (t 65536 s),THx = a / 256 TLx = a / % 256,装载计数初值:,3)确定采用何种方式处理溢出结果,若是查询方式采用条件判断语句,若是中断方式中断初始化设
11、置和中断服务程序:,do while (!TFx) ; / x=0或1 ,ETx =1; /开定时x中断,x=0或1 EA = 1; /开总中断 tx_srv () interrupt n /n=1或3 ,4)启动定时器: TR0 = 1 或 TR1= 1,5)进行定时或计数结束后的其它工作,6)为下次定时/计数做准备(清TFx标志+重装载计数初值) 若是中断方式,则无需软件清TFx标志位; 若是查询方式,需要软件清除TFx标志位。,2019/10/22,29,方式2:8位自动重装方式,X=28-N=256-N 计数范围:1256 特别适合于脉冲信号发生器,采用8位计数器,延时时间 t = (
12、28-a)12/fosc (微秒) 12MHz时的最大定时量为256s; 可自动重装载计数初值(TLx溢出后, THx数值可自动装入TLx); 因没有装载计数初值造成的定时延误,方式2定时精度相对较高。,方式2,(1)查询方式 #include sbit P1_0 = P10; main() TMOD = 0x02; TH0= TL0 = 0x06; TR0=1; for(;) do while(!TF0); P1_0 =!P1_0; TF0 = 0; ,(2)中断方式 #include sbit P1_0=P10; timer0 () interrupt 1 P1_0 = !P1_0; ma
13、in() TMOD = 0x02; TH0 = TL0 = 0x06; EA= ET0 = 1; TR0=1; while(1); ,实例2 采用T0定时方式2在P1.0口输出周期为0.5ms的方波(设fosc=12MHz)。,分析:计数初值TL0= (256-250)*12/12)%256 = 0x06,TMOD = 0x02,周期为0.5ms方波,实例3 将第4章实例5“计数显示器”中的软件查询法进行按键检测改用T0计数器方式2,并以中断方式编程。,【解】原图中按键是由I/O口P3.7引脚接入的,本实例需要将其改由T0(P3.4)引脚接入。,分析:将T0设置为计数器方式2,设法使其在1个外
14、部脉冲到来时就能溢出(即计数溢出周次为1)产生中断请求。 计数初值为: a = 2 8 1 = 255 = 0xff 初始化TMOD = 0000 0110B = 0x06,实例3参考程序,运行效果,2019/10/22,37,方式0:13位方式,工作方式0 使用13位的定时/计数器(THi7-0+TLi4-0),定时时间 t = (213 - a)12/fosc (s),计数初值 a = 213 - tfosc/12,12MHz时的最大定时量t=213s = 8.192ms,解:计数初值a=213-500012/12=3192= 1100 0111 1000B,实例4 计算T0方式0定时5m
15、s的计数初值a(设fosc=12MHz),由于方式0的TL0高3位未用(一般填0) ,因此 a= 0110 0011 0001 1000 = 6318H,即,TH0 = 0x63; TL0 = 0x18;,除计数器位数不同外,方式0与方式1的逻辑结构并无差异。 方式0采用13位计数器是为了与早期产品MCS-48单片机兼容。 方式0的初值计算比较麻烦,一般采用方式1替代。,方式0,方式1,应用: 定时器用于定时控制,或作为分频器发生各种不同频率的方波; 计数器用于外部脉冲统计或外部中断源扩充; 复杂应用需要将定时与计数结合起来。,6.4 定时/计数器的应用,实例5 由P3.4口输入一个外部低频窄脉冲信号。当该信号出现负跳变时,由P3.0口输出宽度为500s的同步脉冲,如此往复。要求据此设计一个波形展宽程序(fosc= 6MHz)。,1)将T0设置为1次计数方式2,初值设为0xff。这样P3.4一旦发生负跳变T0就会产生溢出; 2)查询TF0标志位。当TF0=1时将T0设置为500s定时方式2,初值a为0x06(=256-5006/12),同时使P3.0输出低电平; 3)查询TF0标志位。待T0再次溢出后使P3.0输出高电平,然后将T0设置为1次计数方式