第一步:设置特殊功能寄存器tmod,配置工作模式。
步骤2:设置计数寄存器th0和tl0的初始值。
步骤3:设置tcon,并通过将tr0设置为1让计时器开始计数。
步骤4:判断tcon寄存器的tf0位,监控定时器溢出。
在写程序之前,我们应该学习如何用计时器计算时间。我们的晶振是11.0592m,时钟周期是1/11059200,机器周期是12/11059200。如果要计时20毫秒,则为0.02秒..得到0.02秒需要x个机器周期。让s计算x*12/110592000.02,得到x18432。16位定时器的溢出值是65536(因为65535加1就是溢出),所以我们可以这样,先给th0和tl0一个初始值,让它们在18432个机器周期后刚好达到65536,也就是溢出。溢出后通过检测tf0就可以知道,正好是0.02秒。所以初始值y65536-1843247104,转换成十六进制,就是0xb800,也就是th00xb8,tl00x00。
这样,我们做出了0.02秒的计时。细心的同学会发现,如果直接给初始值一个0x0000的值,直到65536溢出,最大定时器计时值大概是71ms,那么如果想计时更长的时间,应该怎么做呢?从你的小学开始学。过多的逻辑和多重关系可以解决这个问题。
好吧,让我们让我们用程序来实现这个功能。
#including
sbitleadsp0^0.
p1^0address
sbitaddress1
sbitaddress2p1^2
sbitaddress3p1^3
sbitenledp1^4
voidmain(){
unsignedcharcnt0//定义一个计数变量来记录t0溢出的次数。
enled0//使能u3,选择独立led。
addr31
addr21
address11
addr00
tmod0x01//将t0设置为模式1。
th00xb8//将初始值0xb800分配给t0。
tl00x00
tr01//开始t0
while(1){
if(tf01){//判断t0是否溢出。
tf00//t0溢出后,清除中断标志。
th00xb8//,并重新分配初始值。
tl00x00
计数//计数值增加1。
if(cnt)50{//判断t0是否溢出50次。
cnt0//达到50次后,计数值清零。
led~led//led取反:0-》1、1-》0
}
}
}
}
笔记写在程序里。分析前面几章的内容就不难理解了。这个程序的结果是开发板最右边的灯亮一秒,灭一秒,也就是以0.5hz的频率闪烁。
●打开时钟app,点击右下角【计时器】,进入计时器界面;
●上下滑动时间选项选择计时时间。
设置好定时器后,点击右下角的【铃声】。
选择提醒铃,然后返回定时器界面。
点击底部的[开始]按钮进入定时器。
点击左下角的【刷新】按钮,重置计时。