资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,第5章 单片机的定时器/计数器,(学生事先必须预习,本章是一个,难点、重点,),5.1 计数概念的引入,5.2 定时器/计数器的工作原理,5.3 和定时器/计数器有关的6个寄存器,5.4 定时器的四种工作方式,5.5 定时计数器的初始化编程(熟练掌握),5.6 门控位GATE的应用,1,5.1 计数概念的引入,生活中,计数的例子,处处可见.例:录音机上的计数器、家里面用的电度表、汽车上的里程表等等.再举一个工业生产中的例子,线缆行业在电线生产出来之后要计米,也就是测量长度,怎么测法呢?用尺量?不现实,太长不说,要一边做一边量呢,怎么办呢?行业中有很巧妙的方法,用一个周长是1米的轮子,将电缆绕在上面一周,由线带轮转,这样轮转一周不就是线长1米嘛,所以只要记下轮转了多少圈,就可以知道走过的线有多长.,从一个生活中的例子看起:一个水盆在水龙头下,水龙头没关紧,水一滴滴地滴入盆中.水滴不断落下,盆的容量是有限的,过一段时间之后,水就会逐渐变满.,录音机上的计数器最多只计到999.那么单片机中的计数器有多大的容量呢?,8051单片机中有两个计数器,分别称之为Timer0和Timer1,这两个计数器分别是由,两个8位的RAM单元(TH*/TL*),组成的,即每个计数器都是,16位,的计数器,最大的计数量是65536(记忆!FFFFH+1),.,2,计数与定时的内在统一,8051中的计数器除了可以作为,计数,之用外,还可以用作,时钟,时钟的用途当然很大,如打铃器,电视机定时关机,空调定时开关等等,那么,计数器是如何作为定时器来用的呢?,时钟的秒针,走一圈需要走60次,耗费的时间是60s,所以,时间,就转化为秒针走的,次数,了,可见,计数的次数和时间之间的确十分相关,.那么它们的关系是什么呢?那就是,秒针每,1次,走动的时间正好是,1秒,.,因此只要计数脉冲的间隔相等,则,计数,值就代表了,时间,的流逝.,3,(1)用于计数方式时最大计数值为213=8192个脉冲,MOV TL1,#0B0H;定时100ms,分析:已知fosc=6MHz 则:,门控位GATE为1时,TRx=1,INTx*=1才能启动定时器.,外部输入的计数脉冲的最高频率为系统振荡器频率的1/24,例如选用12MHz频率的晶体,则可输入500kHz的外部脉冲.,例1:若晶振频率为6MHz,计算单片机在定时器方式1的条件下的最小与最大定时时间:,JB P3.,SETB TR0 ;启动定时计数器,分析:已知fosc=6MHz 则:,分析:fosc=6MHz,1Tm=2us,T=2s,半个方波周期=1s=1000ms,5(T1)引脚上的外部输入脉冲,当引脚上发生负跳变时,计数器加1.,ORG 0000H,MOV R7,#10;中断10次计数,GATE C/T*M1 M0 GATE C/T*M1 M0,例8:利用T0门控位测试INT0*引脚上出现的正脉冲宽度,已知晶振频率为12MHz,将所测得值最高位存入片内71H单元,低位存入70H单元.,溢出,让我们再来看,水滴的例子,当水不断落下,盆中的水不断变满,最终有一滴水使得盆中的水满了,.这时如果再有一滴水落下,就会发生什么现象?水会漫出来,用个术语来讲就是,“溢出 overflow”,.,水溢出是流到地上,而,计数器溢出后,将使得,TF0变为“1”,.一旦,TF0由0变成1,就是发生了变化,产生了变化就会引发事件,就象定时的时间一到,闹钟就会响一样.引发的事件,就是系统需要响应定时/计数中断服务程序了,现在我们来研究另一个问题:,要有多少个计数脉冲才会使TF0由0变为1.,4,任意,定时及计数,的方法,刚才已研究过,计数器的容量是,16位,也就是最大的计数值到65536,因此计数计到65536就会产生溢出.问题是在现实生活中,经常会有少于,65536,个计数值的要求,如包装线上,一打为,12,瓶,一瓶药片为,100,粒,怎么样来满足这个要求呢?,提示:如果是一个空的盆要,10000滴水滴进去才会满,我在开始滴水之前就,先放入一勺水,还需要10000滴嘛?,我们采用,预置数,的方法,要计数100次,那就先放进65,4,36,再来100个脉冲,不就到了65536了吗.,定时也是如此,假设,每个脉冲是1us,则计满65536个脉冲需时.如果现在只要,10ms,定时怎么办?10个ms为10,000个us,所以,只要在计数器里面放进,65536-10000=55536,就可以了.,5,两个,十六位定时/计数器:,定时器0(Timer0)和定时器1(Timer1),Note:,随着单片机型号的不同,内部定时器的,个数会不一样,定时或事件计数,的功能,可用于,(1),内部,定时控制;(2)对,外部,事件计数和检测,等场合,实质,是,加1,计数器,.,T0,由2个8位SFR,TH0和TL0,构成,T1,由2个8位SFR,TH1和TL1,构成.,5.2 定时器/计数器的,工作原理,6,软件设置,为,定时工作方式(C/T*=0),或,计数工作方式(C/T*=1)(MOV TMOD,#*H),TMOD和TCON控制,.,一旦启动,便可以和CPU,并行,工作,对提高CPU工作效率和简化外围电路大有益处.,7,7.,定时,工作方式,(1)设置为定时工作方式时,定时器,计数的脉冲,是由,51单片机片内振荡器经,12分频,后产生的.,(2),每经过,一个机器周期,定时器(T0或T1)的,数值加1,直至计数满产生溢出.(记忆!),如:当8051采用,12MHz,/,6MHz/,11.0592MHz(12/*),晶体时,每个机器周期为,1us,/,us,计数值,加1,耗费一个机器周期,相当于消耗了,1us,8,复习:,(1),振荡周期,Tc(Clock):,也称,时钟周期,是指为单片机提供时钟脉冲信号的振荡源的周期.(晶振频率的倒数),(2),状态周期,Ts(Status):,每个状态周期为时钟周期的2倍,是振荡周期经二分频后得到的.(用的少),(3),机器周期,Tm(Machine):,一个机器周期包含6个状态周期S1-S6,也就是,12个时钟周期,.在一个机器周期内,CPU可以完成一个独立的操作.(,12MHz1us 6MHz2us 记忆),(4),指令周期Ti:,它是指CPU完成一条操作所需的全部时间.每条指令执行时间都是有,一个或几个机器周期,组成.MCS51系统中,有单周期指令、双周期指令和四周期指令.,10,8.,计数,工作方式,(1)设置为计数工作方式时,通过,引脚T0(P3.4)和T1(P3.5)对外部脉冲信号计数,.,(2)当输入脉冲信号产生,由1至0的下降沿,时,定时器的值加1,在每个机器周期,CPU采样引脚T0和T1的输入电平.,若前一个机器周期采样值为,高,下一个机器周期采样值为,低,则计数器加1.,(3)由于检测一个1至0的跳变需要二个机器周期,故最高计数频率为振荡频率的,二十四分之一,.,(4)虽然对输入信号的占空比无特殊要求,但为了确保某个电平在变化之前至少被采样一次,要求电平保持时间至少是一个完整的机器周期.,11,5.3 和定时器/计数器有关的6个,寄存器,12,1-4.,TH0,(Timer High),定时器/计数器0,高,字节(8Ch),TL0,(Timer Low),定时器/计数器0,低,字节(8Ah),TH1,定时器/计数器1 高字节(8Dh),TL1,定时器/计数器1 低字节(8Bh),13,TF1/TF0,:,T,imer 1/0 over,F,low flag,.,定时器溢出中断申请标志位,Set by hardware,when the Timer/Counter 1/0,overflows,.,Cleared by hardware,as processor vectors,to the interrupt service routine.,=0 定时器未溢出;,=1 定时器溢出申请中断,进中断后自动清零.,5.,TCON,:定时器/计数器,控制,寄存器,用于T/C的管理与控制,TIMER/COUNTER CONTROL REGISTER.BIT DDRESSABLE(88h),按bit记忆,TR/TF/IE/IT(Run/overFlow/Edge/Type)高四位被定时器使用,低四位被外部中断使用,TF1,TR1,TF0,TR0,IE1,IT1,IE0,IT0,T1,请求,有/无,T1,工作,启/停,T0,请求,有/无,T0,工作,启/停,INT1,请求,有/无,INT1,方式,下沿/低电平,INT0,请求,有/无,INT0,方式,下沿/低电平,14,TR1/TR0,:T1/T0运行控制位,T,imer 1/0,R,un control bit,note:,Set/cleared,by,software,to turn Timer/Counter 1/0,ON/OFF,TR1/0=1,启动,T0计数,(SETB TR0),TR1/0=0,停止,T0计数,(CLR TR0),TF1,TR1,TF0,TR0,IE1,IT1,IE0,IT0,T1,请求,有/无,T1,工作,启/停,T0,请求,有/无,T0,工作,启/停,INT1,请求,有/无,INT1,方式,下沿/低电平,INT0,请求,有/无,INT0,方式,下沿/低电平,15,定时器T0/T1,中断申请过程,:,定时/计数器可,按,片内,机器周期定时,也,可对由,T0/T1引脚,外部输入一个负脉冲,进行加法计数,在已经开放T0/T1中断允许(,SETB ET0/SETB EA,)且已被启动(,SETB TR0,)的前提下,T0/T1加满溢出时,TF0/TF1标志位,自动置“1”,检测到TCON中TF0/TF1变“1”后,将自动产生指令:,LCALL 000BH/LCALL 001BH,执行中断服务程序,TF0/TF1标志位,会,自动清“0”,以备下次中断申请.,16,6.TMOD 定时器方式寄存器,T,imer/Counter,Mod,e control register.Not bit addressable(89H)只能按字节操作,用于控制T0和T1的操作模式,(MOV TMOD,#*H),记忆!,M0,M1,C/T*,GATE,M0,M1,C/T*,GATE,(89H),D0,D1,D2,D3,D4,D5,D6,D7,TMOD,定时器T0,定时器T1,17,(1)GATE,:,门控位,Timer可由软件与硬件两者控制,GATE=,0 普通用法,Timer的,启,/停,由软件对TRx,位写,“1”,/“0”控制,(SETB TRx),GATE=,1,门控用法,Timer的,启,/停由,软件对TRx位写“1”/“0”,和在,INTx引脚上出现的信号的高,/低共同控制,When,GATE=0,TIMER/COUNTERx will,run,only,while TRx=1(software control),When,TRx(in TCON)is set,and,GATE=1,TIMER/COUNTERx will run only while,INTx pin is high,(hardware control).,18,GATE,位的状态决定定时器/计数器运行控制取决于,TRx一个条件,还是,TRx和引脚这两个条件,.,0,:是否计数,仅取决于TRx的状态,.,1,:由INTx,*,由TRx和INTx,*,二个条件来控制的.,When this bit is set the timer will only run when INT1*(P3.3)/INT0*(P3.2)is high.When this bit is clear,the timer will run regardless of the state of INT1*.,19,振荡器,12,TLx THx (8位)(8位),TFx,申请中断,Tx Pin,TRx位,GATE位,INTx*Pin,1,&,C/T=0,C/T=1,=1 接通,=0 断开,或门,与门,TF1,TR1,TF0,TR0,IE1,IT1 IE0 IT0,TCON,GATE,C/T*M1 M0,GATE,C/T*M1 M0,TMOD,20,(2)C/T*,:计数器/定时器选择位,=1,(Counter),外部事件计数器,.对,Tx引脚,的,负脉冲,计数,=0,(Timer),片内时钟定时器,.对,机器周期脉冲,计数定时,Timer or Counter selector.,Set,for,Counter operation,(input,from Tx input pin,);,Cleared,for,Timer operation,(input from,internal,system clock).,M0,M1,C/T*,GATE,M0,M1,C/T*,GATE,(89H),D0,D1,D2,D3,D4,D5,D6,D7,TMOD,定时器T0,定时器T1,21,C/T*,位控制的电子开关决定了,定时器or计数器,的工作模式.,0(T*-Timer):,电子开关打在上面,定时器工作模式,;,1(C-Counter):,电子开关打在下面,计数器工作模式,计数脉冲为,P3.4(T0)、P3.5(T1),引脚上的,外部输入脉冲,当,引脚上发生,负跳变,时,计数器加1.,When this bit is set the timer will count events on T1(P3.5)/T0(P3.4).When this bit is clear,the timer will be incremented every machine cycle.,22,方式0:00:13位 Timer用它无益,不要记它!,方式1:,01:,16位,Timer,经常用到,方式2:,10:,8位自动重装的,Timer,经常用到,方式3:11:T0 分为,2个8位,Timer;,(3),M1,M0,:工作方式定义位(定义4种方式):,M1,M0,Operation Mode,0,0,0,13,-bit Timer(MCS-48 compatible),0,1,1 16-bit Timer/Counter,1,0,2 8-bit Auto-Reload Timer/Counter,1,1,3,Split timer mode,(Timer 0),TL0,is an 8-bit Timer/Counter controlled by the,standard Timer 0 control bits,TH,0 is an 8-bit Timer and,is controlled by Timer 1 control bits,(Timer 1)Timer/Counter 1 stopped,23,5.4 定时器的,四种工作方式,比较:串行口也有四种工作方式,不要混淆,对TMOD寄存器的M1、M0位的设置,可选择四种工作方式,即方式0、,方式1、方式2,和方式3,(重点看方式1/2),24,方式,1,16,位,的定时,/,计数器,(,常用,),振荡器,12,THx TLx (8位)(8位),TFx,申请中断,Tx Pin,TRx位,GATE位,INTx*Pin,1,&,C/T=0,C/T=1,控制=1开关接通,或门,与门,25,16位TH0和TL0,是以,全16位,参与操作,THx赋高8位,TLx赋低8位,(1),计数,工作方式时,最大计数,216=65536(个外部脉冲),TH0=TL0=FFH,FFFFH=65535,(2),定时,工作方式时,定时时间为:,t=(216一T0初值),时钟周期12,2.,TMOD选方式:写“M1,M0”=01 选方式1,NOTE:,Tm 机器周期,26,3.,若,不用门控位(GATE=0),直接用,软件写TRx控制启/停,若,使用门控位(GATE=1),先,置位TRx,然后由INTx端的,高,/低电平来控制其,启,/停,允许中断,还须先置位ETx、EA等中断允许控制位,并编写中断服务程序;,若,不用中断,可,查询,“计数溢出标志,TFx,”的方式工作,但溢出标志,TFx须软件清0 (JBC TF0,*),27,分析:已知fosc=,6MHz,则:,(振荡周期)1Tc=1/6MHz=1/6us,(机器周期)1Tm=12Tc=12*1/6us=,2,s,(12MHz1us,6MHz2us 记忆!),粗略地说:,Tmin,2,16位定时器,最大数值,为:2,16,=65536=0,FFFF,H+1,TH0=TL0=0FFH,故选择方式1工作可以得到:,Tmax,=65536,2=131072,s=,TH0=TL0=00H,例1:若晶振频率为,6MHz,计算单片机在,定时器方式1,的条件下的,最小与最大定时时间:,28,分析:已知fosc=6MHz 则:,(机器周期),1Tm=12Tc=12/6MHz=,2,s,100ms2,s=50000,16位定时器最大数值为:,2,16,=65536(=0FFFFH+1),故,选择方式1,工作可以满足要求.,计算初值:,65536-50000,=15536=3CB0H,小软件,(考试时带计算器,不要算错,WINDOWS自带计算器),例2:要求对,T0产生100ms,定时进行初始化.(晶振=,6MHz,)(笔算),29,由分析得知:,T0,选择方式1,初值=3CB0H,GATE C/T*M1 M0,GATE C/T*M1 M0,TMOD,X X X X 0 0,0 1,初始化:MOV TMOD,#01H,;,选T0,方式1,0000 00,01,MOV TH0,#3CH ;赋初值高8位,MOV TL0,#0B0H ;赋初值低8位,SETB TR0 ;启动T0定时,若需要定时器0产生中断还应当写如下语句:,SETB ET0 ;开T0中断允许,SETB EA ;开总中断允许,以及相应的中断服务程序,30,方式,2,8,位自动重装,的定时,/,计数器,(,常用,),振荡器,12,TLx(8位,),TFx,申请中断,Tx端,TRx位,GATE位,INTx端,1,&,C/T=0,C/T=1,控制=1开关接通,或门,与门,THx(8位),溢出位,门开,31,(1),M1M0=10,时,定时器工作在,方式2,8位的可自动重装载,的定时/计数方式.,(2)16位的计数器被拆成两个8位,其中,TL0作为自加的8位计数器,TH0不负责计数但负责放置待自动重新载入的初值.,当TL0计数溢出,置TF0,TH0中的初值自动装入TL0相同,的值.,NOTE:,32,(3)用于,计数工作方式,时,最大计数值为:,2,8,=256(个外部脉冲).(MOV TL0,#00H),用于,定时工作方式,时,其定时时间为;,t=(2,8,TH0初值)时钟周期12,(4)这种工作方式可,省去用户重装常数的程序,并可产生,精确的定时,时间,特别,适用作串行口波特率发生器,.(串行口工作方式1),Tm 机器周期,33,分析:fosc=,6MHz,1Tm=2,s,1kHz方波周期=1/f=1/1kHz=1ms,半个方波周期=500,500us2us=250,若,选择方式2,工作,8位定时器最大数值为:,2,8,=256=0FFH+1(记忆!),可以满足要求.,计算初值:,256-250=6,.(,小软件,),例3:从,P1.0脚输出频率=1kHz方波T1,定时中断.,Th:半周期,T:周期,34,ORG 0000H,AJMP MAIN,ORG,001BH,;T1的中断矢量,RETI,;中断返回,MAIN:MOV TMOD,#20H,;选T1方式2(00,10,0000),MOV TH1,#06H,;赋重装值,MOV TL1,#06H,;赋初值,SETB EA;开总中断,SETB ET1;开T1中断,SETB TR1;启动T1,SJMP$;原地等待中断,END,初始化,35,方式,0,(,了解,一般不用,),定时器,T0/T1,工作于,13,位,定时计数方式,(1),用于计数方式时最大计数值为,2,13,=,8192,个脉冲,(2),用于定时工作方式时,定时时间为,:,t=(2,13,一,T0,初值,),时钟周期,12,(3),在这种模式下,16,寄存器,(,THx,和,TLx,),只用,13,位,其中,THx,占高,8,位,TLx,占低,5,位,TLx,的高,3,位未用,.,(4),当,TLx,的低,5,位溢出时向,THx,进位,而,THx,溢出时硬件置位,TF0,并申请中断,.,(5),定时、计数溢出否可查询,TF0,是否置位,如果开中断则产生溢出中断,.,Tm 机器周期,36,方式,3(Split Timer Mode,了解,):,Timer0,被,分割成两个,8,位,定时,/,计数器,TL0,和,TH0,并占用原本是,Timer1,使用的,TF1/TR1,标志位和运行控制位,;,TL0,使用,T0,的状态控制位,GATE,、,C/T*,、,TR0;,TH0,被固定为一个,8,位定时器,(,不能作外部计数模式,),并,使用定时器,T1,的状态控制位,TR1,和,TF1,同时占用定时器,T1,的中断请求源,TF1.,37,振荡器,12,TL0(8位),TF0,申请中断,T0端,TR0位,GATE位,INT0端,1,&,C/T=0,C/T=1,控制=1开关接通,或门,与门,TH0,(8位),TF1,申请中断,TR1位,控制=1,Timer工作方式3结构:,T0成为两个8位Timer,T1的TF1,TR1借给TH0,38,5.5 定时计数器的,初始化编程(重点,熟练掌握),(1)确定是,定时还是计数,方式,定时的话,TMOD中的,C/T*,为O,计数时C/T*=l;,(2)确定定时/计数时,是否受外部的硬件信号控制,.,若不受外部INT0*或INT1*引脚控制时,TMOD中的,GATE位为0,否则需设成,1,;,(3)决定计数器的模式,模式0时最大计数值为8192且不能自动载入;,模式1,时最大计数值为,65536,同时计数器,没有自动载入,的功能;,模式2,时最大计数值为,256,可,自动载入,计数值;模式3时有两个计数器,其最大计数值都是256;,(4)将前3个步骤的结果结合起来,成为一个BYTE的数据赋给,TMOD,寄存器;,GATE,C/T*M1 M0,GATE,C/T*M1 M0,T1 T0,39,(5)决定寄存器TH0/TLO,TH1/TL1的,设置值,由于8051上的计数器都属于可载入式的,上加型计数器(Up-Couner),所以正确的设置值应该是:,该计数器的最大可计数值,减去,欲计数值,然后将该结果分成,两部分,后,再传到THx和TLx,两个寄存器;,(6)根据需要,如果工作于,中断方式,需要,开放中断,置位,EA,(中断总开关)及,ETx,(允许定时/计数器中断),并编中断服务程序,对,IE/IP寄存器编程;,(7)在适当的时机中将TCON中的,TR1和TR0位设成1,开始让Timer动作。,40,例4:如右图所示,P1口,接有八个发光二极管,编程使八个管,轮流点亮,每个管亮,100ms,设,晶振为6MHz,.,41,查询方式,如下:(,Keil 演示,),ORG 0000H,MOV A,#01H;置第一个LED亮,MOV TMOD,#10H,;T1工作于定时方式1,00,01,0000,NEXT:MOV P1,A,MOV TH1,#3CH,MOV TL1,#0B0H,;定时100ms,SETB TR1;启动定时器,AGAI:,JBC TF1,SHI,;100ms到,TF1=0,转SHI,并清TF1,SJMP AGAI;Jump if the bit is set and clear the bit,SHI:RL A;A=02H,SJMP NEXT,END,43,中断,方式 (,Keil 演示,),ORG 0000H,AJMP MAIN ;单片机复位后从0000H开始执行,ORG 001BH ;定时器T1中断服务程序,AJMP INT1_SERV;转移到INT1_SERV,ORG 0030H ;主程序,MAIN:MOV A,#01H,MOV P1,A ;置第一个LED亮,MOV TMOD,#10H,;00,01,0000 T1工作于定时方式1,MOV TH1,#3CH,MOV TL1,#0B0H,;定时100ms,SETB EA,SETB ET1,;允许T1中断,SETB TR1,;启动T1工作,SJMP$;等待中断,INT1_SERV:RL A ;中断服务程序,左移一位,MOV P1,A ;下一个发光二极管亮,MOV TH1,#3CH,MOV TL1,#0B0H,;,special 重装计数初值,RETI,;中断返回,END,以上程序进入循环执行,八个LED一直循环轮流点亮.,44,例5:在接一个,发光二极管LED,要求利用定时控制使LED,亮1秒灭1秒,周而复始,设,fosc=6MHz.,分析:16位定时,最大,为2,16,*2us=131.072ms,显然不能满足要求,可用以下两种方法解决.,(长定时 special),fosc=6MHz,方式1:Tmax=216*2us=,131.072ms,(了解这个数量级),fosc=12MHz,方式1:Tmax=216*1us=,(了解这个数量级),45,T:周期,分析:f,osc,=,6MHz,1Tm=2,u,s,T=2s,半个方波周期=1s=1000ms,1000ms2us=500,000,若,选择方式1,工作,16位定时器最大值为,65,536500,000,所以设定:采用,10*100ms,的方式,对于100ms,100ms/2us=50,000,65536-50000=15536D=3CB0H(不要算错),46,解1:,T0每隔100ms中断一次,利用软件对,T0的中断次数,进行,计数,中断,10次,即实现了1秒的定时,.(重要,KEIL演示,),ORG 0000H,AJMP MAIN,ORG,000BH,AJMP T0INT,ORG 0030H,MOV TMOD,#,01H,MOV TH0,#,3CH,MOV TL0,#,0B0H,MOV R7,#10;,中断10次计数,SETB ET0,SETB EA,SETB TR0,SJMP$,T0INT:,DJNZ R7,RET0,CPL P1.7,MOV R7,#10,RET0:MOV TH0,#3CH,MOV TL0,#0B0H,RETI,END,47,解2:采用,T0产生周期为200ms脉冲,T1的计数脉冲,T1对下降沿计数,因此T1计,5个脉冲,正好,1000ms,.(加了硬件special),T0,采用,方式1,定时器模式,X=65536-,100,000,/2=15536=3CB0H,T1,采用,方式2,计数器模式,计数初值,X=256-5=251=0FBH,均采用,查询方式,流程图和程序如下:,48,ORG 0000H,MOV TMOD,#61H,;0,1,10,0,0,01 T1计数器 方式2 T0定时器 方式1,MOV,TH1,#0FBH;定时器1赋初值,MOV,TL1,#0FBH,SETB TR1,LOOP2:MOV,TH0,#3CH,MOV,TL0,#0B0H,SETB TR0,;,程序中用,JBC指令对定时/计数溢出标志位,LOOP3:,JBC,TF0,LOOP4;,进行检测,当标志位为1时跳转并清标志,SJMP LOOP3,JBC TF1,LOOP1,AJMP LOOP2,END,49,例6:有P3.4引脚(T0)输入一,低频信号,(其小于0.5kHz),要求,负跳变,时,负,脉冲,同时,正,脉冲,.已知晶振频率为6MHz.,P3.4,500us,1ms,定时方式,计数方式,计数方式,(初值FFH),定时方式,1ms,500us,P1.0,P1.1,50,解:按题意,初态P1.1输出高电平(系统复位时实现),P1.1输出低电平,T0选方式计数方式(计一个脉冲,初值为FFH),.当加在P3.4(T0)上的外部脉冲负跳变时,T0加1,计数器溢出,程序查询到TF0为1,改变,T0为500,s,定时工作方式,并使P1.0输出,P1.1输出.,T0,第一次定时500,s,溢出后,P1.0恢复为,T0,第二次定时500,s,T0恢复外部脉冲计数,.(领会其思路)设定时500,u,s,的初始值为X,则:,X=256-500/2=6,51,源程序如下:,BEGIN:MOV,TMOD,#06H,;0000 0,1,10,T0,计数模式,方式,MOV TH0,#,0FFH,;,计数一个脉冲,MOV TL0,#0FFH,CLR P1.1 ;P1.1初值为0,SETB TR0,;启动计数器,DELL:,JBC TF0,RESP1,;检测外跳变信号,AJMP DELL,RESP1:,CLR TR0,MOV,TMOD,#02H,;0000 0,0,10,T0,定时模式,方式2 500us,52,MOV,TH0,#06H,;重置定时初值,MOV,TL0,#06H,SETB P1.1 ;,CLR P1.0 ;题意要求,SETB TR0,;启动定时计数器,DEL2:,JBC TF0,RESP2,;检测,第一次500us,到否,AJMP DEL2,RESP2:SETB P1.0 ;P1.0恢复1,题意要求,DEL3:,JBC TF0,RESP3,;检测,第二次500us,到否,AJMP DEL3,RESP3:CLR P1.1 ;P1.1复0,题意要求,CLR TR0,AJMP BEGIN,53,周期为3ms、占空比为2/3的脉冲波,,应该如何编写程序。(fosc=12MHz)(分析,占空比,理解),ORG 0000H,LJMP MAIN,MAIN:MOV TMOD,#01H,MOV TL0,#18H,MOV TH0,#0FCH;1ms定时,MOV,R2,#02H,SETB TR0,LOOP:,JBC TF0,CPLP;查询方式,AJMP LOOP,CPLP:MOV TL0,#18H,MOV TH0,#0FCH;重新赋值,JB P1.0,CPLP1,MOV R2,#02H,AJMP LOOP,CPLP1:DJNZ R2,LOOP,AJMP LOOP,END,keil,54,5.6 门控位,GATE,的应用,门控位,GATE为1,时,TRx=1,INTx*=1才能启动定时器,.利用这个特性可以,测量外部输入脉冲的宽度,.,例8:利用,T0门控位,测试INT0*引脚上出现的,正脉冲宽度,已知晶振频率为12MHz,将所测得值最高位存入,片内71H,单元,低位存入,70H单元,.,解:设,外部脉冲由INT0*(P3.2)输入,T0工作于定时,方式1(16,位计数),GATE设为1,.,测试时,应在,INT0*为,低,电平时,设置TR0为1,(16位计数);当,INT0*变为,高,电平时,就,启动,计数,;再次,变,低,时,停止,计数,.此,计数值与机器周期的乘积即为被测正脉冲的宽度,.,因fosc=12MHz,机器周期为1us,测试过程如下:,55,MOV R0,TL0,;存放结果,INC R0,MOV R0,TH0,SJMP$,这种方案,被测脉冲的宽度最大为65535个机器周期.,由于靠软件启动和停止计数,有一定的测量误差.其可能的最大误差与指令的执行时间有关.,此例中,在读取定时器的计数之前,已把它停住.但在某些情况下,不希望在读计数值时打断定时的过程,由于我们,不可能在同一时刻读取THx和TLx的内容,.读取一个时恰好另一个产生溢出,在这种情况下,读取的计数值有可能是错的.,57,可以,解决错读,的方法是:,先读THx后读TLx,若两次读得的THx没有发生变化,则可确定读到的内容是正确的.,若前后两次读到的THx有变化,则再重复上述过程,重复读到的内容就应该是正确的了.下面是按此思路编写的程序段,读到的TH0和TL0放在R1和R0内:,REPEAT:MOV A,TH0,;,MOV R0,TL0,;,CJNE A,TH0,REPEAT,;,MOV R1,A,58,外部输入的计数脉冲的最高频率为系统振荡器频率的1/24,例如选用,12MHz,频率的晶体,则可输入,500kHz,的外部脉冲.,对于外部输入信号的,占空比并没有什么限制,但为了确保,某一给定的电平在变化之前能被采样一次,则这一电平至少要保持一个机器周期.,故对外部输入信号的基本要求如图所示,图中,Tcy为机器周期,.,59,扩展:8052系列有TIMER2,SFR:T2CON T2MOD RCAP2L RCAP2H TL2 TH2,PIN:T2(P1.0)T2EX(P1.1).,Timer 2 in Auto-Reload Mode,Timer 2 in Capture Mode,Timer 2 as a Baud Rate Generator,60,
展开阅读全文