定时/计数器的控制关系(以T1为例)门控位GATE=0-允许TR1启动计数器GATE=1-允许INT1启动计数器启动控制位TR1=1-启动计数器TR1=0-停止计数器外部中断1参与定时器的启停管理中断请求标志位TF1=1-请求TR1=0-复位T1第6章单片机的定时器/计数器TCTC模式选择位=0-定时=1-计数GATEC/TM1M0GATEC/TM1M0D7D5D4D3D2D1D0TMODD6(89H)T1T0/CT/CTT1方式选择位00-方式001-方式110-方式2T1工作状态T1T0TF0TR0T0脚INT0T0方式选择位00-方式001-方式110-方式211-方式3T0工作状态第6章单片机的定时器/计数器GATEC/TM1M0GATEC/TM1M0D7D5D4D3D2D1D0TMODD6(89H)T1T0/CT/CT注意:TMOD只能以字节方式进行初始化例如,设置T0为定时器方式1,允许TR0启动;T1为计数器方式0,允许INT1启动。则TMOD=11000001B=0xc1又如,系统上电默认值为TMOD=0,则默认状态应为:T0和TI均为定时器方式0,允许TR0、TR1启动。第6章单片机的定时器/计数器第6章单片机的定时器/计数器M1M0工作方式功能说明00110101012313位定时/计数器16位定时/计数器8位自动重装定时/计数器3种定时/计数器关系T0工作方式注意:T0有4种工作方式,每种工作方式都有定时和计数2种方式。T1只有3种工作方式(T0的方式3中占用了T1的部分资源)。M1M0工作方式功能说明00101001213位定时/计数器16位定时/计数器8位自动重装定时/计数器T1工作方式学习顺序:方式1→方式2→方式0→方式3(1)方式1定时时间:t=(216-a)×12/fosc(s)——使用16位定时/计数器(THx+TLx)(M0M1为01组合时)第6章单片机的定时器/计数器定时范围为1~65,536μs(≈65ms)。最大定时时间(a=0,fosc=12MHz):t=216(s)=65536(s)定时方式实例1设单片机的fosc=12MHz,采用T0定时方式1在P1.0脚上输出周期为2ms的方波。第6章单片机的定时器/计数器分析:周期为2ms的方波由2个半周期为1ms的正负脉冲组成1ms定时的计数初值应为:a=216–t*fos/12=216–1000*12/12=64536=0xfc18TH0=0xfcTL0=0x18例1(1)查询方式#includereg51.hsbitP1_0=P1^0;main(){TMOD=0x01;//设置T0定时方式1(00000001B)TR0=1;//启动T0for(;;){TH0=0xfc;//装载计数初值TL0=0x18;do{}while(!TF0);//等待TF0溢出P1_0=!P1_0;//定时时间到P1.0反相TF0=0;//TF0标志清0}}T0第6章单片机的定时器/计数器(2)中断方式#includereg51.hsbitP1_0=P1^0;timer0()interrupt1{//T0中断函数P1_0=!P1_0;//P1.0取反TH0=0xfc;//装载计数初值TL0=0x18;}main(){TMOD=0x01;//T0定时方式1TH0=0xfc;//装载计数初值TL0=0x18;EA=1;//开总中断ET0=1;//开T0中断TR0=1;//启动T0while(1);}注意:中断响应后系统可自动将TFx标志位清0第6章单片机的定时器/计数器采用8位计数器,延时时间t=(28-a)×12/fosc(微秒)→12MHz时的最大定时量为256s;可自动重装载计数初值(TLx溢出后,THx数值可自动装入TLx);因没有装载计数初值造成的定时延误,方式2定时精度相对较高。(2)方式2第6章单片机的定时器/计数器(3)工作方式0使用13位的定时/计数器(THi7-0+TLi4-0)定时时间t=(213-a)×12/fosc(μs)计数初值a=213-t×fosc/1212MHz时的最大定时量t=213μs=8.192ms第6章单片机的定时器/计数器(1)查询方式#includereg51.hsbitP1_0=P1^0;main(){TMOD=0x02;TH0=TL0=0x06;TR0=1;for(;;){do{}while(!TF0);P1_0=!P1_0;TF0=0;}}(2)中断方式#includereg51.hsbitP1_0=P1^0;timer0()interrupt1{P1_0=!P1_0;}main(){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第6章单片机的定时器/计数器实例3将第4章实例5“计数显示器”中的软件查询法进行按键检测改用T0计数器方式2,并以中断方式编程。计数初值为:a=28–1=255=0xff初始化TMOD=00000110B=0x06实例5由P3.4口输入一个外部低频窄脉冲信号。当该信号出现负跳变时,由P3.0口输出宽度为500μs的同步脉冲,如此往复。要求据此设计一个波形展宽程序(fosc=6MHz)。实例6采用10MHz晶振,在P1.0脚上输出周期为2.5s,高电平占空比为20%的脉冲信号。分析:10兆晶振,方式1最大定时为54.613ms;•可以采用定时中断与软件计数联合法:利用定时中断进行中断次数统计;•若取10ms产生定时,则2.5s=250次中断之和;•则500ms(20%占空比)相当于50次中断之和。a=216-10000×12/10=0xd1202.5s0.5s第6章单片机的定时器/计数器实例6参考程序第6章单片机的定时器/计数器实例7采用定时中断控制流水灯,实现每秒1位,自上而下循环功能(fosc=12MHz)。分析:可以利用20次50ms的定时中断方案,计数初值为:a=65536-50000×12/12=0x3cb0第6章单片机的定时器/计数器中断函数的任务过多,不利于实时控制。如何减少中断函数任务?新方案:中断函数中仅做中断次数统计和计数初值重入,控制操作改在主函数中进行。实例6的问题:实例8测量从P3.2(INT0)输入的正脉冲的宽度,测量结果以BCD码形式存放在片内RAM40H开始的单元处(设40H地址存放个位,系统时钟为12MHz,被测脉冲信号周期不超过100ms)。0第6章单片机的定时器/计数器分析:GATE=TR0=1时允许INT0的脉冲控制定时器的启停,则根据T0先启动、再关闭后的计数值可算出被测脉冲宽度。INT0端信号T0中的脉冲数实例8参考程序第6章单片机的定时器/计数器INT0端信号T0中的脉冲数0