蓝桥杯单片机竞赛学习计划(五)

蓝桥杯单片机学习计划之定时器

前言

上一节我们学习了矩阵键盘,这一节来学习单片机中最重要的内部资源——定时器。


一、什么是定时器?

定时器,顾名思义就是用来定时的,说的通俗一点,比如我准备去跑步,跑步前需要热身5分钟,那么我把手机打开,然后定时5分钟,定时完后开始热身,这时候定时器就开始计时,计时到5分钟之后会响铃提醒我5分钟到了,热身完毕要开始跑步了,那么这时候我就开始跑步了。单片机中的定时器就是用来定时的,前几节,我们学习LED灯,数码管还有按键,都用到了延时程序,这种延时程序一般是不太准确的,往往会有比较大的误差,而单片机的定时器,是利用内部时钟定时的,所以精准度会很高,这就是定时器的好处,那么下面来具体介绍一下STC15系列单片机的定时器。

二、STC15系列单片机定时器

在这里插入图片描述
那么我们想使用定时器,就得先知道单片机有哪些定时器吧?我们来看下上面这张图,我们竞赛板上的芯片型号属于图中画红圈的系列,一共有三个定时器,分别是定时器0、定时器1和定时器2。定时器学会其中一个,举一反三其他的就都会了,所以这一节我们就来学习一下定时器0。

1.定时器0相关的寄存器

定时器0需要用到的寄存器一共有5个,分别是控制寄存器TCON、模式寄存器TMOD、定时器0高八位寄存器和低八位寄存器TH1、TH0和辅助寄存器AUXR,在下面这张图中我用红圈圈起来来了。
在这里插入图片描述
先来看第一个寄存器TCON,这个寄存器我们只需要关心其中两位,一位是TR0,定时器0的运行控制位,很简单,置1的话就开启定时器0,置零的话就关闭定时器0。第二位是TF0,溢出中断标志位,这一位相当于闹钟,即假如我要定时1ms,开启定时器,定时器开始计时,计时到1ms之后,这一位就会置1,就相当于告诉你定时器1ms已经计时时间到了,这一位置1后,可由中断清零或者软件查询清零,中断下一节再将,本节中我们使用查询清零。
在这里插入图片描述
第二个工作模式寄存器TMOD,高四位时定时器1的,我们不看,只看低四位。第一位GATE,看图中介绍,这一位置一时,只有INT0脚为高电平及TR0控制位置1时才可以打开定时器,相当于除了TR0又多了一个开关,一般情况下是不会用到的,所以这一位置零就可以。第二位C/T位,清零为定时器,置一为计数器,我们肯定是要用定时器,所以清零就可以。剩下两位M1、M0是选择工作模式的,我们这边就使用第一种工作模式,即16位自动重装,所以两位都置零即可。那么这样TMOD的配置就是低四位都为0。
在这里插入图片描述
接下来TH0和TL0先不介绍,后面再介绍,先讲一下辅助寄存器AUXR,关于这个寄存器我们只看第一位T0x12,是定时器0速度控制位,这一位控制着定时器0的计时速度,如果为0,就是传统8051速度,为1,就是传统速度的12倍,我们下面写程序的时候先选择0,传统速度,后面改成12倍速度,观察现象就清楚了。
在这里插入图片描述
到这里和定时器0相关的寄存器就介绍完毕了,现在我们来捋一下思路:我们想要使用定时器,首先要通过AUXR这个寄存器配置定时器的定时速度,然后在配置TMOD这个寄存器选择定时器的工作模式,其次我们需要给TH0和TL0两个定时器赋初值,最后给TR0置1,开启定时器即可。

2.系统时钟

