您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 第4章51单片机对时间的控制.
第五章51单片机对时间的控制1、软件定时2、可编程定时汇编语言可实现精确定时1、晶振电路图中X1表示一个晶体振荡器,我们单片机时钟的值就由它的选值决定。假设使用的振荡值为12MHZ那么它能产生的频率信号就为12MHZ。单片机不能直接运用12MHZ的时钟信号,单片机内部晶振信号进行12分频,分频后的频率信号就为机器信号。假如用12M晶振的话,51单片机的时钟周器为:1÷(12MHZ÷12)=1µs。如果晶振选择6M的话,机器周期就为2µs。DELAYL:MOVR5,#255LOOP:NOPNOPDJNZR5,LOOPRET一个短的延时子程序这个子程序最大所用的时间为:1+(1+1+2)×255+2=1023μs较长时间的定时程序DELAYL:LOOP2:MOVR5,#time1LOOP1:MOVR6,#time2NOPNOPDJNZR6,LOOP1DJNZR5,LOOP2RET这段程序的延时时间:[(1+1+2)×time2+2+1]×time1+2+1DELAY1S:;软件延时子程序MOVR4,#4LOOP3:MOVR5,#255LOOP2:MOVR6,#245LOOP1:NOPNOPDJNZR6,LOOP1DJNZR5,LOOP2DJNZR4,LOOP3RET1秒延时子程序C语言实现延时子程序voidDelay500ms(){unsignedchari,j,k;for(i=200;i0;i--)for(j=20;j0;j--)for(k=250;k0;k--);}可编程定时(定时器控制)单片机定时的方法有:硬件定时、软件定时、可编程定时。硬件定时是由硬件电路构成,本书着重讲软件编程,就不再介绍。软件定时就是我们在本章第一节所学,主要依靠循环程序进行时间的延迟,软件定时控制精确,但是占用CPU的开销,在延时的过程中,无法在进行其他操作。而可编程定时是通过单片机自带的定时器完成,对CPU的消耗不大,而在本节重点介绍单片机的可编程定时器。51单片机定时/计数器51单片机共有两个可编程的定时器/计数器,分别称为定时/计数器0和定时/计数器1。它们都是16位的加法计数结构。(1)计数功能:是对外部脉冲信号进行计数。51单片机P3.4和P3.5的第二功能T0、T1就是计数脉冲的输入端,如图4-21所示。外部输入的脉冲在负跳变,也就是下降沿有效,计1次数,计数器寄存器自动加1,需要注意一点:脉冲频率不能高于晶振频率的1/24。(2)定时功能:定时功能也是通过计数器的计数来实现的。不过这儿的计数脉冲来自于单片机的内部,每个机器周期产生一个计数脉冲。机器频率是晶振频率的1/12。如果选用12MHZ晶振的话,则计数频率就为1MHZ。也就是说,如果我们开启定时器,则每过1μs,计数器就自动加1。这样就可以根据计数值计算出定时时间了。定时器/计数器相关寄存器(1)定时器0数据寄存器定时器/计数器0是个16位的定时\计数器,分别有两个8位的数据寄存器构成。TH0在内部RAM高128单元的地址为8CH,TL0为8AH。它们既可以合并为一个使用,又可以单独使用。不管怎样,它们的计数值都是向上递增的,计数一次,它们的值加1。(2)定时器1数据寄存器定时器/计数器1同样也是个16位的定时\计数器,分别有两个8位的数据寄存器构成。TH0在内部RAM高128单元的地址为:8DH,TL0为8BH。它们既可以合并为一个使用,又可以单独使用。同样,它们的计数值都是向上递增的。(3)定时器控制寄存器TCON(88H)①TF0和TF1——计数溢出标志位当计数器计数溢出(计满)时,该位置“1”。例如,当定时器0作为一个16定时计数器时,也就是TH0和TL0合并为一个16位数据寄存器,当计数达到最大状态65535,如表4-5所示。如果再计一个数,就会产生溢出,此时标志位TF0被置为1,而TH0和TL0都被清零。②TR1和TR0——定时器运行控制位TR0(TR1)=0,停止定时器/计数器的工作。TR0(TR1)=1,开启定时器/计数器的。(4)中断允许控制寄存器IE(0A8H)在第3章讲过了三个控制位:EA、EX1、EX0。其中EA:为总的中断允许控制位ET1、ET0——定时/计数中断控制位ET1=0,禁止定时/计数1中断;ET1=1,允许定时/计数1中断ET0=0,禁止定时/计数0中断;ET0=1,允许定时/计数0中断(5)定时\计数工作方式控制寄存器TMOD(89H)①GATE——门控位GATE=0,运行控制位TR来启动定时器。GATE=1,以外中断请求信号(INT1或INT0)启动定时器。②C/T——定时方式或计数方式选择位C/T=0,定时工作方式。C/T=1,计数工作方式。③M1M0——工作方式选择位定时工作方式0在定时工作1,16位寄存器TH1和TL1只用13位,由TH1的8位和TL1的低5位组成。当TL1的低5位计数溢出时,向TH1进位。而TH1计数溢出时,则向中断标志位TF1进位(即硬件将TF1置1),并请求中断。可通过查询TF1是否置“1”或考察中断是否发生来判定定时器T1的操作完成与否。下面的描述以定时/计数器1为准:当C/T=0时,为定时工作模式,开关接到振荡器的12分频器输出,计数器对机器周期脉冲计数。其定时时间为:(213-计数初值)×机器周期例如:若晶振频率为12MHz,则机器周期为1μs。则最长的定时时间为:(213-0)×1μs=8191μs当C/T=1时,为计数工作模式,开关与外部引脚T1(P3.5)接通,计数器对来自外部引脚的输入脉冲计数,当外部信号发生负跳变时计数器自动加1。当GATE=0时,“或门”输出恒为1,“与门”的输出信号K由TR1决定,定时器不受INT1输入电平的影响,由TR1直接控制定时器的启动和停止。TR1=1;定时/计数启动;TR1=0;定时/计数停止;当GATE=1时,“与门”的输出信号K由INT1输入电平和TR1位的状态一起决定,当且仅当TR1=1且INT1=1(高电平)时,计数启动;否则,计数停止。工作方式0、实例1寄存器设定(1)计数初值设置想要产生500μs周期的方波信号,就需要在P1.0每隔250μs,电平翻转一次。所以定时时间为250μs,我们需要给定时数据寄存器赋初值,让它能在要求的时间内溢出,以判断是否翻转P1.0的电平。将这个初值设为X,则:(213-X)×1μs=250μsX=213-125=7942=1111100000110B。因为使用的是定时器0,所以此数值高8位放入TH0,TH0的值为0F8H;低5位的值放入TL0,TL0的值06H。(2)定时工作方式选择利用寄存器TMOD设定定时/计数工作方式,TMOD设置的值为00H。(3)中断关闭由于我们采用查询方式,所以中断全部关闭,IE的值为00H工作方式0、实例2本实例,利用定时器1的计数功能来计算方波脉冲的个数,定时器0依旧产生500μs的方波信号,不过采用的是中断方式实现,计数1的脉冲就来自于定时器0产生的方波信号工作方式0、实例2寄存器设定(1)定时计数工作方式TMOD(2)计数器1计数初值设定计数器1计数10次就中断,我们同样将计数初值设为X,那么:213-X=10,X=8182=1FF6H=1111111110110B其中高8位放入TH1,TH1的值为0FFH;低5位的值放入TL1,TL1的值16H。(3)中断开关设置EA在本例程中,需要同时开启定时/计数0、定时/计数1、总中断开关。(4)中断优先级设定IP将PT1设置为1,PT0设置为0。表示定时器1的中断优先级高于定时器0,如果当程序执行在定时器0中断服务程序中,计数器1中断发生,则打断定时器0的中断服务程序,当计数器1的中断服务程序执行完毕后,再执行中断服务程序0的内容,这就实现了中断的嵌套。中断源向量地址定时/计数器0(TF0)000BH~0012H定时/计数器1(TF1)001BH~0022H定时计数中断响应地址C51中断序号定时工作方式1当工作方式控制寄存器控制位M1、M0=01,定时/计数器所在的工作方式为工作方式1,假设我们使用定时器0,则定时数据寄存器就是由TH0的全部8位和TL0全部8位组成。其逻辑电路和工作情况和方式0是完全相同的,所不同的只是组成计数器的位数。当处于计数方式时:计数值的范围为:0~216(65536)。当采用定时方式时:定时时间的计算为:(216-计数初值)×机器周期假设选用的晶振为12MHZ时,机器周期为:1μs则最长的定时时间为:(216-0)×1μs=65536μs≈65.54ms≈0.066s最小的定时时间为:[216-(216-1)]×1μs=1μs实例设计方案在本节,采用可编程定时的方法实现流水灯功能,采用方式1最大的定时时间也仅为65.54ms,而前面我们采用软件延时的流水灯,延时的时间为1s,貌似不可行。但如果让定时器采取多次定时的方法呢?设置一次定时的时间为50ms,让它连续重复20次这样的过程,不就可以达到要求了吗?在定时中断中,设置一个计数变量,每发生一次中断,计数变量就自动加1,直到这个计数变量达到20,我们置位循环移位标志位。当循环移位标志位为1时,此时流水灯循环一次,再将循环移位标志位置0。重复这样的过程,就达到流水灯的效果工作方式1、寄存器设定(1)定时计数工作方式TMOD(2)定时器0计数初值设定想要产生50ms定时时间长度,设定时器的初值为X,同样选用12MHZ晶振频率。则:(216-X)×1μs=50ms=50000μsX=216-125=15536=3CB0H。因为使用定时器0,所以将此数值高8位放入TH0,TH0的值为3CH,低8位的值放入TL0,TL0的值0B0H。(3)中断开关IE定时工作方式2这是定时/计数器1在工作方式2下的逻辑图,定时/计数器0同样也是如此。TH1作为常数缓冲器,当TL1计数溢出时,在置“1”溢出标志TF1的同时,还自动的将TH1中的初值送至TL1,使TL1从初值开始重新计数。方式0和方式1用于循环重复定时或计数时,在每次计数器溢出后,计数器数据寄存器被清零。若要进行新一轮的计数,就得重新装入计数初值。这样一来不仅造成编程麻烦,而且影响定时精度。而方式2具有初值自动装入的功能,避免了这个缺点,可实现精确的定时。方式2只是8位计数器,定时时间短、计数范围小。其定时时间为:(28-初值)×机器周期若晶振频率为12MHz,则最长的定时时间为:(28-0)×1μs=256μs=0.256ms实例功能设想同时运用定时器0和定时器1。定时/计数器0用的是定时功能,运用定时器0制作一个高精度的信号发生器,产生200μs的方波信号。而定时/计数器1充当一个脉冲计数器的功能,用P0、P2端口电平指示器来显示脉冲个数。(1)定时计数工作方式TMOD(2)定时器0计数初值设定想让单片机P1.0输出周期为200μs的方波脉冲。则定时器0的定时时间为100μs。使用12M晶振,则机器周期为1μs。我们设计数初值为x,则:(28-X)×1μs=100μsX=156=9CH。则TH0和TL0都设定为9CH。实例寄存器设定(3)计数器1计数初值设定在工作方式2之下,计数最大值为28=256,这个计数值不是很大,所以我们将计数初值设定为0,让它从0开始计数,则TH1和TL1都设定为0。(4)中断开关设置(IE)(5)中断优先级设置(IP)定时工作方式3定时/计数0在方式3时被拆成两个独立的8位计数器:TH0和TL0。TL0使用定时/计数0的状态控制位C/T、GATE、TR0、INT0,它既可以工作在定时方式,也可以工作在计数方式。而TH0被固定为一个8位定时器(不能作外部计数模式),并使用定时器定时/计数1的状态控制位TR1,同时占用定时器T1的中断请求源TF1。此时,定时器TH0的启动或停止只受TR1控制。TR1=1时,启动TH0的计数;TR1=0时,停止TH0的计数。实例规划通过第3章的学习,我们知道51单片机只有两个外中断,在应用系统中可能会有外中断不够用的情况,这时候计数器往往能充当一个外
本文标题:第4章51单片机对时间的控制.
链接地址:https://www.777doc.com/doc-2156355 .html