您好,欢迎访问三七文档
这一讲我们了解定时/计数器的作用和原理我先讲一下什么是定时器单片机就是放在一个芯片里的计算机,所以光有CPU还不算单片机,还需要有内存,外存,输入输出接口和外部设备,这个芯片里就有一台完整的小电脑了.所以叫单个芯片的计算机简称单片机内存,外存,输入输出我们都好理解,外部设备有哪些呢?主要就是串行通信控制器(串口)和定时/计数器今天这课就是讲定时/计数器定时/计数器是即能定时,又能计数的器件单片机不能完全靠人来控制比如你按什么键它就执行什么事,那么你不按呢?它就傻等着,这可不行,那么我们给单片机制定了工作日程表,总不能一直用人盯着提醒它做什么吧。这样我们给它提供了一个闹钟,就是这个定时器,我们把要做的时安排好时间,然后定时器到了时间就提醒CPU做该做的事,这样就自动化了再说计数器如果用单片机来计数,一般可以通过用CPU来计算,可是这样一来,CPU就不能集中精力做事了比如它想知道生产线上一共传送了多少个产品,那么有一个办法就是让它一直等,有一个产品它就计数加1,可是它也不知道下一个产品什么时候来,所以只好一直等,那它就没办法专心做别的事了,开发人员想了,干脆给它派个助手吧,专门在那等着计数,然后CPU也不管它计了多少,什么时候想知道了就到计数器那里去问一下。。定时器和计数器其实是一回事!!!只不过定时器是对系统的时钟信号进行计数。我们通常用用电是200V50HZ我想前面那个我不用解释了吧。。后面那个的意思就是一秒钟有50次的频率。。也就是50HZ。那么6M也就是6MHZ也就是600万次的频率。也就是说一秒钟600万次。比如我们用6M的晶振,那么12个时钟周期执行一条指令。就是一个指令周期。我们用计数器对指令周期计数。6M=600万600万/12=500K(k是指千)就是一秒钟有500K个指令周期。一个指令周期就是1秒/500K=2微秒那么我们想定时1毫秒500*2微秒=1000微秒=1毫秒就设定计数器记录500个时钟周期就行了那么要得到1秒呢?就是1000个1毫秒,无非就是改变计数的值现在我们来总结一下这个定时/计数器,其实就是个计数器。只不过用来对内部的指令周期计数的时候就相当于定时器。对外部输入信号计数的时候就是计数器了那么这个定时器是不是可以无限的计数呢?不能。为什么呢????因为8位单片机只能表示0~255。这当然远远不够。开发人员把两个8位的空间连了起来成了一个16位的,这样一来就能计数0~65535了。再多点行不?也行,只是没必要。因为可以用程序做个变量,当作软计数。而在计数65535这么多个指令周期的过程中,CPU可以执行65535条指令。这么多指令足够完成任何复杂的操作了!!!比如我们要计数1秒,那么我们用定时器产生1毫秒的定时周期。然后每个周期让i加1,那么当i=1000的时候,就是1秒了。如果我们做个j,当i=1000的时候j+1,那么j就是一秒变一次,再做个k,当j每次到60的时候k加1那么j归0再做个L,当k到60的时候L+1就一小时了,再做个M,L到24的时候M+1,再做N当M到365,N+1,再做个O,M到100,O+1。好回忆一下,定时器是怎么工作的。定时器是靠晶振周期工作的。比如,我们用12MHz的晶振,它一秒钟有多少个周期呢???12M=12个100万就是1千200万(M就是100万)12M表示每秒1200万个周期,12M/12=100万也就是说12MHZ的晶振它一秒钟有100万个指令周期。为什么呢。。因为一个晶振周期是12,当1200万除以12(一个指令周期)时那么就是100万,那么它一秒钟就有100万个指令周期。定时器每个机器周期加1那么一个机器周期是多少秒?1M个指令周期/秒表示每个指令周期是1/1M秒。1/1M=1/100万就是100万分之一秒就是1微秒说明每1微秒定时器加1那么从0加到65535一共需要65535*1微秒=65535微秒=65.535毫秒所以我们要设计程序的时候,要算好这个时间,也就是说算出定时器的最大定时间隔,不然容易出错。12M晶振的最大定时间隔是65.535毫秒,用定时器定时的时候,不要超过这个数,要不就不准了。如果换成6M的,最大定时时间也会加倍。如果想得到1秒。那么600W/12=50万,那么也就是1秒钟得到50万个指令周期。那么1/0.5M=0.000002秒,0.000002秒=0.002毫秒=2微秒也就是说我们一个指令周期是2微秒1秒=1000毫秒=1000000微秒那么我们的当一个指令周期时定时/计时器就加1当计时器到65535是就65535*2微妙=131070微秒=131.070毫秒=0.131070秒但是我们发觉这里的换算不好算。。那么我们可以变个方式来算我们可以用100毫秒来算。。100毫秒=100000微妙100000微妙/2=50000次那么当定时/计数器到50000时候也就是100毫秒。那么1秒就等于10*100毫秒。也就是说当在计10次时就是1秒。我们在这里会碰到一个最大时间间隔用6M的最大时间间隔是131.070毫秒只要小于131.070毫秒就行了。。但是要小的合理。。别当50毫秒的时候计数。。那样就浪费了。明明可以分一次操作能完成的事情。。你硬是分了两次。就浪费了,我们要合理的利用里面的资源。。这样既要保证不出错,也要保证不浪费。。接着说定时/计数器上次说了定时/计数器的工作原理今天来说具体的操作方法定时/计数器是个两用的设备,即能定时,又能计数,因此称做“定时/计数器”,简称“C/T”定时/计数器需要有开关,需要能控制“定时”和“计数”功能转换,还需要能设置定时时间和计数初值,这些功能是通过一些叫做“控制寄存器”的东西实现的定时器是一直工作吗?你只有告诉秘书说:“下午3点叫我开会”她才需要工作如果你不需要它,就不应该让它叫你所以定时器需要有开关定时/计数器是两用的你需要它定时,它就定时,需要它计数,它就计数就是说“定时”和“计数”需要选择模式所以需要“模式控制”开关定时器不是随便多长时间闹都可以而是根据你需要的时间闹铃所以需要设置定时初值比如这些功能是通过一些“控制寄存器”实现的,每个控制寄存器有8位(1个字节),相当于一个有8个开关的“开关柜”,每个开关实现一定的功能,比如“开关定时器”或“改变工作模式”等。为了方便使用,我们会给不同的“开关柜”和里面的每个“开关”都取个名字比如:“一号配电柜”,“主发电机开关”同样,我们也给每个控制寄存器取名字,用于控制定时/计数器的寄存器一共有两个:一个叫“TCON”,也就是“定时/计数器控制寄存器”一个叫“TMOD”,也就是“定时/计数器工作模式控制寄存器”“定时/计数器工作模式控制”也就是控制它以“定时器”还是“计数器”方式工作。而“定时/计数器控制”,主要用来控制定时/计数器的“启动”和“停止”等功能。“模式控制”是用来控制工作方式的,而“控制”是用来控制开关的先看“定时/计数器控制寄存器”也就是“TCON”:TCON从高到低,一共一个字节,8个位(第7位到第0位)其功能定义如下:76543210空TR1空TR0空空空空可见TCON只使用了第4位和第6位,其他的位都没用到。第6位是“TR1”,是定时/计数器1的开关第4位是“TR0”,是定时/计数器0的开关为1表示开,为0表示关例如我们要启动定时/计数器1写成程序就是TR1=1;如果要关闭定时/计数器0,就是TR0=0;当然也可以一次操作整个寄存器,例如要同时开两个定时/计数器,则TCON=0x50;//0x50=01010000,可见第4和6位都是1,即TR0=1,TR1=1如果要全关了,则:TCON=0x00;//0x00=00000000,TR0和TR1都是0再看“定时/计数器工作模式控制寄存器”,也就是TMOD寄存器:TMOD寄存器也是一个字节,共8位,4位一组分成两个完全相同的部分:高4位用来控制定时/计数器1,低4位用来控制定时/计数器0TMOD寄存器各位的定义如下:76543210GATET1/CM1M0GATET0/CM1M0GATE是“门控”,用于设置是否需要触发信号,GATE为1的时候,光打开开关TR1或TR0还不工作要有另外两个开门的引脚也为1才工作C/T是“定时/计数”功能选择为1表示计数器,为0表示定时器例如我要让定时器1定时,定时器0计数,可以用这条语句:M1和M0是工作方式,一共4种方式第5、4位和第1、0位为两组工作方式设置位,分别控制定时/计数器1和0的工作模式M1M0共有4种组合,分别表示4种工作方式:M1M00013位定时/计数器,高8位在TH里,低5位在TL里0116位定时/计数器,高位在TH,低位在TL10自动重设初值的8位定时/计数器11这个只能用在定时器0,定时器1没有这个模式,把定时器0当成两个8位定时/计数器M1M0为10这种模式的工作方式解释一下:假如你有个闹钟,它每次定时都响一次,然后定的时间就丢了。如果你想让它再响一次,还得重设初值,很不方便。而当M1M0为10时,每次闹铃后则不需要重设初值,它会自动装入上一次定时/计数的初值。比如你设置了2小时闹铃,闹完以后,它自动又设成了2小时,这样每隔2小时都会闹一次铃。最后说一下定时/计数初值的设置和计数结果的提取。51单片机的定时/计数器最多能保存16位二进制值就是两个字节,表示10进制的范围为0~65535每个定时/计数器的定时/计数值分别存放在两个8位寄存器里,分别叫TL和TH,TL用来存放低字节,TH用来存放高字节定时/计数器0的数据寄存器叫TL0和TH0定时/计数器1的数据寄存器叫TL1和TH1当M1M0模式设置为8位定时/计数器时,只使用TL存放数据,表示十进制范围为0~255而当M1M0模式为13或16位定时/计数器时,使用TL存放低8位,TH存放高8位要说明一点:定时器的工作方式是“溢出”方式就是说只有定时器到了上限(8位为256,16位为65536)时才会“闹铃”(即产生计数中断事件),因此定时器的初值是用定时器最大值减去需要定时的周期数计算的,例如我们要定时50000个周期,采用16位定时器,则定时器初值需设置为:65536-50000=15536就是说,定时器需要以15536为初值开始工作,才能在经过50000个定时周期后“闹铃”。由于这个初值要分别存放在两个8位寄存器TL和TH中,因此我们还需要把一个16位初值拆分成两个8位数值(低8位和高8位)才能“设置”到TL和TH里。举例来说:一个89S51,采用12M晶振,由于12个振荡周期为一个指令周期,因此每秒可执行1M条指令。每个指令周期定时器加1,因此定时器周期等于指令周期等于1秒/1M=1微秒我们让它定时50毫秒50毫秒/1微秒=50000个周期即定时50毫秒需要定时器需计时50000次那么我们采用16位定时器,计时范围从0~65535,要定时50000次,则初值为:65536-50000=15536次先把15536转换成16进制。。。15536=0x3CB0高位为3C,低位为B0那么我们把高位3C放进TH0,低位B0放进TL0就相当于设置了初值15536TH0=0x3C;TL0=0xB0;C51定时器TL0=(65536-50000)%256是怎么推导出来的?其实很简单,不管你使用多大的晶振,使用51单片机,一般都是12分频出来,也就可以得出一个机器周期机器周期=12/n(n指晶振频率),假设你要定时的时间为M那么定时的初值为:M/机器周期=初值;TH0=(65536-初值)/256;TL0=(65536-初值)%256;将(65536-初值)所得的值化成16进制,其高位就是TH0的值,低位为TL0的值例如用12M晶振做1ms定时计算如下:机器周期=12/12*10^6=1us(微秒)定时初值=(1*10^-3)/(1*10^-6)=1000;所以:TH0=(65536-1000)/256;(求模运算,即可求出高八位的值)TL0=(65536-1000)%256;(求余运算,因为低八位最大能装255)将65536-1000=64536化为16进制为
本文标题:定时计数器
链接地址:https://www.777doc.com/doc-3351148 .html