1、6.1 定时定时/计数器的结构与工作原理计数器的结构与工作原理 6.1.1 定时定时/计数器的结构计数器的结构6.1.2 定时定时/计数器的工作原理计数器的工作原理6.2 定时器定时器/计数器的控制计数器的控制6.3 定时定时/计数器的工作方式计数器的工作方式6.4 定时定时/计数器的编程和应用计数器的编程和应用6.1 定时定时/计数器的结构与工作原理计数器的结构与工作原理定时器定时器可根据设定时间进行计时的装置可根据设定时间进行计时的装置计数器计数器可对输入脉冲数进行统计的装置可对输入脉冲数进行统计的装置电子定时器电子定时器机械定时器机械定时器电子计步器电子计步器机械计数器机械计数器典型的定
2、时器和计数器产品典型的定时器和计数器产品定时定时/计数器装置计数器装置定时定时/计数器的基本概念计数器的基本概念n几乎所有微机系统中都有定时几乎所有微机系统中都有定时/计数器,所有单片机计数器,所有单片机内部都集成了定时内部都集成了定时/计数器。计数器。nMCS-51系列单片机系列单片机8051有两个有两个16位定时位定时/计数器计数器T0、T1,8052有三个定时有三个定时/计数器计数器T0、T1、T2,这些定时这些定时/计数器都具有定时器和计数器两种工作模计数器都具有定时器和计数器两种工作模式。式。n定时定时/计数器计数器实质上都是通过计数来实现实质上都是通过计数来实现的。作为定的。作为定
3、时器工作时,是对固定周期的信号(如机器周期)时器工作时,是对固定周期的信号(如机器周期)进行计数,而作为计数器工作时,是对外部引脚进行计数,而作为计数器工作时,是对外部引脚(如(如P3.4)的输入脉冲进行计数。)的输入脉冲进行计数。定时定时空循环预定周次,等待预定时间空循环预定周次,等待预定时间计数计数读取读取I/O口电平,统计变化次数口电平,统计变化次数基本思路:基本思路:CPU负责统计状态变化的次数,待预定结负责统计状态变化的次数,待预定结果出现后发出结束信息。果出现后发出结束信息。delay(unsigned int time)unsigned int j=0;for(;time0;ti
4、me-)for(j=0;j125;j+);存在问题:占用过多存在问题:占用过多CPU机时机时单片机纯软件定时单片机纯软件定时/计数方法:计数方法:等待等待CPU响应响应系统时钟脉冲系统时钟脉冲加加1计数器计数器溢出标志溢出标志溢出溢出定时器定时器外来信号脉冲外来信号脉冲加加1计数器计数器溢出标志溢出标志溢出溢出等待等待CPU响应响应计数器计数器外来信号脉冲外来信号脉冲加加1计数器计数器溢出标志溢出标志溢出溢出等待等待CPU响应响应系统时钟脉冲系统时钟脉冲K定时定时/计数器计数器定时器本质上是计数器,前者是对时钟脉冲进行计数,后定时器本质上是计数器,前者是对时钟脉冲进行计数,后者则是对外来脉冲进
5、行计数者则是对外来脉冲进行计数单片机软硬件定时单片机软硬件定时/计数方法:计数方法:6.1.1定时定时/计数器的结构计数器的结构以以8051为例,其内部集成了两个为例,其内部集成了两个16位的定时位的定时/计数器计数器T0和和T1,涉及的,涉及的SFR有有6个,其中,个,其中,TH0、TL0是是T0的的16位加位加1计数器,计数器,TH1、TL1是是T1的的16位加位加1计数器,工作方式通过计数器,工作方式通过TMOD设置,启停控制和中断标志在设置,启停控制和中断标志在TCON中。中。计数器的溢出空间可随计数初值改变计数器的溢出空间可随计数初值改变定时时间定时时间tt=(模值模值-计数初值计数
6、初值)机器周期机器周期 =(2n-a)12/fosc (微秒微秒)定时时间定时时间t与与n(8、13、16)、a、fosc三个因素有关三个因素有关TFx(X=0、1)6.1.2 定时定时/计数器计数器工作原理工作原理6.1 定时定时/计数器的结构与工作原理计数器的结构与工作原理6.2 定时器定时器/计数器的控制计数器的控制6.2.1 方式控制寄存器方式控制寄存器TMOD6.2.2 控制寄存器控制寄存器TCON6.3 定时定时/计数器的工作方式计数器的工作方式6.4 定时定时/计数器的编程和应用计数器的编程和应用6.2 定时器定时器/计数器的控制计数器的控制6.2.1 定时器方式定时器方式控制寄
7、存器控制寄存器TMOD控制寄存器控制寄存器TCONTMOD各位定义:各位定义:8位分为两组,高四位控制位分为两组,高四位控制T1,低,低4位控制位控制T0。6.2.1 定时器方式定时器方式控制寄存器控制寄存器TMODGATE位:位:门控位。门控位。GATE1时,时,T0、T1是否计数要受是否计数要受到外部引脚输入电平的控制,到外部引脚输入电平的控制,INT0引脚控制引脚控制T0,INT1引引脚控制脚控制T1。可用于测量在。可用于测量在INT0和和INT1引脚出现的正脉冲引脚出现的正脉冲的宽度。若的宽度。若GATE0,即不使能门控功能,定时,即不使能门控功能,定时/计数器计数器的运行不受外部输入
8、引脚的运行不受外部输入引脚INT0、INT1的控制。的控制。M0M0M1M1C/TC/TGATEGATEM0M0M1M1C/TC/TGATEGATE定时定时/计数器计数器1TMOD89H 7 6 5 4 3 2 1 0定时定时/计数器计数器0GATEC/TM1M0GATEC/TM1M07543210TMOD6(89H)定时器定时器1定时器定时器0 T1门控位门控位参与定时器参与定时器的启停管理的启停管理方式选择位方式选择位00-方式方式001-方式方式110-方式方式211-方式方式3模式选择位模式选择位C/T=0-定时定时C/T=1-计数计数C/T位:位:计数器模式和定时器模式的选择位。计数
9、器模式和定时器模式的选择位。C/T0,为定时器模式,内部计数器对晶振脉冲,为定时器模式,内部计数器对晶振脉冲12分频分频后的脉冲计数,该脉冲周期等于机器周期,所以可以理后的脉冲计数,该脉冲周期等于机器周期,所以可以理解为对机器周期进行计数。从计数值可以求得计数的时解为对机器周期进行计数。从计数值可以求得计数的时间,所以称为定时器模式。间,所以称为定时器模式。C/T1,为计数器模式,计数器对外部输入引脚,为计数器模式,计数器对外部输入引脚T0(P3.4)或)或T1(P3.5)的外部脉冲(负跳变)计数,)的外部脉冲(负跳变)计数,允许的最高计数频率为晶振频率的允许的最高计数频率为晶振频率的1/24
10、。M0M0M1M1C/TC/TGATEGATEM0M0M1M1C/TC/TGATEGATE定时定时/计数器计数器1TMOD89H 7 6 5 4 3 2 1 0定时定时/计数器计数器0M1 M0:四种工作方式的选择位四种工作方式的选择位 工作方式选择表工作方式选择表 T0 分成两个独立的分成两个独立的 8 位计数器位计数器,T1 在方式在方式 3 时停止工作时停止工作 31 1自动重装入初值的自动重装入初值的 8 位定时器位定时器/计数器计数器 21 016 位定时器位定时器/计数器计数器 10 113 位定时器位定时器/计数器计数器(TH的的 8 位和位和TL的低的低 5 位)位)00 0说
11、说 明明方式方式M1 M0 M0M0M1M1C/TC/TGATEGATEM0M0M1M1C/TC/TGATEGATE定时定时/计数器计数器1TMOD89H 7 6 5 4 3 2 1 0定时定时/计数器计数器0 TF0、TF1分别是定时器分别是定时器/计数器计数器T0、T1 的溢出标志位的溢出标志位,加法计数器计满溢出时置加法计数器计满溢出时置 1,申请中断申请中断,在中断响应后自动复在中断响应后自动复 0。TF产生的中断申请是否被接受产生的中断申请是否被接受,还需要由中断是否开放来还需要由中断是否开放来决定。决定。TR1、TR0 分别是定时器分别是定时器/计数器计数器T1、T0 的运行控制位
12、的运行控制位,通过软件置通过软件置 1 后后,定时器定时器/计数器才开始工作计数器才开始工作,在系统复位时被在系统复位时被清清0。6.2.2 定时器定时器控制控制寄存器寄存器TCONIT0IT0IE0IE0IT1IT1IE1IE1TR0TR0TF0TF0TR1TR1TF1TF1 8FH 8EH 8DH 8CH 8BH 8AH 89H 88HTCON88H 7 6 5 4 3 2 1 0 T1TF1TR1TF0TR0IE1IT1IE0IT08FH8DH8CH8BH8AH89H88HTCON8EH(88H)定时器控制位定时器控制位外部中断控制位外部中断控制位启动控制位启动控制位TR1=1-启动启动
13、TR1=0-停止停止溢出标志位溢出标志位TF=1-溢出溢出TF=0-清零清零以以T1为例:为例:门控位门控位GATE为为0,由,由TR1单独控制定时单独控制定时/计数器计数器1的启停。的启停。门控位门控位GATE为为1,由,由TR1和和INT1联合控制定时联合控制定时/计数器计数器1的启停。的启停。GATEC/TM1M0GATEC/TM1M0D7D5D4D3D2D1D0TMODD6(89H)定时器定时器1定时器定时器0 初始状态初始状态:允许:允许TRx启动计数器、定时模式、方式启动计数器、定时模式、方式0TF1TR1TF0TR0IE1IT1IE0IT08FH8DH8CH8BH8AH89H88
14、HTCON8EH(88H)定时器控制位定时器控制位外部中断控制位外部中断控制位初始状态初始状态:没有定时:没有定时/计数溢出,计数溢出,TRx处于关闭状态处于关闭状态初始状态初始状态6.1 定时定时/计数器的结构与工作原理计数器的结构与工作原理6.2 定时器定时器/计数器的控制计数器的控制6.3 定时定时/计数器的工作方式计数器的工作方式6.3.1 方式方式06.3.2 方式方式16.3.3 方式方式26.3.4 方式方式36.4 定时定时/计数器的编程和应用计数器的编程和应用6.3 定时定时/计数器的工作方式计数器的工作方式一、一、方式方式 0 6.3.1 方式方式0-13位定时位定时/计数
15、器计数器 在方式在方式0下,下,T0和和T1工作在工作在13位的定时位的定时/计数器方式,由计数器方式,由TH的高的高 8 位和位和TL的低的低 5 位组成。位组成。当当T0的的13位计数器加到全部为位计数器加到全部为 1 以后,再加以后,再加1就产生溢出,就产生溢出,这时置这时置TCON的的TF0为为 1,同时把计数器全部变,同时把计数器全部变 0,然后从,然后从 0 开开始继续计数。要想从原初值继续计数和,必须人为恢复原初值。始继续计数。要想从原初值继续计数和,必须人为恢复原初值。以以T0为例图示如下:为例图示如下:方式方式0的计数长度的计数长度M为为213。定时时间定时时间 t=(213
16、-a)12/fosc(s)计数初值计数初值 a=213-tfosc/12若若fosc=12MHz,方式,方式0最大定时量最大定时量t=213s=8.192ms最小定时量最小定时量t=1s初值是初值是13位二进制数,但要注意的是高位二进制数,但要注意的是高8位赋值给位赋值给TH0,低,低5位前面补足位前面补足 3 个个 0 凑成凑成 8 位赋给位赋给TL0。例如,如要求计数值为例如,如要求计数值为1000,则初值为,则初值为 aM100081921000=7192 1C18H1 1100 000 1 1000B 则赋初值时,则赋初值时,TH00E0H,TL018H。6.3.2 方式方式1-16位
17、定时位定时/计数器计数器 方式方式1和方式和方式0的工作原理基本相同,唯一不同是的工作原理基本相同,唯一不同是T0和和T1工作在方式工作在方式1时时是是16位的计数位的计数/定时器。定时器。方式方式1时的计数长度时的计数长度M是是2的的16次方。次方。16位的初值直接拆成高低字节,分位的初值直接拆成高低字节,分别送入别送入TH和和TL即可。即可。以以T0为例图示如下为例图示如下定时时间为:定时时间为:t=(216-a)12/fosc (微秒微秒)定时范围扩大到定时范围扩大到1s 65ms(fosc=12MHz时)时)计数初值无需修正计数初值无需修正:a=216-tfosc/12 使用过程中计数
18、初值需要重装载使用过程中计数初值需要重装载6.3.3 方式方式2-8位位自动重装载初值自动重装载初值定时定时/计数器计数器 工作方式工作方式0和工作方式和工作方式1的最大特点就是计数溢出后,的最大特点就是计数溢出后,计数器计数器为全为全0,因而循环定时或循环计数应用时就存在反复设置初值的,因而循环定时或循环计数应用时就存在反复设置初值的问题,这给程序设计带来许多不便,同时也会影响计时精度。问题,这给程序设计带来许多不便,同时也会影响计时精度。工作方式工作方式2就针对这个问题而设置,它具有自动重装载功能,就针对这个问题而设置,它具有自动重装载功能,即自动加载计数初值,所以也称为自动重加载工作方式
19、。即自动加载计数初值,所以也称为自动重加载工作方式。以以T0为例图示如下为例图示如下 在这种工作方式中,在这种工作方式中,16位位计数器计数器分为两部分,即以分为两部分,即以TL0为为计数器计数器,以,以TH0作为预置寄存器,初始化时把计数初值分别作为预置寄存器,初始化时把计数初值分别加载至加载至TL0和和TH0中,当计数溢出时,不再象方式中,当计数溢出时,不再象方式0和方式和方式1那那样需要样需要“人工干预人工干预”,由软件重新赋值,而是由预置寄存器,由软件重新赋值,而是由预置寄存器TH以硬件方法自动给以硬件方法自动给计数器计数器TL0重新加载。重新加载。延时时间延时时间 t=(28-a)1
20、2/fosc (微秒微秒)可自动重装载计数初值可自动重装载计数初值(TLx溢出后溢出后THx中数值可自中数值可自动装入动装入TLx适合于作串口波特率发生器(定时精度较适合于作串口波特率发生器(定时精度较高)高)6.3.4 方式方式3 两个两个8位定时位定时/计数器计数器仅用于仅用于T0,图示如下:低,图示如下:低8位为位为8位定时位定时/计数器,高计数器,高8位为定时器位为定时器在工作方式在工作方式3模式下,定时模式下,定时/计数器计数器0被拆被拆成两个独立的成两个独立的8位计数器位计数器TL0和和TH0。TL0既可以作既可以作计数器计数器使用,也可以作为使用,也可以作为定时器定时器使用,定时
21、使用,定时/计数器计数器0的各控制位和引脚信号全归它使用。其功能和操作与的各控制位和引脚信号全归它使用。其功能和操作与方式方式0或方式或方式1完全相同。完全相同。TH0就没有那么多就没有那么多“资源资源”可利用了,可利用了,只能作为简单的只能作为简单的定时器定时器使用,而且由于定时使用,而且由于定时/计数器计数器0的控制位的控制位已被已被TL0占用,因此只能借用定时占用,因此只能借用定时/计数器计数器1的控制位的控制位TR1和和TF1,也就是以计数溢出去置位,也就是以计数溢出去置位TF1,TR1则负责控制则负责控制TH0定时的定时的启动和停止。启动和停止。由于由于TL0既能作既能作定时器定时器
22、也能作也能作计数器计数器使用,而使用,而TH0只能作只能作定时器定时器使用而不能作使用而不能作计数器计数器使用,因此在使用,因此在方式方式3模式下,定时模式下,定时/计数器计数器0可以构成可以构成二个定时器或者一个定时器和一个计数器二个定时器或者一个定时器和一个计数器。如果定时如果定时/计数器计数器0工作于工作工作于工作方式方式3,那么定时,那么定时/计数器计数器1的的工作方式就不可避免受到一定的限制,因为自己的一些控制位工作方式就不可避免受到一定的限制,因为自己的一些控制位已被定时已被定时/计数器计数器借用,只能工作在方式借用,只能工作在方式0、方式、方式1或方式或方式2下,下,如果设置如果
23、设置T1工作在方式工作在方式3,则,则T1停止工作,相当于其他方式时停止工作,相当于其他方式时令令TR10。使用定时使用定时/计数器的步骤:计数器的步骤:强调强调:TMOD的工作方式字只能以字节形式给出的工作方式字只能以字节形式给出T0 (1 1)设置设置TMODTMOD工作方式字工作方式字确定确定T0?T1?确定确定定时模式?计数模式?定时模式?计数模式?确定确定方式方式0、方式、方式1、方式、方式2、方式、方式3?确定定时确定定时/计数器的工作状态计数器的工作状态计数初值计数初值 a=2n-tfosc/12TH0=(213-a)/32;TL0=(23-a)%32;装载初值,当工作于方式装载
24、初值,当工作于方式0:(12MHz晶振晶振)(2 2)设置合适的计数初值设置合适的计数初值产生期望的定时间隔:产生期望的定时间隔:TH0=(216-a)/256;TL0=(216-a)%256;装载初值,当工作于方式装载初值,当工作于方式1:TH0TL0=28-a;装载初值,当工作于方式装载初值,当工作于方式2:ET0=1ET0=1;EA=1EA=1;void void txtx_srv(void)interrupt _srv(void)interrupt n n (3)确定采用何种方式处理溢出结果确定采用何种方式处理溢出结果 查询方式?中断方式?查询方式?中断方式?若是查询方式若是查询方式采
25、用条件判断语句采用条件判断语句if(TF0)while(!TF0)若是中断方式若是中断方式中断初始化和中断服务程序:中断初始化和中断服务程序:(4)启动定时器:启动定时器:TR0=1 或或 TR1=1(5)进行定时或计数结束后的工作进行定时或计数结束后的工作(6)为下次定时为下次定时/计数做准备(清计数做准备(清TF标志标志+重装载初值)重装载初值)若是中断方式,则无需软件清若是中断方式,则无需软件清TF标志位;标志位;若是查询方式,还需软件清除若是查询方式,还需软件清除TF标志位标志位 若是方式若是方式2,没有重装载问题,否则需重装载初值,没有重装载问题,否则需重装载初值解:设解:设fosc
26、=12MHz计数初值计数初值a=213-5100012/12=3192=1100 0111 1000TH0TL00 1 1 0 0 0 1 1 0 0 0 1 1 0 0 0 6 3 1 8 H 注意:方式注意:方式0的的TL0高高3位未用,可填位未用,可填0,因此,因此 a=0110 0011 0001 1000=6318H编程时需将此初值装载到编程时需将此初值装载到Tx中,例如:中,例如:TH0=0 x63;TL0=0 x18;举例举例:计算计算T0方式方式0定时定时5ms的计数初值的计数初值a6.3.5 定时器定时器/计数器的初始化计数器的初始化1.1.初始化步骤初始化步骤(1)(1)确
27、定确定T/CT/C的工作方式编程的工作方式编程TMODTMOD寄存器寄存器(2)(2)计算计算T/CT/C中的计数初值,并装载到中的计数初值,并装载到THiTHi和和TLiTLi(3)(3)开开CPUCPU中断和相应中断源中断编程中断和相应中断源中断编程IEIE寄存器寄存器(4)(4)启动定时器启动定时器/计数器编程计数器编程TCONTCON中和中和TR1TR1或或TR0TR0位位2.2.计数初值的计算计数初值的计算(1)(1)定时器的计数初值定时器的计数初值设设fosc=6MHzfosc=6MHz,则机器周期为,则机器周期为2us2us方式方式0 01313位定时器最大定时间隔位定时器最大定
28、时间隔=2=213132us=16.384ms2us=16.384ms方式方式1 11616位定时器最大定时间隔位定时器最大定时间隔=2=216162us=131.072ms2us=131.072ms方式方式2 28 8位定时器最大定时间隔位定时器最大定时间隔=2=28 82us=512us2us=512us例如:例如:若使若使T/C工作在定时器工作在定时器方式方式1 1,要求定时,要求定时1ms1ms,求计数初值。,求计数初值。如计数初值为如计数初值为a,a,则有则有(2(21616-a)-a)2us=1000us,或,或a=216-500,因因此此TH、TL可置入可置入65536-500(
29、2)计数器的计数初值计数器的计数初值在计数方式下:在计数方式下:方式方式013位计数器最大计数值位计数器最大计数值=213=8192方式方式116位计数器最大计数值位计数器最大计数值=216=65536方式方式28位计数器最大计数值位计数器最大计数值=28=256us例如:例如:若使若使T/C工作在计数方式工作在计数方式2,要求计数,要求计数10个脉冲,求计数个脉冲,求计数初值。初值。如计数初值为如计数初值为x,则有则有28-a10,或,或a=256-10因此因此THTL2466.1 定时定时/计数器的结构与工作原理计数器的结构与工作原理6.2 定时器定时器/计数器的控制计数器的控制6.3 定
30、时定时/计数器的工作方式计数器的工作方式6.4 定时定时/计数器的编程和应用计数器的编程和应用 6.4.1 定时功能应用举例定时功能应用举例 6.4.2 计数功能应用举例计数功能应用举例6.4 定时定时/计数器的编程和应用计数器的编程和应用设单片机的设单片机的fosc=12MHzfosc=12MHz,采用,采用T0T0定时方式定时方式1 1在在P1.0P1.0脚上输出脚上输出周期为周期为2ms2ms的方波(分别采用查询法和中断法)。的方波(分别采用查询法和中断法)。虚拟示波器虚拟示波器例例6.16.1周期为周期为2ms2ms的方波由的方波由2 2个半周期为个半周期为1ms1ms的正负脉冲组成的
31、正负脉冲组成方波输出原理:定时方波输出原理:定时1ms后将端口输出电平取反。后将端口输出电平取反。2ms1ms已知机器已知机器fosc =12MHz,则,则1ms定时的计数初值应为:定时的计数初值应为:a=tfosc/12 =1000/(12/12)=1000解:解:#include sbit P1_0=P10;void main(void)TMOD=0 x01;/T0定时方式定时方式1 TH0=(65536-1000)/256;/预置计数初值预置计数初值 TL0=(65536-1000)%256;TR0=1;/启动启动T0 do while(!TF0);/等待定时器溢出等待定时器溢出 TF0
32、=0;/标志清标志清0 P1_0=!P1_0;/定时时间到定时时间到P1.0反相反相 TH0=(65536-1000)/256;/预置计数初值预置计数初值 TL0=(65536-1000)%256;while(1);T0(1 1)用用T T0 0定时方式定时方式1 1查询方式编程,程序如下:查询方式编程,程序如下:#include sbit P1_0=P10;void timer0(void)interrupt 1 P1_0=!P1_0;/P1.0取反取反 TH0=(65536-1000)/256;/预置计数初值预置计数初值 TL0=(65536-1000)%256;void main(voi
33、d)TMOD=0 x01;/T0定时方式定时方式1 P1_0=0;TH0=(65536-1000)/256;/预置计数初值预置计数初值 TL0=(65536-1000)%256;EA=1;ET0=1;TR0=1;do while(1);/等待定时器溢出等待定时器溢出(2)(2)用用T T0 0定时方式定时方式1 1中断方式编程,程序如下:中断方式编程,程序如下:注意:注意:(1)如果通过示波器看不清周期是否为如果通过示波器看不清周期是否为2ms可以通过频率计测试频率来实现间接可以通过频率计测试频率来实现间接检测。检测。(2)由于恢复时间常数需要时间,所以用由于恢复时间常数需要时间,所以用频率计
34、实测的频率一定小于频率计实测的频率一定小于500,如果希,如果希望获得频率望获得频率500的信号,可通过修改计数的信号,可通过修改计数值,从值,从1000改为改为994(3)如果是采用中断方式,由于响应中断,如果是采用中断方式,由于响应中断,转向中断服务程序以及从中断服务程序返转向中断服务程序以及从中断服务程序返回都需要时间,所以要达到频率回都需要时间,所以要达到频率500,计,计数值需进一步修改为数值需进一步修改为991。(4)如果采用可自动恢复计数初值的方式如果采用可自动恢复计数初值的方式2 来实现可按多次定时来实现。来实现可按多次定时来实现。图图6.13 6.13 实例实例1 1仿真效果
35、图仿真效果图图图6.14 6.14 实例实例1 1仿真波形图仿真波形图利用方式利用方式2中断中断10次实现就没有误差次实现就没有误差#include sbit P1_0=P10;char cnt=0;void timer0(void)interrupt 1 cnt+;if(cnt=10)P1_0=!P1_0;/P1.0取反取反 cnt=0;void main(void)TMOD=0 x02;/T0定时方式定时方式2 P1_0=0;TL0=TH0=256-100;/预置计数初值预置计数初值 EA=1;ET0=1;TR0=1;do while(1);/等待定时器溢出等待定时器溢出利用利用T0T0测
36、量某正脉冲宽度,脉冲从测量某正脉冲宽度,脉冲从P3.2P3.2输入。输入。已知此脉冲宽度小于已知此脉冲宽度小于10ms10ms,系统时钟频率为,系统时钟频率为12MHz12MHz。测量结。测量结果转换为果转换为BCDBCD码顺序存放在片内码顺序存放在片内40H40H单元为首地址的数据存单元为首地址的数据存储单元。(储单元。(40H40H地址存个位)地址存个位)解:解:GATE=1GATE=1时允许外部输入脉冲控制定时器的启停,即时允许外部输入脉冲控制定时器的启停,即INTx=1INTx=1且且TRxTRx置置1 1,可启动定时器;而,可启动定时器;而INTx=0INTx=0可关闭定时器。可关闭
37、定时器。在此期间的计数器值即为脉冲宽度值。在此期间的计数器值即为脉冲宽度值。例例6.26.2#include sbit P3_2=P32;void main()unsigned char*P,i;int a;P=0 x40;/指针指向片内指针指向片内40H单元单元 TMOD=0 x09;/GATE=1,计数器,计数器T0方式方式1定时定时 TL0=0 x00;TH0=0 x00;/装入初值装入初值 do while(P3_2=1);/等待等待INT0变低变低 TR0=1;/启动计数器启动计数器 while(P3_2=0);/等待等待INT0变高,即脉冲上升沿变高,即脉冲上升沿 while(P3
38、_2=1);/等待等待INT0变低,即脉冲下降沿变低,即脉冲下降沿 TR0=0;/停止计数停止计数 i=TH0;/读入读入TH0值值 a=i*256+TL0;/计数结果转换为计数结果转换为10进制进制 for(a;a!=0;)/a不等于不等于0时循环,转换为时循环,转换为BCD码码 *P=a%10;/个位存放在个位存放在40单元单元 a=a/10;P+;T0#include sbit P3_2=P32;void main()unsigned char*P,v5=0,0,0,0,0;unsigned int i,a;P=0 x40;/指针指向片内指针指向片内40H单元单元 TMOD=0 x09;
39、/GATE=1,计数器,计数器T0方式方式1定时定时 TL0=0 x00;/装入初值装入初值 do while(P3_2=1);/等待等待INT0变低变低 TR0=1;/启动计数器启动计数器 while(P3_2=0);/等待等待INT0变高,即脉冲上升沿变高,即脉冲上升沿 while(P3_2=1);/等待等待INT0变低,即脉冲下降沿变低,即脉冲下降沿 TR0=0;/停止计数停止计数 i=TH0;/读入读入TH0值值 a=i*256+TL0;/计数结果转换为计数结果转换为10进制进制 i=0;while(a!=0)/a不等于不等于0时循环,转换为时循环,转换为BCD码码 *P=a%10;/
40、个位存放在个位存放在40单元单元 vi=*P;i+;/转换结果存入转换结果存入V数组数组 a=a/10;P+;/为下一位的转换做准备为下一位的转换做准备 P0=v1*16+v0;/将转换结果送十位和个位送将转换结果送十位和个位送P0口口 P1=v3*16+v2;/将转换结果送千位和百位送将转换结果送千位和百位送P1口口 P2=v4;/将转换结果万位送将转换结果万位送P2口口 dowhile(1);设计一个波形展宽程序。设由设计一个波形展宽程序。设由P3.4P3.4输入一个低频窄脉冲信号输入一个低频窄脉冲信号,当当P3.4P3.4波形发生负跳变时,由波形发生负跳变时,由P3.0P3.0口输出一个
41、口输出一个500s500s宽的同步脉宽的同步脉冲。设冲。设 fosc=6MHzfosc=6MHz。例例6.36.3采用采用T0T0计数方式计数方式2 2,初值设为,初值设为0 xff0 xff。P3.4P3.4一旦发生负跳变一旦发生负跳变T0T0就会就会产生溢出。产生溢出。查询查询TF0TF0标志位,若标志位,若TF0=1TF0=1,将,将T0T0改变为改变为500s500s定时方式定时方式2 2,在,在fosc=6MHzfosc=6MHz时,则机器周期为时,则机器周期为2us,2us,所以定时器计数初值为所以定时器计数初值为250250。并。并使使P3.0P3.0输出低电平;待输出低电平;待
42、T0T0溢出后置溢出后置P3.0P3.0高电平,并使高电平,并使T0T0又工作于又工作于计数方式计数方式2 2。思路分析:思路分析:#include#include sbit P3_0=P30;sbit P3_0=P30;void main()void main()TMOD=0 x06;TMOD=0 x06;/设置为设置为T0T0计数方式计数方式2 2 TH0=256-250;TH0=256-250;/6MHz/6MHz晶振时晶振时500s500s相当于相当于250250个机器周期个机器周期 TL0=255;TL0=255;/初值初值0 xff0 xff可使可使1 1个外来脉冲即产生溢出个外来
43、脉冲即产生溢出 TR0=1;TR0=1;/启动计数器启动计数器 while(1)while(1)while(!TF0);while(!TF0);/等待首次溢出等待首次溢出 TF0=0;TF0=0;/清清TF0TF0溢出标志溢出标志 TMOD=0 x02;TMOD=0 x02;/设置为设置为T0T0定时方式定时方式2 2 P3_0=0;P3_0=0;while(!TF0);while(!TF0);/等待再次溢出等待再次溢出 TF0=0;TF0=0;/清清TF0TF0溢出标志溢出标志 P3_0=1;P3_0=1;TMOD=0 x06;TMOD=0 x06;/设置为设置为T0T0计数方式计数方式2
44、2 TL0=255;TL0=255;/重新置初值重新置初值 T0采用采用10MHz10MHz晶振,在晶振,在P1.0P1.0脚上输脚上输出周期为出周期为2.5s2.5s,占空比为,占空比为20%20%的脉冲信号。该例题电路图与的脉冲信号。该例题电路图与例例1 1电路图相同。电路图相同。10ms定时,晶振定时,晶振fosc=10MHz.定时器计数次数定时器计数次数=10*1000*10/12=8333 解解:10MHz晶振,实用定时器最晶振,实用定时器最 大定时为大定时为78.643ms。取取10ms定时,周期定时,周期2.5s,需需250次中断,占空比次中断,占空比20%,则高,则高电平应为电
45、平应为50次中断次中断例例6.6.4 4#include#define uchar unsigned char uchar time;uchar period=250;uchar high=50;/-定时器定时器0中断处理程序中断处理程序-timer0(void)interrupt 1 using 1 TH0=(65536-8333)/256;/重载计数初值重载计数初值 TL0=(65536-8333)%256;if(+time=high)P1=0;/高电平时间到变低高电平时间到变低 else if(time=period)/周期时间到变高周期时间到变高 time=0;P1=1;/-主函数主函
46、数-main()TMOD=0 x01;/定时器定时器0方式方式1 TH0=(65536-8333)/256;/重载计数初值重载计数初值 TL0=(65536-8333)%256;EA=1;ET0=1;TR0=1;do while(1);采用定时中断方式,实现下图跑马灯控制功能。要求跑采用定时中断方式,实现下图跑马灯控制功能。要求跑马灯的闪烁速率为每秒马灯的闪烁速率为每秒1 1次。次。例例6.5 6.5 定时器中断控制的跑马灯定时器中断控制的跑马灯利用定时器直接进行利用定时器直接进行1s1s延时是无法实现的,但可以利用硬延时是无法实现的,但可以利用硬件件/软件联合法(利用定时中断进行中断次数统计
47、),从软件联合法(利用定时中断进行中断次数统计),从而增加延时长度。而增加延时长度。例如,在例如,在12M12M晶振定时方式晶振定时方式1 1时,时,1s1s延时可以视为延时可以视为2020次中断,次中断,每次每次50ms50ms的累积延时。的累积延时。此时的计数初值为:此时的计数初值为:a=65536-50000 a=65536-50000 =15536=0 x3cb0 =15536=0 x3cb0分析:分析:/定时中断方式实现的跑马灯实例定时中断方式实现的跑马灯实例#define#define ucharuchar unsigned char unsigned char/定义一下方便后面使
48、用定义一下方便后面使用#include#include /包括一个包括一个5151标准内核的头文件标准内核的头文件bit ldelay=0;bit ldelay=0;/长定时溢出标记长定时溢出标记uchar t=0;uchar t=0;/定时溢出次数定时溢出次数/定时器定时器0 0中断函数中断函数timer0()interrupt 1 timer0()interrupt 1 t+;t+;if(t=20)if(t=20)t=0;t=0;ldelay=1;ldelay=1;/每次溢出置一个标记,以便主程序处理每次溢出置一个标记,以便主程序处理 TH0=0 x3c;TH0=0 x3c;/重置重置T0
49、T0初值初值0 x3cb00 x3cb0 TL0=0 xb0;TL0=0 xb0;void main(void)void main(void)uchar code ledp8=0 xfe,0 xfd,0 xfb,0 xf7,0 xef,0 xdf,0 xbf,0 x7f;uchar code ledp8=0 xfe,0 xfd,0 xfb,0 xf7,0 xef,0 xdf,0 xbf,0 x7f;uchar lediuchar ledi=0=0;/用来指示显示顺序用来指示显示顺序TMOD=0 x01;TMOD=0 x01;/定义定义T0T0定时方式定时方式1 1TH0=0 x3c;TH0=0
50、 x3c;/溢出溢出2020次次=1=1秒(秒(12M12M晶振晶振)TL0=0 xb0;TL0=0 xb0;TR0=1;TR0=1;/启动定时器启动定时器ET0=1;ET0=1;/打开定时器打开定时器0 0中断中断EA=1;EA=1;/打开总中断打开总中断while(1)while(1)/主程序循环主程序循环 if(ldelay)if(ldelay)/发现有时间溢出标记,进入处理发现有时间溢出标记,进入处理ldelay=0;ldelay=0;/清除标记清除标记P2=ledpledi;P2=ledpledi;/读出一个值送到读出一个值送到P2P2口口ledi+;ledi+;/指向下一个指向下一