320 likes | 566 Views
单片机原理与应用. 第7章 定时器/计数器. 第7章 定时器 /计数器. 本章要点:. 7.1 定时器/计数器的功能和结构 7.2 定时器/计数器的工作原理 7.3 定时器/计数器的工作方式 7.4 定时器/计数器的编程. 7.1 定时器/计数器的功能和结构. 第7章 定时器 /计数器. 7.1.1定时器/计数器的功能. 7.1.2定时器/计数器的结构. 第7章 定时器 /计数器. 7.1.2定时器/计数器的结构. 7.2 定时器/计数器的工作原理. 第7章 定时器 /计数器. 第7章 定时器 /计数器.
E N D
第7章 定时器/计数器 本章要点: • 7.1 定时器/计数器的功能和结构 • 7.2 定时器/计数器的工作原理 • 7.3 定时器/计数器的工作方式 • 7.4定时器/计数器的编程
7.1 定时器/计数器的功能和结构 第7章 定时器/计数器 7.1.1定时器/计数器的功能 7.1.2定时器/计数器的结构
第7章 定时器/计数器 7.1.2定时器/计数器的结构
7.2 定时器/计数器的工作原理 第7章 定时器/计数器
第7章 定时器/计数器 7.3 定时器/计数器的工作方式 7.3.1工作方式寄存器-TMOD
第7章 定时器/计数器 7.3.1工作方式寄存器-TMOD (1)GATE: 门控位,实现选通控制 GATE=0时,只需用软件使TR0(或TR1)置1就可以启动定时器,而不管INT0(或INT1)的电平是高电平还是低电平; GATE=1时,只有在INT0(或INT1)引脚为高电平,而且TR0(或TR1)置1时,才能启动定时器工作. (2)C/T:计数/定时方式选择位 C/T=0,设置为定时方式,定时器计数单片机内部计数脉冲;当C/T=1,设置为计数功能,计数器对来自T0(P3.4)或T1(P3.5)端的外部脉冲计数。
第7章 定时器/计数器 7.3.1工作方式寄存器-TMOD (3)M1 M0:这两位指定定时器/计数器的工作方式,可形成四种编码
7.3.2 定时器/计数器工作方式 第7章 定时器/计数器 1.方式0
第7章 定时器/计数器 2.方式1 7.3.2 定时器/计数器工作方式
3.方式2 第7章 定时器/计数器 7.3.2 定时器/计数器工作方式
第7章 定时器/计数器 4.方式3 7.3.2 定时器/计数器工作方式
7.3.4 计数初值的计算 第7章 定时器/计数器 由于定时器/计数器以加1方式计数,假设计数值为x,则应装入定时器/计数器的初值为: (n为不同方式下计数器的位数)
第7章 定时器/计数器 7.3.4 计数初值的计算 每个机器周期包括12个振荡周期,若晶振频率 为6MHz,一个机器周期: 计数个数为: 其中Tp为机器周期 则应装入的计数初值为: 【例】要求定时为1mS,晶振频率12MHz。
7.4定时器/计数器的编程 第7章 定时器/计数器 应注意以下两点: (1)正确编制定时器/计数器的初始化程序 包括定义TMOD、写入定时初值、设置中断系统和启动定时器/计数器运行等。 (2)正确编制定时器/计数器中断服务程序 注意是否需要重装定时初值,若需要连续反复使用原定时时间,且未工作在方式2,则应在中断服务程序中重装定时初值。
第7章 定时器/计数器 7.4.1定时器应用实例 【例7-2】使用定时器/计数器T0的方式0,设定1ms的定时。在P1.0引脚上产生周期为2ms的方波输出。晶体振荡器的频率为fosc=6MHz。解:(1)定时常数计算振荡器频率为fosc=6MHz=6×106HZ,方式0计数器长度 n=13, 2n=213=8192定时时间: t=1ms=1×10-3s机器周期: Tp=12/6×106=2us计数值: x=Tc/Tp=1ms/2us=500那么应装入的初值为 8192-500=7692定时常数TC转换成二进制数TCB=11110 0000 1100 B。所以TCH=1EH,TCL=0CH。那么应该写入T0的形式为TH0=1EH,TL0=0CH。
第7章 定时器/计数器 7.4.1定时器应用实例 (2)TMOD的设定(即控制字)
第7章 定时器/计数器 (3)编 程 ORG 0000H AJMP MAIN ;转到主程序ORG 000BH ;T0中断矢量地址AJMP INQP ;转到中断服务程序ORG 0050HMAIN: MOV TMOD,#00H ;设置T0为方式0定时MOV TH0,#1EH ;装入T0的定时常数MOV TL0,#0CH SETB TR0 ;启动T0 SETB ET0 ;允许T0中断SETB EA ;CPU开中断SJMP $ ;等待T0中断发生ORG 0100H ;中断服务程序INQP: MOV TH0,#1EH ;重装定时常数MOV TL0,#0CH CPL P1.0 ;P1.0变反输出RETI ;中断返回
7.4.2计数器应用实例 第7章 定时器/计数器 【例7-3】试设定定时器/计数器T0为计数方式2。当T0引脚出现负跳变时,向CPU申请中断。 解: (1)定数常数计算 当T0引脚出现负跳变时,即向CPU申请中断,意思是说当计数器计数到28时就会溢出,设计数初值为X,再计数一次计数器就溢出,用公式表示为X+1=28,所以X=28-1=255=11111111B=0FFH,故此时的定数常数应为TCB=0FFH。
第7章 定时器/计数器 (2)TMOD的设定(即控制字) 7.4.2计数器应用实例
第7章 定时器/计数器 (3)编 程 ORG 0000H AJMP MAIN ;转到主程序 ORG 000BH ;T0的中断入口 AJMP INTS ;转到中断服务程序 ORG 0100H ;主程序入口地址 MAIN: MOV SP , #60H ;设栈指针 MOV TMOD,#06H ;设T0为计数方式2 MOV TL0,#0FFH ;设TL0初值 MOV TH0,#0FFH ;设TH0初值 SETB TR0 ;启动计数 SETB ET0 ;允许T0中断 SETB EA ;中断开放 SJMP $ ;等待T0中断发生 ;中断处理程序 INTS: PUSH A ;现场保护,把寄存器A中的值压入堆栈中 PUSH DPL ;把数据指针的低位DPL中的值压入堆栈中 PUSH DPH ;把数据指针的高位DPH中的值压入堆栈中 ;现场恢复 POP DPH ;把数据指针的高位DPH中的值从堆栈中取出 POP DPL ;把数据指针的低位DPL中的值从堆栈中取出 POP A ;把寄存器A中的值从堆栈中取出 RETI
第7章 定时器/计数器 7.5实例解析 【实例7-1】已知晶振12MHZ,参见图7-9,要求利用定时器T0使图中发光二极管D进行秒闪烁。 解析:发光二极管进行秒闪烁。即一秒钟一亮一暗,亮500ms,暗500ms。晶振12MHz,一个机器周期是1μs,T0方式1最大定时只能65ms多(注:216=65536)。 取T0定时50ms,计数10次,即可实现500ms定时。 (1)计算定时初值 T0初值=216-50000μs/1μs =65536–50000=15536=3CB0H TH0=3CH;TL0=B0H
第7章 定时器/计数器 (2)设置TMOD 00000001 B = 01H T0方式 T0 与 INT0 无关 T1控制位 (3)编程 ORG 0000H ;复位地址 LJMP MAIN ;转入主程序 ORG 000BH ;T0中断入口地址 LJMP IT0 ;转入T0中断服务程序 ORG 0100H ;主程序首地址 MAIN: MOV TMOD,#01H ; 设置T0为工作方式1 MOV TH0,#3CH ; 装入定时常数 MOV TL0,#0B0H MOV IE,#10000010B ;T0开中断 MOV R7,#0AH ; 设置循环次数为10次 SETB TR0 ;T0运行 SJMP $ ;等待中断
第7章 定时器/计数器 7.5实例解析 ;中断服务程序: ORG 000BH ITO: MOV TL0,#0B0H ;重新装入时间常数 MOV TH0,#3CH DJNZ R7,LOOP ;循环10次 CLR TR0 ; 500ms定时到了,停止T0工作 LOOP: RETI ;中断返回 END ;程序结束
第7章 定时器/计数器 7.5实例解析 【实例7-2】利用定时器/计数器,测定如图所示波形的一个周期长度。
第7章 定时器/计数器 7.5实例解析 解析:这里利用门控位GATE启动定时器的方法。设如图示定时器/计数器T0为定时器,为高电平时,启动定时器;定时器/计数器T1为计数器,T1的电平由1到0,计数器计数。 (1)定时器设置 当每秒脉冲数低于3个时,每个脉冲周期330ms左右,故而设置定时器的基本定时为100ms,可以满足测时的精度要求。因此,采用门控方式,触发启动定时器;采用方式1,16位计数器。
第7章 定时器/计数器 7.5实例解析 定时器T0的TMOD的设置: 控制字为9H 时间常数计算:晶体振荡器为6MHz,基本定时时间为100ms,机器周期Tc为 设置初值为x: x=216-50000=15536=3CB0H 预置:(TH0)=3CH,(TL0)=0B0H
第7章 定时器/计数器 7.5实例解析 (2)计数器设置 定时器/计数器T1为计数器。计数值为2,当计数1时,启动定时器;当计数2时,中断计数器T1,并停止定时器T0的定时;中断方式,其优先级高于定时器T0。 计数器T1的TMOD的设置: 控制字为5H。 计数器初值为:FFFEH, 预置:(TH1)=0FFH,(TL0)=0FEH。
第7章 定时器/计数器 (3)编 程 ORG 0000H AJMP MAIN ORG 000BH ;T0的中断入口 AJMP TIME0 ; 转入中断程序 ORG 001BH ;T1的中断入口 AJMP TIME1 ;转入中断程序 ORG 0033H MAIN: MOV SP,#60H ;设置堆栈指针初值 MOV R3,#0 ;清除软件计数器 SETB P3.2 ;将P3.2,P3.5置1,即为输入状态 SETB P3.5 MOV TMOD,#59H MOV TH0,#3CH ;装入定时器初值 MOV TL0,#0B0H MOV TH1,#0FFH ;装入计数器初值 MOV TL1,#0FEH SETB TR0 ;启动定时器、计数器
第7章 定时器/计数器 SETB TR1 MOV IP,#08H ;T0中断优先于T1 SETB ET1 ;允许T1中断 SETB TF1 ;设TF0、TF1为中断标志 LOOP:SETB TF0 SETB ET0 ;允许T0中断 SETB EA ;中断开放 JB TF0,$ ;判断TF0是否溢出,并一直等待 JB TF1,LOOP ;判断TF1是否溢出,如果溢出就转到LOOP RET TIME0:MOV TL0,#0B0H ;设TL0初值 MOV TH0,#3CH ;设TH0初值 INC R3 ;计数器加1 CPL TF0 ;TF0取反 RETI ;中断返回 TIME1:CLR TF0 ;清除中断标志 CLR TF1 CLR ET0 ;禁止T0、T1中断 CLR ET1 CLR EA ;关中断 RETI ;中断返回
第7章 定时器/计数器 7.5实例解析 本程序占用T0、T1,溢出标志TF0,TF1及寄存器R3。R3 x 100 ms即为周期长度,因此可测的最大周期长度为256×100ms=25.6s。