单片机原理与接口技术电子教案第章成都大学工业制造学院程跃6AT89S51单片机的定时器/计数器2思考:单片机系统实现定时功能的方法?软件定时:软件定时不占用硬件资源,但占用了CPU时间,降低了CPU的利用率。采用时基电路定时:例如采用555电路,外接必要的元器件(电阻和电容),即可构成硬件定时电路。但在硬件连接好以后,定时值与定时范围不能由软件进行控制和修改,即不可编程。3思考:单片机系统实现定时功能的方法?采用可编程芯片定时:这种定时芯片的定时值及定时范围很容易用软件来确定和修改,此种芯片定时功能强,使用灵活。在单片机的定时/计数器不够用时,可以考虑进行扩展。单片机内部定时/计数器4本章主要内容:6-1.定时器概述6-2.定时器的控制6-3.定时器的4种模式及其应用6-4.定时器/计数器综合应用举例56.1定时器概述AT89S51单片机有2个16位的可编程定时器/计数器,称为定时器/计数器0和定时器/计数器1,分别由两个8位的特殊功能寄存器TH0、TL0和TH1、TL1组成。6用于定时控制、延时、外部事件计数和检测等场合。每个定时器可由软件设置为定时工作方式或技术工作方式及其它灵活的可控功能方式,这些功能由TMOD和TCON所控制。定时器的实质——16位加1计数器7定时器/计数器的结构和工作原理定时器/计数器的结构定时器/计数器的实质是加1计数器(16位),由高8位和低8位两个寄存器组成。TMOD是定时器/计数器的工作方式寄存器,确定工作方式和功能;TCON是控制寄存器,控制T0、T1的启动和停止及设置溢出标志。GATEC/TM1M0GATEC/TM1M0TH1TL1TH0TL0T1方式T0方式T1引脚T0引脚机器周期脉冲内部总线TMODTCON外部中断相关位TF1TR1TF0TR0T1计数器T0计数器控制单元8计数器工作原理计数功能所谓计数是指对外部事件进行计数。外部事件的发生以输入脉冲表示,因此计数功能的实质就是对外来脉冲的计数。AT89S51芯片的信号引脚T0(P3.4)和T1(P3.5)分别是两个计数器的计数输入端。外部输入的脉冲在负跳变时有效,供计数器进行加1计数。9计数器工作原理计数器输入的计数脉冲源系统的时钟占当期输出脉冲经12分频后产生,通过T0或T1引脚对外部脉冲信号计数。计数过程每来一个脉冲计数器加1,当加到计数器为全1(即FFFFH)时,再输入一个脉冲就使计数器回零,且计数器的溢出使TCON中TF0或TF1置1,向CPU发出中断请求(定时器/计数器中断允许时)。如果定时器/计数器工作于定时模式,则表示定时时间已到;如果工作于计数模式,则表示计数值已满。10计数器工作原理计数方式下,单片机在每个机器周期的S5P2对计数脉冲输入引脚进行采样。如果前一个机器周期为高电平,后一个机器周期为低电平,即为一个有效的计数脉冲,在下一个机器周期的S3P1进行计数。由于采样计数脉冲是在2个机器周期完成的,所以计数脉冲的周期不能小于2个机器周期。11定时器工作原理定时功能定时功能是通过对单片机内部脉冲进行计数来实现的。即每个机器周期产生1个计数脉冲,使计数器加1。在使用定时器时,既可以根据计数值计算定时时间,也可以根据定时时间的要求计算出计数器的预置值。12定时与计数都是利用计数实现!!加法计数器是计满溢出时才申请中断,所以在给计数器赋初值时,不能直接输入所需的计数值,而应输入的是计数器计数的最大值与这一计数值的差值。设最大值为M,计数值为N,初值为X,则X的计算方法为:计数状态:X=M-N定时状态:X=M-(定时时间∕机器周期)1362.1工作模式寄存器寄存器:TMOD字节地址:89H(不可位寻址)位序D7D6D5D4D3D2D1D0位符号GATEC/TM1M0GATEC/TM1M0定时器/计数器1定时器/计数器0功能:用于设定定时器/计数器的工作方式(只能用字节传送指令设置其内容)TMOD的低半字节对应定时器/计数器0,高半字节对应定时器/计数器1,前后半字节的位格式完全对应。6.2定时器的控制14M1M0工作方式说明00013位定时器/计数器(TH的8位和TL的低5位)01116位定时器/计数器102自动重新装入初值的8位定时器/计数器113T0分成两个独立的8位计数器,T1停止工作M1和M0:工作方式选择位15C/T:定时方式或计数方式选择位C/T=0定时工作方式C/T=1计数工作方式GATE:GATE=0以运行控制位(TR0或TR1)启动定时器GATE=1以外部中断请求信号(INT0或INT1)启动定时器16位地址8FH8EH8DH8CH8BH8AH89H88H位符号TF1TR1TF0TR0IE1IT1IE0IT06.2.2定时器/计数器控制寄存器:TCON字节地址:88H位地址:88H~8FH(可位寻址)功能:用于保存外部中断请求以及定时器的计数溢出。TCON既有定时器/计数器的控制功能,又有中断控制功能,其中与定时有关的控制位共4位:TF1、TR1、TF0、TR0。17TF0和TF1:计数溢出标志位当计数器产生计数溢出时,相应的溢出标志位由硬件置“1”。计数溢出标志位的使用有两种情况:•使用中断方式时,作中断请求标志位来使用,在转向中断服务程序时由硬件自动清“0”。•使用查询方式时,作查询状态位来使用,查询有效后应以软件方法及时将该位清“0”位地址8FH8EH8DH8CH8BH8AH89H88H位符号TF1TR1TF0TR0IE1IT1IE0IT018TR0和TR1:运行控制位(软件置1或清0)TR0(TR1)=0停止定时器/计数器工作TR0(TR1)=1启动定时器/计数器工作位地址8FH8EH8DH8CH8BH8AH89H88H位符号TF1TR1TF0TR0IE1IT1IE0IT019中断允许控制寄存器:IE字节地址:0A8H位地址:0A8H~0AFH其中与定时器/计数器有关的控制位共3位:EA:中断允许总控制位ET0和ET1:定时器/计数器中断允许控制位ET0(ET1)=0禁止定时器/计数器中断ET0(ET1)=1允许定时器/计数器中断位地址0AFH0AEH0ADH0ACH0ABH0AAH0A9H0A8H位符号EA——ESET1EX1ET0EX0206.3定时器的4种模式及应用计数器工作方式选择M1M0工作方式功能说明00方式013位计数器01方式116位计数器10方式2自动重装8位计数器11方式3定时器0:分成两个8位定时器1:停止计数建议不采用该工作方式!在精确定时采用该工作方式!21模式0模式0为13位计数,由TL0的低5位(高3位未用)和TH0的8位组成TL0的低5位溢出时向TH0进位,TH0溢出时,置位TCON中的TF0标志,向CPU发出中断请求。TF1TR1TF0TR0GATEC/TM1M0GATEC/TM1M01&≥110T0引脚INT0引脚00机器周期TH0TL08位5位溢出TCONTMODD0D7D7D0申请中断113位计数器计数/定时选择中断请求该方式计算不方便,建议不采用!22TF1TR1TF0TR0GATEC/TM1M0GATEC/TM1M01&≥110T0引脚INT0引脚10机器周期TH0TL08位8位溢出TCONTMODD0D7D7D0申请中断TF1TR1TF0TR0GATEC/TM1M0GATEC/TM1M01&≥110T0引脚INT0引脚10机器周期TH0TL08位8位溢出TCONTMODD0D7D7D0申请中断6.3.1模式1及应用模式1的计数位数是16位,由TL0(TL1)作为低8位、TH0(TH1)作为高8位,组成了16位加1计数器。16位计数器23例6-1用定时器T1产生一个50Hz的方波,由P1.1输出。方波周期为T=1/50=0.02s=20ms,用T1定时10ms,单片机采用12MHZ晶振,一个机器周期是1us,即是计数器计数10000次。TH1=(65536-10000)/256;TL1=(65536-10000)%256;注意定时器的初值计算方法!24用查询方式编程voidmain(){TMOD=0x10;//T1模式1,定时TR1=1;//定时器开始计数while(1){TH1=(65536-10000)/256;TL1=(65536-10000)%256;//装入计数初值while(TF1!=1);TF1=0;//清除T1溢出标志位P1_1=~P1_1;}}25用中断方式编程初始化程序应该完成以下工作:1.对TMOD赋值,以确定T0和T1的工作方式。2.计算初值,并将其写入TH0、TL0或TH1、TL1。3.中断方式时,则对IE赋值,开放中断。4.使TR0或TR1置位,启动定时计数器。26程序流程:开始P1.1置1T1模式设置T1初值设置(10ms)中断设置开中断循环等待中断启动定时器T1中断入口T1初值设置(10ms)中断返回P1.1取反主程序流程中断服务子程序流程27程序(主程序)#includereg52.h#defineucharunsignedchar#defineuintunsignedintsbitP1_1=P1^1;voidmain(){TMOD=0x10;//T1模式1,16位计数器TH1=(65536-10000)/256;TL1=(65536-10000)%256;//装入计数初值EA=1;//开总中断ET1=1;//开定时器1中断TR1=1;//定时器开始计数while(1);}28程序(定时器1中断服务程序)voidtimer1_int(void)interrupt3{TH0=(65536-10000)/256;TL0=(65536-10000)%256;//重新装入计数初值P1_1=~P1_1;}29例题6-2用单片机和内部定时器来产生矩形波,要求频率为100Hz,占空比为0.25,设单片机的时钟频率为12MHz。占空比:在一串理想的脉冲周期序列中,正脉冲的持续时间与脉冲总周期的比值。305.3.2模式2及其应用模式2为自动重装初值的8位计数方式。在模式2下,当计数器计满255(FFH)溢出时,CPU自动把TH的值装入TL中,不需用户干预。因此特别适合于用作较精确的脉冲信号发生器。TF1TR1TF0TR0GATEC/TM1M0GATEC/TM1M01&≥110T0引脚INT0引脚10机器周期TH0TL08位溢出TCONTMODD0D7D7D0申请中断8位计数器TH1重装单元31二、模式2工作特点可以自动重新装载的8位定时器/计数器。在程序初始化时,TL0和TH0由软件赋予相同的初值。用于定时工作方式时,定时时间为:t=(28-TH0初值)×振荡周期×12用于计数工作方式时,计数长度最大为:28=256个脉冲该模式可省去软件中重装常数的语句,并可产生相当精确的定时时间,适合于作串行口波特率发生器。32例6-3当P3.4引脚上的电平发生负跳变时,从P1.0输出一个500us的同步脉冲,请编程实现该功能。●方法1(只用T0)按照查询方式编程(请同学们自行编写)。选择T0为模式2电平发生负跳变采用外部计数方式。当P3.4引脚上发生负跳变时,T0计数器加1,溢出标志TF0置1,然后改变T0为500us定时方式,并使P1.0同步输入一个500us脉冲。同步脉冲输出后T0又恢复外部事件计数方式。33方法2:计数用T0,采用查询方式,定时用T1中断,均采用模式2。T0工作在外部事件计数方式,当计数达到0FFH时候,再加1计数器就会溢出。T1工作在定时工作方式,设晶振频率为6MHz,500μs相当于250个机器周期。因此,初值X为(256-X)×2μs=500μsX=6=06H34电路用脉冲信号源模拟外部事件,用示波器对照显示P3.4口的输入和P1.0口的输出,方波信号源的周期必须大于1000us即频率小于1000HZ,这里我们为了清楚在示波器上进行对比,方波信号源发生频率为500HZ。XTAL218XTAL119ALE