实验五 定时器实验
一、实验目的
-
学习定时器的工作原理及使用方法。
-
学习定时器的初始化程序、应用程序的编写和调试。
二、实验仪器
- Keil5
- 普中A2开发板
- stc-isp
三、实验内容
数码管间隔一秒循环显示0-F,一秒的时间要求采用内部定时器T0。
四、流程框图
五、实验程序
ORG 0000H
AJMP START
ORG 000BH
AJMP T0_INT
ORG 0030H
START: ;系统初始化
MOV R0 , #00H ;R0作为TO中断计数器
MOV R1 , #00H ;R1存储显示数字
MOV DPTR, #TAB1 ;指向字形码表首地址
MOV A , #00H ;初始化数码管显示0
MOVC A , @A+DPTR ;取字形码
MOV P0 , A ;数码管显示0
ANL TMOD, #0F0H ;初始化定时器0
ORL TMOD, #01H ;设置定时器0工作方式1
MOV TL0 , #00H ;设置定时器初值 50ms
MOV TH0 , #4CH ;设置定时器初值
CLR TF0 ;清除TF0标志
SETB TR0 ;定时器0开始计时
SETB ET0 ;开启T0溢出中断
SETB EA ;开启总中断
KEEP:
SJMP KEEP ;等待定时器0中断
T0_INT:
MOV TL0 , #00H ;重装定时器初值 50ms
MOV TH0 , #4CH ;重装定时器初值
INC R0 ;R0加1
CJNE R0 , #20 ,RETURN ;判断是否到达1s
MOV R0 , #00H ;R0清0
INC R1 ;显示值加1
CJNE R1 , #10H,SC ;判断R1是否到了16,到了则置0进行循环
MOV R1 , #0 ;R1置0
SC:
MOV A , R1 ;
MOVC A , @A+DPTR ;
MOV P0 , A ;
RETI
RETURN:
RETI
TAB1:;0 - F共阴极字形码
DB 03FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;0-9
DB 77H,7CH,39H,5EH,79H,71H
END
六、程序分析
使用定时器0计时50ms,每50ms进入一次定时器0中断服务函数
使用R0作为T0中断的计数器,每50ms进入中断进行R0+1,若R0等于20,则说明计时1s。
使用R1存储数码管显示的数字,每计时1秒R1+1,若R1等于16,则R1置0,实现0~F循环。
思考题:
阐述定时器几种工作方式所实现的功能及应用时的注意事项。
定时器T0有两种工作模式(计数模式、定时模式)和4种工作方式(方式0,方式1,方式2,方式3)
工作模式
(1)计数模式
计数模式是指对外部事件进行计数,外部事件的发生以输入脉冲来表示,因此计数功能的实质就是对外来脉冲进行计数
(2)定时模式
定时功能也是通过计数来实现的,只不过此时的计数脉冲来自单片机芯片内部,是系统震荡脉冲经12分频后送来的,由于一个机器周期等于12个震荡脉冲周期,所以此时的定时器/计数器是每到一个机器周期就加1,计数频率位震荡脉冲频率的1/12。
工作方式
(1)方式0
为13位计数器,由TL的低5位和TH的在整个8位所构成。TL低5位溢出向TH进位,TH计数溢出则把TCON种的溢出标志位TF置位为1,此时,计数器会清0并暂停工作,待初值重新装入后才又开始工作。
(2)方式1
方式1与方式0基本相同,方式1为16位计数器,由TH作为高8位,TL作为低8位
(3)方式2
为自动恢复初值(初值自动装入)的高8位定时器/计数器,TL作为8位计数器用,TH作为8位常数缓存器,以保存计数初值。当TL计数溢出时,在置1溢出标志TF的同时,还自动将TH中保存的初值送至TL,使TL从初值开始重新计数。
方式2可以省去用户软件中重装初值的指令执行时间,简化定时初值的计算办法,可以相当精确地确定定时时间。
(4)方式3
方式3是为了增加1个附加的8位定时器/计数器提供的,从而使单片机具有三个定时器/计数器。只有定时器/计数器T0能工作于这种方式。
注意事项
初始化定时器时(以初始化定时器0为例),应使用ANL语句而不是MOV语句
ANL TMOD, #0F0H ;初始化定时器0
这样可以将影响定时器0工作方式的标志位清0,且不影响定时器1的工作方式。
再使用ORL语句设置定时器0的工作方式
ORL TMOD, #01H ;设置定时器0工作方式1
如果使用MOV语句,在设置定时器0工作方式的同时会影响定时器1的工作方式。
采用上面两条语句初始化则不需要关心定时器1的工作方式。做到一条语句只办一件事,增强了程序的复用性。
七、测试报告
每隔1秒,数码管显示的值+1,实现0~F循环显示