《7单片机嵌入式系统原理及应用(贾好来)单片机的定时器和计数器.ppt》由会员分享,可在线阅读,更多相关《7单片机嵌入式系统原理及应用(贾好来)单片机的定时器和计数器.ppt(76页珍藏版)》请在课桌文档上搜索。
1、1,第7章 8051单片机的定时器/计数器,2,7.1 定时器/计数器的结构7.2 8051的定时器/计数器T0和T1的控制7.3 AT89S52的定时器/计数器T27.4 定时监视器(Watchdog Timer)7.5 单片机定时器应用实例,主要内容,3,7.1 定时器/计数器的结构及工作原理,定时/计数器的结构 在 8051单片机中,定时器/计数器就是一个固定长度的二进制计数器,当对输入脉冲信号的数量进行计数时,我们称其为计数器,当对单片机的系统时钟或其它标准时钟进行计数时,由于这类时钟信号本身就表示时间,计数值对应着时间值,所以从这个角度上将其称为定时器。如图7-3所示。,图7-3 定
2、时器/计数器T1模式0逻辑结构图,4,定时器的组成 在8051单片机中,内部定时器都是可编程控制的定时器/计数器,至少由两部分组成:脉冲计数电路和控制字寄存器及译码控制电路。在复杂一些的定时器中,还有预置数寄存器、多路开关等。2.定时/计数器的工作原理 可编程控制的计数器都是在程序写入控制字后按照控制逻辑的控制进行计数,所以在计数器开始工作前,必须要对定时器进行初始化设置。一般定时器初始化设置的主要内容有定时器的工作方式、计数的初值、中断的设置等。,5,6,所有设置数据在专用寄存器中保存,通过译码控制逻辑实现对计数器的控制。如果不改变计数器的工作方式,可以一次设置多次使用,当要改变工作方式等设
3、置时,要对需改变的内容重新设置。当初始化设置完成后,可以直接启动计数器开始计数定时,也可以先暂停计数,在需要时设置启动计数命令,开始计数。,3.定时器的溢出与重置,一般定时器在预置计数初值后计数,到计数器计满溢出后利用溢出标志信号实现查询或中断处理。定时器的定时长短就在计数初值上,计数初值越小,定时时间越长,计数初值越大,定时时间越短。计数初值是通过程序预置的,溢出后计数器的值为0,需要重新置入。不同的计数器重置初值的方法不同,有自动重置的,也有只能在程序中重置的。由于计数器都是重复周期使用的,无论那种计数器,都要必须保证能可靠地实现初值重置。,7,7.2 8051的定时器/计数器T0和T1的
4、控制,每个定时器的控制包含以下3部分:可预置计数器THx和TLx构成可编程控制的计数器部分;一个字节寄存器TMOD用于对两个定时器/计数器工作模式的编程控制;工作控制及状态表示位寄存器TCON。,8,9,1.计数器THx和TLx8051单片机内部有两个定时器/计数器,分别为定时器0(T0)和定时器1(T1),其低位计数器分别被称为TL0(字节地址:8AH)和TL1(字节地址:8BH),高位计数器分别是TH0(字节地址:8CH)和TH1(字节地址:8DH),TL0和TH0组成T0,TL1和TH1组成T1。两个计数器都是加法计数器,在预置数值的基础上进行加“1”操作,加到溢出时产生中断信号。当用作
5、定时器时,是在内部对CPU的时钟脉冲计数;当用作计数器时,是对由相应输入引脚输入的脉冲信号计数。,7.2.1定时器/计数器T0和T1的专用寄存器,定时器初值预置实例 MOV TH0,#0F0H MOV TL0,#0CH MOV TL1,#9CH MOV TH1,#9CH注意,不存在指令 MOV T0,#9C9CH类似的指令!,10,11,2.工作方式控制寄存器TMOD TMOD的字节地址为89H,用于控制和选择定时/计数器的工作方式,高4位控制T1,低4位控制T0,注意不能采用位寻址方式。格式如下:,图7-1 定时器T0和T1的工作模式控制寄存器TMOD,TMOD中的GATE位是门控制位,若G
6、ATE=0,定时器/计数器由TCON寄存器中的控制位 TRx 直接控制,TRx 位为“1”时允许计数,TRx位为“0”时停止计数。若GATE=1,定时器/计数器由TCON寄存器中的控制位TRx和外部中断输入引脚 双重控制,当TRx位与 输入电平都为“1”时才允许计数,其它情况时都停止计数。TMOD中的 位为定时/计数控制位,该位为“0”时,为定时器工作,对CPU时钟经12分频后形成的脉冲计数(对标准时钟计数就是计时);该位为“1”时,为计数器工作,对由外部引脚(T0、T1)输入的脉冲计数。,12,TMOD寄存器中的M0、M1为工作模式设置位,可以设定定时器以四种工作模式中的一种模式工作,如表7
7、-1所示。,13,表7-1 定时器/计数器T0和T1的四种工作模式,14,3.控制寄存器TCON TCON的字节地址是88H,用于控制定时/计数器的起停,定时/计数器的溢出标志。,图7-2 控制寄存器TCON,TF1 T1计数溢出标志位。当计数器 T1 计数计满溢出时,由硬件置1,申请中断。进入中断服务程序后由硬件自动清零。TR1 T1计数运行控制位。由软件置 1 或清 0。为1时允许计数器T1计数,为 0 时禁止计数器 T1 计数。TF0 T0计数溢出标志位。当计数器T0计数计满溢出时,由硬件置1,申请中断。进入中断服务程序后由硬件自动清零。TR0 T0计数运行控制位。由软件置1或清0,为1
8、时允许计数器T0计数,为0时禁止计数器 T0 计数。,15,IE0外部中断0()请求标志位。当CPU采样到INT0引脚出现中断请求后,此位由硬件置1。在中断响应完成后转向中断服务程序时,再由硬件自动清0。这样,就可以接收下一次外中断源的请求。IE1外部中断1()请求标志位,功能同上。IT0外中断0请求信号方式控制位。当IT0=1时下降沿信号有效;IT0=0时,低电平信号有效。IT1外中断1请求信号方式控制位。当IT1=1时下降沿信号有效;IT1=0时,低电平信号有效。,16,17,7.2.2 定时器/计数器的工作方式,1.工作方式0 13位定时/计数器当TMOD中的M1M0为00时,定时/计数
9、器工作在方式0。此时的定时/计数器为13位,高8位由THx提供,低5位由 TLx提供。低5位计数溢出后向高位进位计数,高8位计数器计满后置位溢出标志位(TCON中的TFx)。此种方式下计数器的最大计数次数为213=8192。,18,方式0的计数值和定时时间:作为计数器用,计数值:C=213-计数初值=8192-计数初值作为定时器用,定时时间:t=(213-计数初值)*机器周期=(8192-计数初值)*(12/fosc),19,2.工作方式116位定时/计数器当TMOD中的M1M0为01时,定时/计数器工作在方式1。此时的定时/计数器为16位。高8位由THx提供,低8位由TLx提供。低8位计数溢
10、出后向高位进位计数,高8位计数器计满后置位溢出标志位(TCON中的TFx)。此种方式下计数器的最大计数次数为216=65536。,20,方式0的计数值和定时时间:作为计数器用,计数值:C=216-计数初值=65536-计数初值作为定时器用,定时时间:t=(216-计数初值)*机器周期=(65536-计数初值)*(12/fosc),21,3.工作方式2-自动重装初值的8位定时/计数器 当TMOD中的M1M0为10时,定时/计数器工作在方式2。此时的定时/计数器为8位自动重装初值的定时/计数器。使用TLx的8位作为计数器,THx的8位作为预置常数的寄存器。当低8为计数溢出时置位溢出标志位,同时将高
11、8位数据装入低8位计数器,继续计数。此种方式下计数器的最大计数次数为28=256。,22,作为计数器用,计数值:C=28-计数初值=256-计数初值作为定时器用,定时时间:t=(28-计数初值)*机器周期=(256-计数初值)*(12/fosc),23,4.工作方式3-两个8位定时器/计数器 当TMOD中的M1M0为11时,定时/计数器工作在方式3。方式3只适用于T0,TL0的使用方法与方式0,方式1,方式2相同。方式3下的TH0,只可以用作简单的内部定时器。借用原定时器T1的控制位和溢出标志位TR1和TF1,同时占用了T1的中断源。TH0的启动和关闭仅受TR1的控制:TR1=1,启动定时;T
12、R1=0,停止定时。,24,当T0工作于方式3时,T1一般用作串行口波特率发生器。当设置好工作方式后,定时器T1自动开始运行;若要停止操作,只需要送入一个设置定时器1为方式3的方式控制字。通常把定时器T1设置成方式2作波特率发生器比较方便。,图7-3 定时器/计数器T1模式0逻辑结构图,25,图7-4 定时器/计数器T1模式1逻辑结构图,26,图7-5 定时器/计数器T1模式2逻辑结构图,27,a)TL0作8位定时器,28,b)TH0作8位定时器,图7-6 定时器/计数器 T0 模式3逻辑结构图,图 7-7 T0工作在模式3时T1为模式0的工作示意图,29,图 7-8 T0工作在模式3时T1为
13、模式1的工作示意图,图 7-9 T0工作在模式3时T1为模式2的工作示意图,30,31,例7.1 8051单片机定时器作定时和计数时,其计数脉冲分别由谁提供?答:8051单片机定时器作定时,其计数脉冲由内部时钟提供;8051单片机定时器作计数时,其计数脉冲由外部脉冲提供。,32,例7.2 用定时器0,方式2计数,要求每计满100次,将P1.0 端取反。分析:TMOD=00000110B 计数初值:TH0=TL0=28-100=156=9CH 程序如下:ORG1000H START:MOVTMOD,#06H MOVTL0,#9CH MOVTH0,#9CH SETBTR0 LOOP:JBC TF0
14、,DONE;判计满100次否?若计;满则清零TF0且转DONE SJMPLOOP DONE:CPL P1.0 SJMPLOOP,33,例7.3 已知单片机晶振频率为12MHz,要求使用T0定时0.5ms,使单片机P1.0引脚上连续输出周期为1ms的方波。分析:首先算出机器周期=12/(12MHz)=1us,所以0.5ms需要T0计数M次M=0.5ms/1us=500 2565008192,所以选择方式0 初值N=213-500=7692=1E0CH因为选用方式0,低8位TL0只使用低5位,其余的均计入高8位TH0的初值。TL0=0CH,TH0=0F0H,34,程序如下:ORG0000HRESE
15、T:AJMPSTART ORG000BH AJMPT0INT ORG0100HSTART:MOVSP,#60H MOVTH0,#0F0H MOVTL0,#0CH SETBTR0 SETBET0 SETB EAMAIN:AJMPMAIN,T0INT:CPL P1.0 MOV TL0,#0CH MOV TH0,#0F0H RETI,T0中断服务程序,35,例7.3可以在P1.0脚上产生约500Hz的方波,但是定时精度不高。原因有两个:一个是中断服务子程序执行时间未计入在内;二是从中断申请到CPU响应这个中断所经历的时间未计入T0 定时,这个时间肯定是不确定的值,在允许T0中断嵌套时定时精度更差。对
16、定时精度要求十分精确的场合,可以对上述两项误差进行补偿。下述补偿方法。,补偿方法的原理是:在中断服务子程序执行过程中关掉总中断,防止其它中断嵌套影响定时精度;用CLR TR0 指令停止 T0 计数,此时 T0 的计数值恰好反映了从T0溢出申请中断直到CPU响应中断这一段时间长短。把这个误差值按高8位和低5位分别加到T0的预置初值上去,这就补偿了CPU响应中断申请之前的定时误差;在中断服务子程序的关 T0 指令到启动 T0 指令之间还有14个机器周期的时间,也应该每次加在T0的预置初值上去。,36,例7.3 程序中的中断服务子程序应该改成,实现精确定时 T0INT:CLR EA;关中断 CLR
17、TR0;停止T0 计数 MOV A,#0F0H;取高8位计算的初值 ADD A,TH0;加修正值 ADD TH0,A;修正后送TH0 MOV A,#0CH;取低5位计算的初值 ADD A,#0EH;加14个机器周期 ADD A,TL0;加修正值 JNB ACC.5,LOW5_CARRY;判断低5位有进位否?INC TH0 ANL A,#00011111B LOW5_CARRY:MOV TL0,A;修正后TL0。CPL P1.0 SETB TR0;启动T0 SETB EA;开中断 RETI,37,例7.4 设单片机8031使用的晶振频率为6MHz,编程使P1.7脚输出1kHz连续方波。解:在6M
18、Hz时钟下,机器周期为2S。而1kHz方波的高、低电平持续时间都是500S,折合250个机器周期,允许使用8位定时器,选用T0模式2的定时功能,即可自动重装初值的8位定时器,在T0每次溢出时,不仅置位中断标志位TF0,还把TH0的初值自动装入TL0,此时T0中的两个初值计算所得各为#06H。设计的程序分成三部分:初始化程序、主程序和中断服务子程序。在初始化程序的最后再启动T0和开T0中断。在主程序中并不关心T0的工作,因为T0是自动工作的,在中断服务子程序中对 P1.7 脚输出取反,就可以输出方波。,38,模式2的T0初值可以重载,所以中断服务子程序执行时间不会影响定时精度,由于选用了T0,中
19、断申请为唯一的高优先级,所以CPU会立即响应T0的申请,避免了中断嵌套形成的定时误差,但是从T0申请中断到CPU响应中断还需时38个机器周期,而且断点不同,此时间也稍有变化。虽然它并不影响相邻两个中断申请的时间间隔,但是却影响P1.7脚输出电平的取反时刻,其误差在3个机器周期范围内。,39,ORG 0000H LJMP OKHZ_INIT ORG 000BH;T0中断入口 LJMP T0INT ORG 100HOKHZ_INIT:MOV SP,#60H;初始化 MOV TMOD,#2;T0模式2 MOV TL0,#6;计数器赋予初值 MOV TH0,#6 MOV IP,#2;T0高中断优先权
20、SETB TR0;启动T0 MOV IE,#82H;开T0 和总中断MAIN:SJMP MAIN;主程序 ORG 200HT0INT:CPL Pl.7;中断服务子程序 RETI;中断返回,40,7.3 AT89S52的定时器/计数器T2,在AT89S52单片机中增加的第3个定时器/计数器T2是对T0和T1定时器的有力补充。AT89S52有6个额外的特殊功能寄存器供定时器/计数器T2使用,包括定时器寄存器TL2和TH2、控制寄存器T2CON、工作模式寄存器T2MOD、捕获寄存器RCAP2L和RCAP2H。,41,定时器/计数器T2的工作模式由其控制寄存器T2CON和T2MOD决定,如表7-2和表
21、7-3。注意,T2MOD不能位寻址。与定时器T0和定时器T1类似,定时器/计数器T2的时钟信号可由片上振荡器提供,或通过引脚T2由外部提供。T2是AT89S52端口1的第0位(P1.0),这是其第二功能。T2CON的 位决定了是使用外部时钟信号还是内部时钟信号,与定时器T0和定时器T1的TCON寄存器的 位功能相同。,42,表7-2 T2CON(字节地址:0C8H)寄存器简表,43,表7-3 T2MOD(字节地址:0C9H)寄存器简表,44,表7-4定时器/计数器T2工作模式,45,7.3.1 定时器2的自动重装模式,当RCLK+TCLK=0且=0时,定时器T2工作在自动重装模式,TL2、TH
22、2用作定时器寄存器,RCAP2L和RCAP2H中保存重装值,如图7-10所示。与定时器0和定时器1的重装模式不同,定时器2在自动重装模式中仍然是16位定时器。当定时/计数器T2工作于16位自动重装载模式时,能对其编程设定为加计数或减计数,这个功能可通过定时/计数器T2模式寄存器T2MOD中的DCEN来选择,46,复位后DCEN=0,关闭了加减计数选择的功能,T2工作在默认的加计数方式。在这种方式下,若EXEN2=0,T2加计数直至0FFFFH溢出,置位TF2,向CPU发出中断请求信号,同时把寄存器RCAP2H和RCAP2L的值重装载到TH2和TL2中,RCAP2H和RCAP2L的值可由软件预置
23、;若EXEN2=1,重装载信号可以由T2溢出触发,也可以由外部输入端T2EX引脚上从1至0的负跳变触发,此负跳变同时使EXF2置位,同样向CPU发出中断请求信号。,47,图7-10 定时器/计数器T2的自动重装载模式结构原理图(DCEN=0),48,如果DCEN=1,允许T2进行加减计数的选择,如图7-11所示。在这种方式下,T2EX引脚控制计数方向。当T2EX引脚为逻辑1时,T2进行加计数直至0FFFFH,然后溢出,置位TF2,同时把寄存器RCAP2H和RCAP2L的值重装载到TH2和TL2中;当T2EX引脚为逻辑0时,T2进行减计数,若寄存器TH2和TL2中的数值等于RCAP2H和RCAP
24、2L中的值时,计数溢出,置位TF2,同时将0FFFFH重新装载到TH2和TL2中。无论T2发生上溢出还是下溢出EXF2标志位的内容都要被切换,所以此时EXF2不再是中断标志,在此种模式下,它可以用来作为增加计数器分辨率的第17个计数位使用。,49,图7-11定时/计数器T2的自动重装载模式结构原理图(DCEN=1),50,7.3.2 定时器2的捕获模式,当RCLK+TCLK=0且=1时,定时器T2工作在捕获模式,TL2、TH2用作定时器寄存器,RCAP2L和RCAP2H中保存捕获值,如图7-12所示。如果EXEN2=0,T2作为普通的16位定时/计数器使用,并由 位来决定它是用于定时器还是用于
25、计数器;如果作为定时器使用,其计数输入为振荡器频率的12分频信号;如果作为计数器使用,是对T2引脚(与P1.0复用)上的输入脉冲计数。计数溢出时,置位TF2位,同时向CPU发出中断请求信号。,51,如果EXEN21,定时器仍如上述工作,当T2EX(P1.1)的信号发生从1到0的跳变时,寄存器TL2、TH2中的数值被“捕获”,并送入寄存器RCAP2L和RCAP2H中,同时EXF2标志被置1。EXF2的状态可以用软件查询,也可以编程使其被置1时触发中断。,52,图7-12定时/计数器T2的捕获模式结构原理图,53,7.3.3定时器2的波特率发生器,当RCLK+TCLK=1,T2工作于波特率发生器模
26、式,其结构和原理如图7-13所示。由图7-13可见,RCLK和TCLK用来控制两个模拟开关的位置,如果其值为0,选用T1作为串行口波特率发生器,如果其值为1,则选用T2作为串行口波特率发生器。波特率的进一步讨论,见第8章。,54,图7-13 定时器计数器T2的波特率发生器模式结构原理图,55,7.3.4定时器2的可编程时钟模式,上述3种工作模式是8052单片机的T2所具有的工作模式,AT89S52在保留上述3种工作模式的基础上,增加了第4种工作模式:可编程时钟输出模式,能够从P1.0引脚输出占空比位50%的时钟脉冲,相当于一个时钟发生器,其结构原理如图7-14所示。T2工作于可编程时钟输出方式
27、时要求=0,即定时/计数器T2工作于定时器方式下,且T2OE(T2MOD.1)=1,即允许时钟输出。用TR2控制T2的启动与停止,从而达到对输出时钟控制的目的。,56,图7-14 定时/计数器T2的可编程时钟输出模式结构原理图,57,由图7-14可见,P1.0除了可以作为一般I/O接口使用外,还有两种功能:其一可以作为定时/计数器T2的外部时钟输入口;其二可以用于占空比为50的时钟脉冲输出口。当系统的时钟频率为16MHz时,输出时钟频率范围为61Hz4 MHz。时钟输出频率取决于振荡器频率和T2捕获/重装载寄存器RCAP2H、RCAP2L的值,计算公式如下:,58,在可编程时钟输出模式下,T2
28、的翻转不会产生中断,这个特性和T2作为波特率发生器时类似。所以T2在作为波特率发生器的同时,也可作为时钟发生器,但是这时所产生的波特率和输出的时钟频率不是独立的。,7.4定时监视器(Watchdog Timer),单片机应用系统一般应用于工业现场,虽然单片机本身具有很强的抗干扰能力,但仍然存在系统由于受到外界干扰使所运行的程序失控引起程序“跑飞”的可能性,从而使程序陷入“死循环”,这时系统将完全瘫痪。如果操作者在场,可以通过人工复位的方式强制系统复位,但操作者不可能一直监视着系统,即使监视着系统,也往往是在引起不良后果之后才进行人工复位。为此常采用程序监视技术,就是俗称的“看门狗(Watch
29、Dog)技术。,59,测控系统的应用程序往往采用循环方式运行,每一次循环运行的时间基本固定。“看门狗技术”就是不断监视程序运行的循环时间,如果出现运行时间超过设定的循环时间,则产生复位信号,强制系统复位。这好比是主人养了一条狗,主人在正常工作的时候总是不忘每隔一段固定时间就给狗吃点东西,狗吃过东西就安静下来,不影响主人工作。如果主人打瞌睡,到一定时间,狗饿了,就会大叫起来,把主人吵醒。,60,“看门狗”电路一般具有如下特性:(1)本身能独立工作,基本上不依赖于CPU;(2)CPU在一个固定的时间间隔内和该系统打一次交道(喂狗),表明系统正常;(3)当CPU陷入死循环,能及时发现并使系统复位。,
30、61,7.4.1 AT89S52的定时监视器,AT89S52的定时监视器(WDT)是由一个13位的计数器和定时监视器复位特殊功能寄存器WDTRST组成,WDTRST的地址为0A6H。系统复位后定时监视器的默认状态为无效状态,用户必须依次将1EH和0E1H写入特殊功能寄存器WDTRST,才能启动定时监视器。启动后每个机器周期对定时监视器中的13位的计数器进行加1计数,当计数器发生溢出时将在RST引脚上输出高电平,从而使系统复位。只有硬件复位(Reset)或WDT溢出复位才能使已启动的WDT无效。,62,依次将1EH和0E1H写入特殊功能寄存器WDTRST可以启动定时监视器,为了避免在系统正确运行
31、过程中WDT溢出而使系统复位,必须在WDT溢出之前再将1EH和0E1H依次写入特殊功能寄存器WDTRST(喂狗),从而使13位的计数器重新开始计数。也就是说,在振荡电路已经正常起振并且启动了WDT的情况下,每次计数在达到8191(1FFFH)个机器周期以前,用户必须进行“喂狗”操作。定时监视器复位WDTRST只能写不能读,而WDT中的13位计数器则是既不能读也不能写的计数器。13位计数器计满回0溢出将在RST引脚上产生复位信号,这个复位高电平脉冲宽度为98个振荡周期。,63,在低功耗状态下,WDT和振荡电路均停止工作,这时用户不需要维护WDT,可以通过硬件复位或优先进入低功耗状态的外部中断来终
32、止低功耗状态。通常情况下若通过硬件复位来终止低功耗状态,则任何时候维护WDT都会使单片机复位。为保证在终止低功耗的过程中,包括退出低功耗状态在内WDT不产生溢出,最好在刚刚进入退出低功耗模式前复位WDT。在进入休眠状态前,特殊功能寄存器AUXR中的WDIDLE位将决定在休眠过程中WDT是否继续运行和计数。,64,7.4.2辅助功能寄存器AUXR,辅助功能寄存器AUXR是一个多功能选择控制寄存器,地址是8EH,不能位寻址。各位定义及格式如图7-15所示。图7-15辅助功能寄存器AUXR的位定义,65,-:未定义位。WDIDLE:休眠模式下WDT控制位。当WDIDLE=0时,在休眠模式下WDT继续
33、运行计数;当WDIDLE=1时,在休眠模式下WDT停止运行计数。DISRT0:RST输出控制位。当DISRT0=0时,定时监视器定时输出后RST置成高电平;当DISRT0=1时,仅仅为RST引脚输入。DISALE:ALE输出控制位。当DISALE=0时,ALE输出fosc/6的波形信号,占空比为1:2;当DISALE=1时,ALE只有在MOVX和MOVC指令下有效。,66,以下给出定时监视器程序,主要包括初始化程序和喂狗程序两个部分:MAIN:MOV AUXR,#10H;初始化AUXR MOV WDTRST,#1EH;启动定时监视器 MOV WDTRST,#0E1H LCALL DOG;调用D
34、OG程序的时间间隔应小;于整个程序的运行时间 DOG:MOV WDTRST,#1EH;喂狗程序 MOV WDTRST,#0E1H RET END,67,68,7.5 单片机定时器应用实例,在日常生活中常常能看到用于装饰的彩色闪烁小彩灯,之所以小灯会闪烁,是由于小灯是在定时的亮和灭。利用单片机的定时器/计数器就可以完成对小灯的控制,在这里我们可以模拟一个实例。有4个小灯,LED1,LED2,LED3,LED4,从LED4开始倒着循环点亮小灯,每个小灯亮1S。,69,在实现小灯循环点亮的这个实例中最重要的是定时完成1s的功能。1.定时器0选择工作方式1 计数初值:t=(216-计数初值)*机器周期
35、=(65536-计数初值)*(12/fosc)50ms=(216-计数初值)*1us=(65536-计数初值)*(12/(12MHz)计数初值=15536=0011110010110000B TH0=00111100B=3CH TL0=10110000B=0B0H,70,2.电路原理和器件选择89C51:单片机,控制发光二极管的亮灭。OSC:晶振,在本例中选择12MHz的晶振。C1、C2:晶振电路的起振电容,容值为22PF。LED1LED4:发光二极管。R1R4:限流电阻,阻值1K。74LS00:四与非门,增强端口驱动能力。,71,72,3.地址分配和连接 P1.7P1.4:与74LS00的输
36、入引脚相连。RESET:单片机复位引脚和复位电路相连。X1、X2:单片机的晶振引脚,和外接晶振相连。74LS00的输出:与发光二极管相连。,73,4.程序设计 通过对P1.7P1.4置1和清零,控制P1.7P1.4口的电平高和低。当P1.7P1.4口的电平高时,74LS00的输出为的输出为低,发光二极管两端压差为5V,二极管导通,反之发光二极管则不导通。,74,ORG 0000H;复位入口地址 SJMPSTART ORG000BH;T0中断入口地址 SJMPT0SVR ORG0030H;主程序START:MOVSP,#40H MOVP1,#0FH;初始状态,发光二极管熄灭 MOVA,#1FH
37、MOVTMOD,#01H;设置T0工作方式1 MOVTH0,#3CH;设置50ms计数初值 MOVTL0,#0B0H MOV R0,#20;计数20个50ms,即1S SETBEA;开放总中断 SETBET0;开放T0中断 SETBTR0;启动T0中断,75,DISP:MOVP1,A SJMPDISP;循环显示;T0中断服务子程序T0SVR:MOVTL0,#0B0H;重置计数初值 MOVTH0,#3CH DJNZR0,QUIT;1S时间未到 MOVR0,#20;1S时间到,重置R0计数初值 ANLA,#0F0H;L0L3位于P1口的高4位 CLRC RLCA;将点亮LED循环左移 JNCQUIT MOVA,#10H QUIT:ORLA,#0FH RETI,76,请接着学习第8章!,