《第二节定时计数器与实验一、二》由会员分享,可在线阅读,更多相关《第二节定时计数器与实验一、二(45页珍藏版)》请在金锄头文库上搜索。
1、定时方法有: 软件定时:通过执行循环程序实现时间延迟,定时准确且不需外加硬件电路,但占用CPU时间。 硬件定时:通过硬件电路的连接实现定时,不增加CPU开销,但电路连接较繁,使用不方便。 可编程定时器定时:通过对系统的时钟脉冲计数进行定时,定时方便、准确,定时时间可通过程序设定。即用定时/计数器定时。,7.2 定时/计数器,1、定时/计数器的基本结构,2.定时/计数器的工作原理,MCS-51单片机有两个可编程定时/计数器T/C0、T/C1, 16位寄存器,加法计数结构,T0(TH0、TL0), T1(TH1、TL1)。 均有定时和计数功能,但进行加法计数的信号不同。,(1) 定时功能 定时功能
2、是通过计数器的计数来实现的,计数输入信号是单片机内部的时钟脉冲,每过一个机器周期产生一个脉冲,计数器就加1。,机器周期:CPU完成一个基本操作需要的时间。 1机器周期12晶振周期12/晶振频率,(2) 计数功能 计数就是对外部事件的输入脉冲进行计数。 MCS51的计数脉冲来自计数输入端T0(P3.4)或T1(P3.5),当输入信号产生由1至0的下跳变时,计数 器的值加1。,在计数方式下,单片机在每个机器周期的S5P2拍节对外部计数脉冲进行采样,如果前一个机器周期采样为1(高电平),后一个机器周期采样为0(低电平),则在紧跟着的再下一个机器周期S3P1拍节计数器的值加1。由于确认一次下跳变要花两
3、个机器周期,即24个晶振周期,所以,外部输入的计数脉冲的最高频率应为晶振频率的124,或者说外部计数脉冲的周期最短要2s(当晶振频率为12 MHz)时。,7.2.1 相关的特殊功能寄存器,工作方式控制寄存器TMOD 相关的控制寄存器 定时器控制寄存器TCON 中断允许寄存器IE 计数寄存器TH和TL(4个),计数寄存器TH和TL-TH1、TL1,TH0、TL0 2. 工作方式寄存器TMOD 用于设定T/C0、T/C1的功能和工作方式,是专用寄存器。TMOD寄存器不能位寻址。高4位和低4位名称、作用一致,高4位控制 T1,低4位控制T0。,GATE:门控位 GATE=0时,当定时控制寄存器TCO
4、N中的TR0(或TR1)置“1”时,启动定时/计数器T0(或T1)工作; TR0(或TR1)清“0”时,停止定时/计数器T0(或T1)工作。 GATE=1时,除TR0(或TR1)置“1”外,还要外部中断请求信号INT0(P3.2)(或INT1(P3.3)=1时,才启动定时/计数器T0(或T1)工作; 可用于测量在INT0(或INT1)引脚出现的脉冲高电平的宽度。,C/T: 定时/计数功能选择位 C/T=0: 定时功能 C/T=1: 计数功能,M1 M0 :工作方式选择位 满值M,0 0 :方式0 :由THX(X=0,1)的8位和TLX的低5位构 成的13位计数器。 M=2 =8192,0 1
5、:方式1 :由THX和TLX构成的16位计数器。 M=2 =65536,1 0 :方式2 :可自动重装初值的8位计数器; TLX作 计数器,THX保存计数初值,一旦计数器计 满溢出,初值自动装入,继续计数循环不止。 M=2 =256,1 1 :方式3 :仅适用于T0,分为两个8位计数器,T1 停止工作。 M=2 =256,13,16,8,8,3. 定时控制寄存器TCON TCON寄存器既参与中断控制又参与定时控制。其中高4位与定时有关。,TR0(或TR1) :定时/计数器运行控制位 TR0(或TR1)=0,停止定时/计数器T0(或T1)工作, TR0(或TR1)=1,启动定时/计数器T0(或T
6、1)工作。 软件置“1”或清“0”。,TF0(或TF1) :计数溢出标志位 当计数器计满溢出时,该位由硬件自动置“1”。 使用中断方式时,此位作中断标志位,该位置“1”的同时向CPU申请中断,在转向中断服务程序时由硬件自动清“0”。 使用查询方式时,此位作状态位供查询,但应注意查询有效后应以软件方法及时将该位清“0”。,7.2.2. 定时/计数器的工作方式 MCS-51的定时/计数器共有4种工作方式,工作方式0 方式0是13位计数器,其计数器由TH全部8位和TL的低5位构成,TL的高3位弃之不用。,定时/计数器T/C0在工作方式0逻辑结构,工作方式1 方式1是16位计数结构,计数器由TH全部8
7、位和TL全部8位构成。其逻辑电路和工作情况与方式0完全相同。,工作方式2 工作方式2具有自动重装初值的功能。非常适用于循环定时或循环计数应用,例如用于产生固定脉宽的脉冲,此外还可以作串行数据通信的波特率发生器使用。,定时/计数器T/C0在工作方式2逻辑结构,工作方式3 在工作方式3下,两个定时计数器的设置和使用是不同的,方式3只适用于T/C0,若设置T/C1为方式3时,则T1停止计数。, 方式3下的定时/计数器T/C0 在工作方式3下,T/C0被拆成两个独立的8位计数器TL0和TH0。,定时/计数器T0的工作方式3逻辑结构, 方式3下的定时计数器T/C1 一般只有当T/C1作为串行口的波特率发
8、生器使用时,T/C0才工作于方式3,此时T1可工作于方式02。 常把T/C1设置为方式2,作波特率发生器。仅用控制位来切换其定时和计数方式;因为已没有计数溢出标志位TF可供使用,因此只能把计数溢出直接送给串行口。当作为波特率发生器使用时,只需设置好工作方式,便可自动运行。如要停止工作,只需送入一个把它设置为方式3的方式控制字就可以了。,定时/计数器T/C0工作于方式3时 T1的逻辑结构,7.2.3 定时/计数器的初始化 1. 编程初始化步骤,确定T/C的工作方式,给TMOD送值; 算计数初值,送到TH和TL; T/C在中断方式工作时,要开中断,即给IE送值; 启动定时/计数器,给TR1或TR0
9、置1。,2.计数初值的计算 (1)当 =0时为定时功能, 计数初值的范围=0(2 -1) n各工作方式中计数器的位数,按顺序分别为 13,16,8,8;相对应的2 =8192,65536,256,256。,如晶振频率为12MHz,则1机器周期1s; 最小定时时间:tmin2 (2 -1)1s 1s 最大定时时间:tmax2 -01s2 s 方式1定时时间最长tmax=2 s =65536s65.5ms,定时时间t(2 -计数初值)机器周期 (2 -计数初值)(12晶振周期),(2)当 =1时为计数功能, 计数值的范围2 计数初值12,7.2.4 定时/计数器的应用实例,例1 时钟频率为12MH
10、z 的8051芯片上,用Timer1产生10kHz定时器滴答中断。 #include /T1中断服务程序,每 100个T机执行1次。 static unsigned long overflow-count=0; void timer1-ISR(void) interrupt 3 overflow-count+; /计数溢出时加1 ,/MAIN C函数:置定时器1为方式2,计数到255溢出,用156重装初值,并产生中断/ void main (void) TMOD=(TMOD /无限循环/ ,例2 设单片机晶振频率 = 12MHz,要求由P1.0输出周期为2ms的方波,试设计初始化程序。,解:
11、计算计数初值 只需在P1.0 端交替输出持续时间均为1ms的高低电 平即可实现,即定时1ms,每到1ms,P1.0取反即可。 计算方式1的计数初值 65536X1s1000s 求解得:X=65536-1000=64536 即 TH0=64536/256, TL0=64536%256;, TMOD寄存器初始化 T1不用,故高4位均设定为0; 为实现T0的运行控制,则GATE = 0; 定时功能, =0; 方式1,则 M1 M0=0 1。 所以TMOD寄存器应初始化为01H; TCON寄存器初始化 设TR0=1启动定时器; TF0清“0”,以备定时溢出时置“1”。 本例题功能可用查询方式实现,亦可
12、用中断方式实现。,用定时器0的方式1编程,采用查询方式。程序名time32.c,#include sbit P1.0=P10; void main (void) TMOD=0x01; /置定时器0为方式1 TR0=1; /启动定时器0 for(;) TH0=(65536-1000)/256; TL0=(65536-1000)%256; /装载计数初值 do while(!TF0 ); /查询等待TF0 置位 P1.0=!P1.0; /定时时间到P1.0反相 TF0=0; /查询方式时必须软件清TF0 ,用定时器0的方式1编程,采用中断方式。程序名time31.c,#include sbit P
13、1.0=P10; void timer0(void) interrupt 1 using 1 P1.0=!P1.0; /P1.0反相 TH0=(65536-1000)/256; TL0=(65536-1000)%256; /重装计数初值 void main (void) TMOD=0x01; /置定时器0为方式1 PI.0=0; TH0=(65536-1000)/256; TL0=(65536-1000)%256; /装载计数初值 EA=1; /CPU开中断 ET0=1; /T/C0 开中断 TR0=1; /启动定时器0 do while(1 ); ,例3 如p189图8-4所示,在P1.7端
14、接有一个发光二极管,要求用T/C控制,使LED亮1s,灭1s,周而复始。,解:若晶振6MHz,1T机=2s,方式1最大定时时间130ms。因定时时间长,定时一次达不到1s,可用复合定时实现: 用T/C0每定时100ms中断,将P1.0 取反一次,即P1.0输出周期 为200ms的方波脉冲; 用T/C1对P1.0 输出的脉冲计数,5个脉冲就是1s,即用T/C1 每计满5个数就中断,将P1.7反相,改变灯的状态。 T/C0定时方式1: 100000=(65536-X)*2 初值=65536-50000=15536=3CB0H T/C1计数方式2: 5=256-X 初值=256-5=251 TMOD
15、=01100001B=61H,用定时器0、计数器1的方式1、2编程,均采用中断方式。程序名time33.c,#include sbit P1.0=P10; sbit P1.7=P17; timer0( ) interrupt 1 using 1 / T/C0中断服务程序 P1.0=!P1.0; /100ms到,P1.0反相 TH0=(65536-50000)/256; TL0=(65536-50000)%256; /重装计数初值 timer1( ) interrupt 3 using 2 / T/C1中断服务程序 P1.7=!P1.7; /1s到,P1.7反相 ,main ( ) PI.7=0;