第6章 单片机原理及接口技术讲稿第三版李朝青.docx
《第6章 单片机原理及接口技术讲稿第三版李朝青.docx》由会员分享,可在线阅读,更多相关《第6章 单片机原理及接口技术讲稿第三版李朝青.docx(22页珍藏版)》请在冰豆网上搜索。
第6章单片机原理及接口技术讲稿第三版李朝青
第6章定时器及应用
§6.1定时器概述
§6.1.18051定时器结构
8051定时器的结构如图6-1所示。
图6-189C51定时器
有两个16位的定时器/计数器,即定时器0(T0)和定时器1(T1)。
它们实际上都是16位加1计数器。
T0由两个8位特殊功能寄存器TH0和TL0构成;T1由TH1和TL1构成。
§6.1.28051定时器功能
每个定时器都可由软件设置为定时工作方式或计数工作方式及其他灵活多样的可控功能方式。
这些功能由特殊功能寄存器TMOD和TCON所控制。
定时器工作不占用CPU时间,除非定时器/计数器溢出,才能中断CPU的当前操作。
每个定时器/计数器还有四种工作模式。
其中模式0-2对T0和T1是一样的,模式3对两者不同。
定时工作方式
定时器计数8051片内振荡器输出经12分频后的脉冲,即每个机器周期使定时器(T0或T1)的数值加1直至计满溢出。
当8051采用12MHz晶振时,一个机器周期为1μs,计数频率为1MHz。
计数工作方式
通过引脚T0(P3.4)和T1(P3.5)对外部脉冲信号计数。
当输入脉冲信号产生由1至0的下降沿时定时器的值加1。
CPU检测一个1至0的跳变需要两个机器周期,故最高计数频率为振荡频率的1/24。
为了确保某个电平在变化之前被采样一次,要求电平保持时间至少是一个完整的机器周期。
对输入脉冲信号的基本要求如图6-2所示。
§6.2定时器的控制
§6.2.1工作模式寄存器TMOD
TMOD用于控制T0和T1的工作模式。
TMOD不能位寻址,只能用字节设置定时器的工作模式,低半字节设置T0,高半字节设置T1。
8051系统复位时,TMOD的所有位被清0。
TMOD各位的定义格式如图6-3所示。
TMOD各位定义及具体的意义归纳如图6-4所示。
①M1和M0—操作模式控制位。
两位可形成四种编码,对应于四种模式。
见表6-1。
M1M0
工作模式
功能描述
00
模式0
13位计数器
01
模式1
16位计数器
10
模式2
自动再装入8位计数器
11
模式3
定时器0:
分成二个8位计数器
定时器1:
停止计数
②C/T—计数器/定时器方式选择位。
C/T=0,设置为定时方式。
定时器计数8051片内脉冲,即对机器周期计数。
C/T=1,设置为计数方式。
计数器的输入来自T0(P3.4)或T1(P3.5)端的外部脉冲。
③GATE—门控位。
GATE=0,只要用软件使TR0(或TR1)置1就可以启动定时器,而不管INT0(或INT1)的电平是高还是低。
GATE=1,只有INT0(或INT1)引脚为高电平且由软件使TR0(或TR1)置1时,才能启动定时器工作。
§6.2.2控制器寄存器TCON
TCON除可字节寻址外,各位还可位寻址。
8051系统复位时,TCON的所有位被清0。
TCON各位的定义格式如图6-5所示。
TCON各位定义及具体的意义归纳如图6-6所示。
①TF1(TCON.7)—T1溢出标志位。
当T1溢出时,由硬件自动使中断触发器TF1置1,并CPU申请中断。
当CPU响应中断进入中断服务程序后,TF1由被硬件自动清0。
TF1也可以用软件清0。
②TF0(TCON.5)—T0溢出标志位。
其功能和操作情况同TF1。
③TR1(TCON.6)—T1运行控制位。
可通过软件置1(TR1=1)或清0(TR1=0)来启动或关闭T1。
在程序中用指令“SETBTR1”使TR1位置1,定时器T1便开始计数。
④TR0(TCON.4)—T0运行控制位。
其功能和操作情况同TR1。
⑤IE1,IT1,IE0,IT0(TCON.3~TCON.0)—外部中断INT1,INT0请求及请求方式控制位。
前一章已经讲过。
§6.3定时器的四种模式及应用
§6.3.1模式0及其应用
一、模式0的逻辑电路结构
T0在模式0的逻辑电路结构如图所示。
(T1相同)
二、模式0工作特点
在这种模式下,16位寄存器(TH0和TL0)只用了13位。
其中TL0的高3位未用,其余5位为整个13位的低5为,TH0占高8位。
当TL0的低5位溢出时,向TH0进位;TH0溢出时,向中断标志TF0进位(硬件置位TF0),并申请中断。
定时时间为:
t=(213-T0初值)×振荡周期×12
三、模式0的应用举例(例6-1)
例6-1:
设定时器T0选择工作模式0,定时时间为1ms,fosc=6MHz。
试确定T0初值,计算最大定时时间T。
解:
当T0处于工作模式0时,加1计数器为13位。
(1)试确定T0初值
设T0的初值位X。
则:
(213-X)×1/6×10-6×12=1×10-3s
X=7692D=1111000001100B
T0的低5位:
01100B=0CH即(TL0)=0CH
T0的高8位:
11110000B=F0H即(TH0)=F0H
(2)计算最大定时时间T
T0的最大定时时间对应于13位计数器T0的各位全为1,即(TL0)=1FH,(TH0)=FFH.
则:
T=213×1/6×10-6×12=16.384ms
三、模式0的应用举例(例6-2)
例6-2:
设T0工作在模式0,定时时间为1ms,fosc=6MHz。
编程实现其定时功能。
定时时间到,P1.0取反。
解:
(1)计算T0初值X
计算步骤见例6-1。
结果:
(TH0)=0F0H,(TL0)=0CH。
(2)程序清单:
初始化引导程序
ORG0000H
RESET:
AJMPMAIN;跳过中断服务程序区
ORG000BH;中断服务程序入口
AJMPITOP
主程序:
ORG0100H
MAIN:
MOVSP,#60H;设堆栈指针
ACALLPTOMD
HERE:
AJMPHERE;等待时间到,转入中断服务程序
PTOMD:
MOVTMOD,#00H;选择工作模式
MOVTL0,#0CH;送初值
MOVTH0,#0F0H
SETBTR0;启动定时
SETBET0;T0开中断
SETBEA;CPU开中断
RET
中断服务程序
ORG0120H
ITOP:
MOVTL0,#0CH;重新装如初值
MOVTH0,#0F0H
CPLP1.0;P1.0取反
RETI
三、模式0的应用举例(例6-3)
例6-3:
利用T0的工作模式0产生1ms定时,在P1.0引脚输出周期为2ms的方波。
设单片机晶振频率fosc=12MHz。
编程实现其功能。
解:
要在P1.0引脚输出周期为2ms的方波,只要使P1.0每隔1ms取反一次即可。
(1)选择工作模式
T0的模式字为TMOD=00H,即
M1M0=00,C/T=0,GATE=0,其余位为0。
(2)计算1ms定时时T0的初值
(213-X)×1/12×10-6×12=1×10-3s
X=7193D=1110000011000B
T0的低5位:
11000B=18H即(TL0)=18H
T0的高8位:
11100000B=E0H即(TH0)=E0H
(3)采用查询方式的程序
程序清单:
MOVTMOD,#00H;设置T0为模式0
MOVTL0,#18H;送初值
MOVTH0,#0E0H
SETBTR0;启动定时
LOOP:
JBCTF0,NEXT;查询定时时间到否
SJMPLOOP
NEXT:
MOVTL0,#18H;重装计数初值
MOVTH0,#0E0H
CPLP1.0;取反
SJMPLOOP;重复循环
(4)采用定时器溢出中断方式的程序
程序清单:
主程序
ORG0000H
RESET:
AJMPMAIN;跳过中断服务程序区
ORG0030H
MAIN:
MOVTMOD,#00H;设置T0为模式0
MOVTL0,#18H;送初值
MOVTH0,#0E0H
SETBEA;CPU开中断
SETBET0;T0中断允许
SETBTR0;启动定时
HERE:
SJMPHERE;等待中断,虚拟主程序
中断服务程序
ORG000BH
AJMPCTC0
ORG0120H
CTC0:
MOVTL0,#18H;重新装如初值
MOVTH0,#0E0H
CPLP1.0;P1.0取反
RETI
§6.3.2模式1及其应用
一、模式1的逻辑电路结构
T0在模式1的逻辑电路结构如图6-7所示。
(T1相同)
二、模式1工作特点
该模式对应的是一个16位的定时器/计数器。
用于定时工作方式时,定时时间为:
t=(216-T0初值)×振荡周期×12
用于计数工作方式时,计数长度最大为:
216=65536(个外部脉冲)
三、模式1的应用举例(例6-4)
例6-4:
用定时器T1产生一个50Hz的方波,由P1.1输出。
,使用程序查询方式,fosc=6MHz。
解:
∵方波周期T=1/50=0.02s=20ms
∴用T1定时10ms
计数初值X为:
X=216-12×10×1000/12
=65536-10000=55536=D8F0H
源程序清单:
MOVTMOD,#10H;设置T1为模式1
SETBTR1;启动定时
LOOP:
MOVTL1,#0D8H;送初值
MOVTH1,#0F0H
JNBTF1,$;查询定时时间到否
CLRTF1;产生溢出,清标志位
CPLP1.1;取反
SJMPLOOP;重复循环
§6.3.3模式2及其应用
一、模式2的逻辑电路结构
T0在模式2的逻辑电路结构如图6-8所示。
(T1相同)
TL0计数溢出时,不仅使溢出中断标志位TF0置1,而且还自动把TH0中的内容重新装载到TL0中。
TL0用作8位计数器,TH0用以保存初值。
二、模式2工作特点
该模式把TL0(TL1)配置成一个可以自动重装载的8位定时器/计数器。
在程序初始化时,TL0和TH0由软件赋予相同的初值。
用于定时工作方式时,定时时间为:
t=(28-TH0初值)×振荡周期×12
用于计数工作方式时,计数长度最大为:
28=256(个外部脉冲)
该模式可省去软件中重装常数的语句,并可产生相当精确的定时时间,适合于作串行口波特率发生器。
三、模式2的应用举例(例6-5)
例6-5:
当P3.4引脚上的电平发生负跳变时,从P1.0输出一个500μs的同步脉冲。
请编程序实现该功能。
查询方式,fosc=6MHz。
解:
(1)模式选择
选T0为模式2,外部事件计数方式。
当P3.4引脚上的电平发生负跳变时,T0计数器加1,溢出标志TF0置1;然后改变T0为500μs定时工作方式,并使P1.0输出由1变为0。
T0定时到产生溢出,使P1.0输出恢复高电平,T0又恢复外部事件计数方式。
如图6-9所示。
(2)计算初值
T0工作在外部事件计数方式,当计数到28时,再加1计数器就会溢出。
设计数初值为X,当再出现一次外部事件时,计数器溢出。
则:
X+1=28
X=28-1=11111111B=0FFH
T0工作在定时工作方式,设晶振频率为6MHz,500μs相当于250个机器周期。
因此,初值X为
(28-X)×2μs=500μs
X=6=06H
(3)程序清单
START:
MOVTMOD,#06H;设置T0为模式2,外部计数方式
MOVTL0,#0FFH;T0计数器初值
MOVTH0,#0FFH
SETBTR0;启动T0计数
LOOP1:
JBCTF0,PTFO1;查询T0溢出标志,
;TF0=1时转,且清TF0=0
SJMPLOOP1;
PTFO1:
CLRTR0;停止计数
MOVTMOD,#02H;设置T0为模式2,定时方式
MOVTL0,#06H;送初值,定时500μs
MOVTH0,#06H
CLRP1.0;P1.0清0
SETBTR0;启动定时500μs
LOOP2:
JBCTF0,PTFO2;查询T0溢出标志,
;TF0=1时转,且清TF0=0
;(第一个500μs到否?
)
SJMPLOOP2;等待中断,虚拟主程序
PTFO2:
SETBP1.0;P1.0置1
CLRTR0;停止计数
SJMPSTART
三、模式2的应用举例(例6-6)
例6-6:
利用定时器T1的模式2对外部信号计数。
要求没计满100次,将P1.0端取反。
解:
(1)选择模式
外部信号由T1(P3.5)引脚输入,每发生一次负跳变计数器加1,每输入100个脉冲,计数器发生溢出中断,中断服务程序将P1.0取反一次。
T1计数工作方式模式2的模式字为
(TMOD)=60H。
T0不用时,TMOD的低4位可任取,但不能进入模式3,一般取0。
(2)计算T1的计数初值
X=28-100=156=9CH
因此:
TL1的初值为9CH,
重装初值寄存器TH1=9CH。
(3)程序清单
MAIN:
MOVTMOD,#60H;设置T1为模式2,外部计数方式
MOVTL1,#9CH;T1计数器初值
MOVTH1,#9CH
MOVIE,#88H;定时器开中断
SETBTR1;启动T1计数
HERE:
SJMPHERE;等待中断
ORG001BH;中断服务程序入口
CPLP1.0
RETI
§6.3.4模式3及其应用
一、模式3的逻辑电路结构
1、T0模式3的逻辑电路结构
T0模式3的逻辑电路结构如图6-10所示。
T0设置为模式3,TL0和TH0被分成两个相互独立的8位计数器。
TL0用原T0的各控制位、引脚和中断源,即C/T,GATE,TR0,TF0,T0(P3.4)引脚,INT0(P3.2)引脚。
TL0可工作在定时器方式和计数器方式。
其功能和操作与模式0、模式1相同(只是8位)。
它占用了定时器T1的控制位TR1和T1的中断标志TF1,其启动和关闭仅受TR1的控制。
TH0只可用作简单的内部定时功能。
2、T0模式3下T1的逻辑电路结构
定时器T1无工作模式3状态。
在T0用作模式3时,T1仍可设置为模式0~2。
T0模式3下T1的逻辑电路结构如图6-12所示。
由于TR1和TF1被定时器T0占用,计数器开关K已被接通,此时,仅用T1控制位,C/T切换其定时或计数器工作方式就可使T1运行。
当计数器溢出时,只能将输出送入串行口或用于不需要中断的场合。
一般作波特率发生器
二、模式3的应用举例(例6-7)
例6-7:
设某用户系统已使用了两个外部中断源,并置定时器T1工作在模式2,作串行口波特率发生器用。
现要求再增加一个外部中断源,并由P1.0引脚输出一个5kHz的方波。
Fosc=12MHz.
解:
(1)工作模式
可设置T0工作在模式3计数器方式,把T0的引脚作附加的外部中断输入端,TL0的计数初值为FFH,当检测到T0引脚电平出现由1至0的负跳变时,TL0产生溢出,申请中断。
T0模式3下,TL0作计数用,而TH0用作8位的定时器,定时控制P1.0引脚输出5kHz的方波信号。
(2)计算初值
TL0的计数初值为FFH。
TH0的计数初值X为:
P1.0方波周期T=1/(5kHz)=0.2ms=200μs
用TH0作定时100μs时,
X=256-100×12/12=156
(3)程序清单
MOVTMOD,#27H;T0为模式3,计数方式
;T1为模式2,定时方式
MOVTL0,#0FFH;TL0计数初值
MOVTH0,#156;TH0计数初值
MOVTL1,#data;data是根据波特率
;要求设置的常数(初值)
MOVTH1,#data
MOVTCON,#55H;外中断0,外中断1边沿触发,
;启动T0,T1
MOVIE,#9FH;开放全部中断
…
TL0溢出中断服务程序(由000BH转来)
TL0INT:
MOVTL0,#0FFH;TL0重赋初值
(中断处理)
RETI
TH0溢出
TH0溢出中断服务程序(由001BH转来)
TH0INT:
MOVTH0,#156;TH0重赋初值
CPLP1.0;P1.0取反输出
RETI
串行口及外部中断0,外部中断1的服务程序略。
§6.3.5综合应用举例(例6-8)
例6-8:
设时钟频率为6MHz。
编写利用T0产生1s定时的程序。
解:
(1)定时器T0工作模式的确定
∵模式0最长可定时16.384ms;
模式1最长可定时131.072ms;
模式2最长可定时512μs;
∴定时1s,可选用模式1,每隔100ms中断一次,中断10次为1s。
(2)求计数器初值X
∵(216-X)×12/(6×106)=100×10-3s
∴X=15536=3CB0H
因此:
(TL0)=0B0H
(TH0)=3CH
(3)实现方法
对于中断10次计数,可使T0工作在计数方式,也可用循环程序的方法实现。
本例采用循环程序法。
(4)源程序清单
ORG0000H
AJMPMAIN;上电,转向主程序
ORG000BH;T0的中断服务程序入口地址
AJMPSERVE;转向中断服务程序
ORG2000H;主程序
MAIN:
MOVSP,#60H;设堆栈指针
MOVB,#0AH;设循环次数
MOVTMOD,#01H;设置T0工作于模式1
MOVTL0,#0B0H;装计数值低8位
MOVTH0,#3CH;装计数值高8位
SETBTR0;启动定时
SETBET0;T0开中断
SETBEA;CPU开中断
SJMP$;等待中断
SERVE:
MOVTL0,#0B0H;重新赋初值
MOVTH0,#3CH
DJNZB,LOOP;B-1不为0,继续定时
CLRTR0;1s定时到,停止T0工作
LOOP:
RETI;中断返回
END
§6.3.5综合应用举例(例6-9)
例6-9:
设计实时时钟程序。
时钟就是以秒、分、时为单位进行计时。
用定时器与中断的联合应用。
解:
(1)实现时钟计时的基本方法
①计算计数初值。
时钟计时的最小单位是秒,但使用单片机定时器/计数器进行定时,即使按方式1工作,其最大定时时间也只能达131ms。
因此,可把定时器的定时时间定为100ms,计数溢出10次即得到时钟计时的最小单位—秒;而10次计数可用软件方法实现。
假定使用定时器T0,以工作模式1进行100ms的定时。
如fosc=6MHz,则计数初值X为:
∵(216-X)×12/(6×106)=100×10-3s
∴X=15536=3CB0H
因此:
(TL0)=0B0H
(TH0)=3CH
②采用定时方式进行溢出次数的累计,计满10次即得到秒计时。
③从秒到分和从分到时的计时是通过累计和数值比较实现的。
④时钟显示即及显示缓冲区部分在这里略,可自行设计。
(2)程序流程及程序清单
①主程序(MAIN)的主要功能
是进行定时器T1的初始化编程并启动T1,然后通过反复调用显示子程序,等待100ms定时中断的到来。
其流程如图6-13所示。
②中断服务程序(PITO)的主要功能
是进行计时操作。
程序开始先判断计数溢出时候满了10次,不满表明还没达到最小计时单位—秒,中断返回;如满10次则表示已达到最小计时单位—秒,,程序继续向下运行,进行计时操作。
要求满1秒则“秒位”32H单元内容加1,满60s则“分位”31H单元内容加1,满60min则“时位”30H单元内容加1,满24h则30H,31H,332H单元内容全部清0。
中断服务程序流程如图6-14所示。
③源程序如下:
ORG0000H
AJMPMAIN;上电,转向主程序
ORG001BH;T1的中断服务程序入口地址
AJMPSERVE;转向中断服务程序
ORG2000H;主程序
MAIN:
MOVSP,#60H;设堆栈指针
MOVTMOD,#10H;设置T1工作于模式1
MOV20H,#0AH;设循环次数
CLRA
MOV30H,A;时单元清0
MOV31H,A;分单元清0
MOV32H,A;秒单元清0
SETBET1;T1开中断
SETBEA;CPU开中断
MOVTL1,#0B0H;装计数值低8位
MOVTH1,#3CH;装计数值高8位
SETBTR1;启动定时
SJMP$;等待中断(可反复调用显示子程序)
SERVE:
PUSHPSW;保护现场
PUSHACC
MOVTL1,#0B0H;重新赋初值
MOVTH1,#3CH
DJNZ20H,RETUNT;1s未到,返回
MOV20H,#0AH;重置中断次数
MOVA,#01H
ADDA,32H;“秒位”加1
DAA;转换为BCD码
MOV32H,A
CJNEA,#60H,RETUNT;未满60s,返回
MOV32H,#00H;计满60s,“秒位”清0
MOVA,#01H
ADDA,31H;“分位”加1
DAA;转换为BCD码
MOV31H,A
CJNEA,#60H,RETUNT;未满60min,返回
MOV31H,#00H;计满60min,“分位”清0
MOVA,#01H
ADDA,30H;“时位”加1
DAA;转换为BCD码
MOV30H,A
CJNEA,#24H,RETUNT;未满24h,返回
MOV30H,#00H;计满24h,“时位”清0
RETUNT:
POPACC;恢复现场
POPPSW
RETI;中断返回
END