LOGO任务三流水灯定时控制任课教师:李靖教学内容MCS-51的中断系统MCS-51的定时器/计数器教学目标掌握中断技术的应用掌握定时器/计数器的应用本任务本讲主要内容定时器/计数器的结构及工作原理1方式寄存器和控制寄存器2定时器/计数器的工作方式3定时器/计数器应用举例4★★★★控制系统中实现定时1、软件定时--延时函数2、硬件定时例如:5553、可编程定时器例如:8253DS1302MCS-51子系列:T0、T1MCS-52子系列:T0、T1、T2可实现定时、计数功能,有利于实时控制不占用CPU时间定时精度高,修改方便AT89S系列有看门狗计数器(WatchDogTimer)一种计数装置计数内部的时钟脉冲--定时器计数外部的脉冲--计数器在应用时可采用中断方式,也可采用查询方式8051的定时器/计数器(timer/counter)一、定时/计数器的结构及工作原理1、定时/计数器的结构微处理器TH1TL1TH0TL0TCONTMOD工作方式工作方式T1T0P3.5(T1)P3.4(T0)结构组成部分两个16位的二进制定时/计数器T0、T1T0/T1分别由两个8位的计数器组成,均属SFR寄存器T0由TH0、TL0构成,字节地址为8CH、8AHT1由TH1、TL1构成,字节地址为8DH、8BH相关的控制寄存器方式寄存器TMOD控制寄存器TCON2、定时/计数器的工作原理定时功能对片内机器周期进行计数,即每个机器周期产生一个计数脉冲,计数加1。实时控制、实时采样、定时控制等计数功能对片外从T0(P3.4)、T1(P3.5)引脚输入的外部脉冲信号进行计数,下降沿计数加1。计数频率为晶振频率的1/24生产线上产品计数、检测电机转速等功能振荡器÷12加1计数器TFx申请中断TX端C/T=0C/T=1控制信号TRx定时/计数器初值预置初值X的计算方法设定时器/计数器最大值为M,计数值为N,初值为X,晶振频率fosc,则计数器初始值:X=M-N定时器初始值:X=M-定时时间/Tcy问1:要求检测到100个脉冲,发中断请求,如何设置初值?问2:定时器/计数器为8位加1计数器,要求每隔0.1ms,发一次中断请求(机器周期1us),如何设置初值?定时功能,初值156计数功能,初值156二、方式寄存器和控制寄存器1、方式控制寄存器TMODSFR寄存器,地址89H设定T0、T1的工作方式只能字节寻址GATEM1M0GATEM1M0T/CTimer1Timer0T/C定时/计数模式选择位功能选择位门控位定时器工作方式选择M1和M0工作方式选择位M1M0方式说明00013位计数器(TH的高8位和TL的低5位)01116位计数器102自动重装入初值的8位计数器113定时器0:分成两个独立的8位计数器定时器1:停止计数功能选择位和门控位C/定时/计数功能选择位为“0”,定时器为“1”,计数器GATE:门控位,定义T1/T0的启动方式为0,非门控方式(内部启动):TR0/1=1,启动定时器工作TR0/1=0,停止定时器工作为1,门控方式(外部启动)TR0/1=1且引脚INT0/1=1才启动T2、状态控制寄存器TCONSFR寄存器,地址88H即参与定时控制又参与中断控制与定时控制相关的有4位TF1TR1TF0TR0IE1IT1IE0IT0TF1/TF0:当T1/T0计数溢出时,该位置1TR1/TR0:T1/T0运行控制位。置1:启动T1/T0二、方式寄存器和控制寄存器1、工作方式0M1M0=?作定时器:TMOD=?作计数器:TMOD=?三、定时器/计数器工作方式00000000=0x0000000100=0x0413位计数器TH:8位TL:低5位,高3位不用00方式0的工作原理定时器/计数器初始化编程定时器/计数器有两种应用方式:1.设定工作方式(对TMOD写工作方式控制字)2.装入初值(TH0/TL0或TH1/TL1)3.启动定时器/计数器(置位TR0/TR1)4.中断设定(置位ET0/ET1、EA、IP)5.中断服务函数1.-3.同中断方式的1-34.判断定时器/计数器的标志位TF1/TF0为1或0,以决定程序流程中断方式查询方式方式0的应用计数初值最大计数值为213=8192定时时间:△T=(213-T0的初值)×Tcy计数个数:△C=213-T0的初值方式0使用范例1解:1)TMOD初始化2)计数初值3)启动4)中断?查询例1:已知单片机晶振频率6MHz,利用T0的方式0在P1.0引脚输出周期为500us的方波计数初值=213-欲计数脉冲数=213-△T/Tcy=213-250/2=1F83H∴TH1=0xfc,TL1=0x03中断方式程序清单#includereg52.hsbitP10=P1^0;voidmain(){TMOD=0;TH0=0xfc;TL0=0X03;TR0=1;EA=1;ET0=1;while(1){}}voiditr_timer0(void)interrupt1{P10=~P10;TH0=0xfc;TL0=0x03;}采用查询方式如何编程?方式0使用范例2例2:单片机晶振频率12MHz,利用T1的方式0实现1s延时,每隔1s时间P1.0引脚翻转一次#includereg52.hsbitP10=P1^0;unsignedintc=200;voidmain(){TMOD=0;TH1=0x63;TL1=0X18;TR1=1;EA=1;ET1=1;while(1){}}voiditr_timer1(void)interrupt3{c--;if(!c){c=200;P10=!P10;}TH1=0x63;TL1=0x18;}2、工作方式1M1M0=?作定时器:TMOD=?作计数器:TMOD=?三、定时器/计数器工作方式00000001=0x0100000101=0x0516位计数器TH:8位TL:8位0116位计数器,逻辑结构框图如下:振荡器÷12TF0中断T0C/T=0C/T=1GATEINT0端TR0TH0(8位)TL0(8位)控制l&≥l&EAET0&2、工作方式1三、定时器/计数器工作方式方式1使用范例例1:已知单片机晶振频率6MHz,利用T0的方式1在P1.0引脚输出周期为500us的方波例2:单片机晶振频率12MHz,利用T1的方式1实现1s延时,每隔1s时间P1.0引脚翻转一次3、工作方式2M1M0=?作定时器:TMOD=?作计数器:TMOD=?三、定时器/计数器工作方式00000010=0x0200000110=0x06自动重装载的8位计数器101/12T0INT0GATETR01fosc≥1&TF0TL0&&TH0溢出T0中断问题:从图中可以看出来哪个寄存器是计数寄存器,哪个寄存器始终存放的是计数初值?方式2使用范例某啤酒自动生产线,需要每生产12瓶执行装箱操作,将生产出的啤酒自动装箱,用单片机实现该控制要求。分析:如果啤酒生产线上装有传感装置,每检测一瓶啤酒就向单片机发送一个脉冲信号,使用计数功能就可实现该控制要求。选定用T1方式2使用范例某啤酒自动生产线,需要每生产12瓶执行装箱操作,将生产出的啤酒自动装箱,用单片机实现该控制要求。1)TMOD初始化2)计数初值3)启动4)中断初始化设置5)中断服务函数TMOD=0x60;TH1=TL1=0xf4;TR1=1;EA=1;ET1=1;voidisr_time1(void)interrupt3{……}源程序见下页方式2使用范例#includereg52.hsbitp37=P3^7;voidmain(){TMOD=0x60;TH1=0xf4;TL1=0Xf4;TR1=1;EA=1;ET1=1;P37=1;while(1);}//驱动电机转动的程序voidisr_timer1(void)interrupt3{inti,time=600;P37=0;//驱动电机转动while(time--)//假设装箱时间固定for(i=500;i0;i--);P37=1;//装箱结束电机停止转动}4、工作方式3--只有T0有此工作方式M1M0=?作定时器:TMOD=?作计数器:TMOD=?三、定时器/计数器工作方式00000011=0x0300000111=0x07T0为2个8位计数器:TH0,TL0T1停止计数,等价于执行了TR1=0;11T0和T1的设置和使用不同4.工作方式3振荡器÷12TF1T1中断TH0(8位)TR1控制T0端C/T=0C/T=1GATEINT0端TR0振荡器÷12TF0T0中断TL0(8位)控制l≥l&&&EAET0仅作定时器用!T0两个8位的计数器TL0:使用T0原有控制资源(C/T、GATE、TR0、TF0、P3.4脚、INT0脚,功能与方式0/1相同TH0:占用T1的TR1、TF1及T1的中断,只能对片内机器周期脉冲计数,作8位定时器T0初值计算同方式2TL01/12INT0GATETR0T0fosc1≥1&&TF0&溢出T0中断TF1fosc1/12TR1TH0T1中断4、工作方式3T0工作方式3时T1的工作:T0方式3时,T1仍然可工作于方式0~2,C/控制位仍可使T1工作在定时器或计数器方式,只是由于其TR1、TF1被T0的TH0占用,因而没有计数溢出标志可供使用,计数溢出时只能将输出结果送至串行口,即用作串行口波特率发生器。T0工作在方式3时,T1可工作于方式2,因定时初值能自动恢复,用作波特率发生器更为合适。若要停止T1,只需送一个设其为方式3的方式字。T4、工作方式3方式3使用范例例:已知系统晶振12MHz,试用定时器0的方式3实现1s的延时TMOD初始化设置初值TH0作为定时器,定时时间250us;初值28-250=06HTL0作为计数器,计数200次;初值28-200=38H引进变量使TL0计数满后该变量加1,直至20则为1s#includereg51.hsbitP00=P0^0;sbitP34=P3^4;unsignedcharcount;voiddelay();main(){TMOD=7;TH0=0x06;TL0=0x38;TR0=1;TR1=1;while(1){P00=~P00;delay();}}voiddelay(){count=0;while(count20){while(TF0==0){while(TF1==0);P34=0;TH0=6;TF1=0;P34=1;}TL0=0x38;TF0=0;count++;}}案例6以定时方式控制简单流水灯已知系统晶振6MHz,采用定时器T0的工作方式1实现延时,控制P0口的8只发光二极管以100ms的间隔循环点亮。定时器/计数器控制流水灯定时器T0初值:定时时间:tmax=65536×2μs=131.072,取100msT0的初值:=216-100000μs/2μs=15536=3CB0HTMOD=00000001B=01H#includereg51.h#includeintrins.hvoidisr_time0(void);unsignedcharcword=0x01;voidmain(){TMOD=1;TH0=-500008;TL0=-50000;TR0=1;EA=1;ET0=1;P0=cword;while(1);}voidisr_time0()interrupt1{TH0=-500008;TL0=-50000;cword=_crol_(cword,1);P0=cword;}单片机控制流水灯要求:8只发光二极管以1s间隔循环点亮。已知:系统晶振为6MHz。分析:TCY=?工作方式0、1、2、3下定时时间最多为多少?能不能先定时一个较小的时间,再循环适当的次数,从而实现1s延时?单片机控制流水灯voidisr_time0()interrupt1{TH0=0x3c;TL0=0xb0;count--;if(count==0){out