上面没有介绍TH0和TL0,现在我们来介绍一下,定时器是如何定时的呢?
就是利用TH0和TL0定时的,TH0和TL0分别是定时器0的高八位寄存和低八位寄存器,两个一起构成了16位的寄存器,假设都给这两个寄存器赋值0,开启定时器后,经过一个系统时钟,TL0这个寄存器会加1,由于是八位的寄存器,所以加满255后,再来一个系统时钟,就会清零,而TH0会加1,直到TH0和TL0两个寄存器都加满,即65535,这时候再来一个系统时钟,TL0再加1,两个寄存器就会溢出,从而产生一个溢出标志位TF0,表示定时时间到,即TL0这个寄存器加1,表示过了一个系统时钟的时间,那么系统时钟又是多少呢?来看下面这几张图:
在这里插入图片描述
STC15F2K60S2系列的单片机有两个时钟来源,一个是内部高精度RC时钟,另一个是外部时钟,我们的竞赛板上并没有装有外部晶振,所以单片机的时钟只能来自于内部高精度RC时钟。
在这里插入图片描述
我们每次在下载程序的时候,在下载界面,都需要选择运行时的时钟频率,选择完毕后下载程序,这时候单片机的运行时钟就是你所选择的时钟。常用的时钟频率一般选择11.0592MHZ或者12MHZ,这两个时钟其实相差不大,只不过在使用串口的时候,11.0592M更容易获得标准波特率。那么我们这边就统一使用12MHZ的时钟。
在这里插入图片描述
配置完运行时钟(主时钟)后,来看系统时钟,通过CLK_DIV这个寄存器,可以配置系统时钟的频率,这个寄存器默认是为0的,即系统时钟等于主时钟,不分频,我们不去动它,就是用默认的,由于刚才辅助寄存器AUXR选择了传统51的速度,那么还需要除以12,就是1MHZ,那么到此为止定时器的时钟就是1MHZ,也就是说,TL0加1,需要经过1/1000000秒,那么我们想定时1ms,TH0和TL0该怎么算呢?我们已经知道TL0加1,经过1/1000000秒,那么经过1ms,需要加多少个1呢,答案就是0.001×1000000=1000个数,加1000个数,计时1ms,那么TH0和TL0应该放多少初值呢,那就是65536-1000=64536,转成16进制就是TH0=0xFC,TL0=0x18。

3.自动重装模式

再来讲一下自动重装模式,这个很容易理解,假设TH0和TL0都加满了,这时候再来一个时钟,两个寄存器都溢出了,这时候就会利用自动重装模式,将TH0和TL0自动赋初值。
那么到这里,定时器有关内容就讲完了,在来走一遍配置流程:
1.AXUR选择传统8051模式
2.TMOD选择16位自动重装模式
3.TH0和TL0赋初值
4.TR0=1开启定时器
接下来我们开始写程序


三、代码

程序非常简单,都写了注释,实现的功能就是八个LED灯1s亮1s灭。

#include <STC15F2K60S2.H>


void main()
{
	unsigned int cnt_s=0;
	AUXR&=0x7F;//传统8051速度,12分频
	TMOD&=0xF0;//设置为16位自动重装模式
	TH0=0xFC;//定时器0高八位赋初值
	TL0=0x18;//定时器0低八位赋初值
	TR0=1;//打开定时器0
	P2=0x80;//选通LED锁存器
	while(1)
	{
		if(TF0)//T0溢出标志
		{
			TF0=0;//清零标志位
			if(++cnt_s>=1000)//1ms记一次,记1000即1s
			{
				cnt_s=0;//清除计数值
				P0=~P0;//LEd闪烁
			}
		}
	}
}

其实关于定时器的配置代码,有个更方便的方法就是通过下载软件里的定时器计算器直接生成,如下图所示:
在这里插入图片描述
当然新手刚开始不建议这样,最好还是自己敲一遍代码,熟练了之后就没必要再去手打了,直接怎么方便怎么来。

总结

今天简单介绍了一下定时器0的相关内容,通过编写程序利用定时器实现了LED灯的闪烁,下一节将介绍中断的内容以及通过定时器中断来实现数码管动态扫描。

  • 36
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值