登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[寒假笔记] (虽迟但到)单片机定时器的应用

[复制链接]
发表于 2018-1-26 23:30:10 | 显示全部楼层 |阅读模式
学习笔记
学习科目: 单片机定时器
学习安排: 《手把手教你学51单片机》第五章
开始时间: 2018-01-26
结束时间: 2018-01-26
今天发的有些晚了,虽然我会迟到,但是我一定来的改了个ID感觉整个人都好多了,在这里感谢@如果让他嘎斯 学长的80铜币赞助,圆了我的重新做人梦。新ID翻译为“蓝书签”,也希望我能像一个书签一样,伴随你的寒假学习,那么开始我今天的学习笔记分享。今天我主要学习了单片机中定时器的应用,在学习定时器之前,我们先来了解逻辑电路中的一些逻辑运算符号(上学期培训曾经讲到过,大家可以对照图片加深理解和记忆) QQ截图20180126225725.png QQ截图20180126225825.png
认识了这些基本的逻辑电路运算符之后我们来了解学习定时器要用到的的基本概念:
1.时钟周期:时钟周期 T 是时序中最小的时间单位,具体计算的方法就是 1/时钟源频率,我们的单片机开发板上用的晶振是32M(如果不对请下方评论指出),那么对于我们这个单片机系统来说,时钟周期=1/32000000 秒。
2.机器周期:我们的单片机完成一个操作的最短时间。机器周期主要针对汇编语言而言,在汇编语言下程序的每一条语句执行所使用的时间都是机器周期的整数倍,而且语句占用的时间是可以计算出来的,而 C 语言一条语句的时间是不确定的,受到诸多因素的影响。 51单片机系列,在其标准架构下一个机器周期是 12 个时钟周期,也就是 12/32000000秒。

这两个概念了解即可,下边就来我们的重头戏,定时器和计数器。定时器和计数器是单片机内部的同一个模块,通过配置 SFR(特殊功能寄存器)可以实现两种不同的功能,我们大多数情况下是使用定时器功能。顾名思义,定时器就是用来进行定时的。定时器内部有一个寄存器,我们让它开始计数后,这个寄存器的值每经过一个机器周期就会自动加 1,因此,我们可以把机器周期理解为定时器的计数周期。就像我们的钟表,每经过一秒,数字自动加 1,而这个定时器就是每过一个机器周期的时间,也就是 12/32000000秒,数字自动加 1。还有一个特别注意的地方,就是钟表是加到 60 后,秒就自动变成 0 了,这种情况在单片机或计算机里我们称之为溢出。那定时器加到多少才会溢出呢?后面会讲到定时器有多种工作模式,分别使用不同的位宽(指使用多少个二进制位),假如是 16 位的定时器,也就是 2 个字节,最大值就是 65535,那么加到 65535 后,再加 1 就算溢出,如果有其他位数的话,道理是一样的,对于我们的单片机来说,溢出后,这个值会直接变成 0。从某一个初始值开始,经过确定的时间后溢出,这个过程就是定时的含义。
标准的 51 单片机内部有 T0 和 T1 这两个定时器 QQ截图20180126231034.png 每个定时器都分为高低字节。另外再介绍控制寄存器TCON QQ截图20180126231138.png 大家注意在表中的描述中,只要写到硬件置 1 或者清 0 的,就是指一旦符合条件,单片机将自动完成的动作,只要写软件置 1 或者清 0 的,是指我们必须用程序去完成这个动作,其中有 TF1、 TR1、 TF0、 TR0 这 4 位需要我们理解清楚,它们分别对应于 T1 和 T0,我们以定时器 1 为例讲解,那么定时器 0 同理。先看 TR1,当我们程序中写 TR1 = 1 以后,定时器值就会每经过一个机器周期自动加 1,当我们程序中写 TR1 = 0以后,定时器就会停止加 1,其值会保持不化。TF1,这个是一个标志位,他的作用是告诉我们定时器溢出了。比如我们的定时器设置成 16 位的模式,那么每经过一个机器周期, TL1加 1 一次,当 TL1 加到 255 后,再加 1, TL1 变成 0, TH1 会加 1 一次,如此一直加到TH1
和 TL1 都是 255(即 TH1 和 TL1 组成的 16 位整型数为 65535)以后,再加 1 一次,就会溢出了, TH1 和 TL1 同时都变为 0,只要一溢出, TF1 马上自动变成 1,告诉我们定时器溢出了,仅仅是提供给我们一个信号,让我们知道定时器溢出了,它不会对定时器是否继续运行产生任何影响。
最后我们来认识定时器的工作模式(TMOD),分为以下四种 QQ截图20180126231621.png ,通过百度 QQ截图20180126224159.png 我们知道这四种工作模式在程序中的16进制表示,其中模式 0 是为了兼容老的 8048 系列单片机而设计的,现在的 51 几乎不会用到这种模式,而模式 3 它的功能用模式 2 完全可以取代,所以基本上也是不用的,那么我们就重点来认识模式 1 和模式 2。
模式 1,是 THn 和 TLn 组成了一个 16 位的定时器,计数范围是 0~65535,溢出后,只要不对 THn 和 TLn 重新赋值,则从 0 开始计数。模式 2,是 8 位自动重装载模式,只有 TLn做加 1 计数,计数范围 0~255, THn 的值并不发生变化,而是保持原值, TLn 溢出后, TFn就直接置 1 了,并且 THn 原先的值直接赋给 TLn,然后 TLn 从新赋值的这个数字开始计数。(n为0或者1,对应刚刚的T0.T1)
最后就是定时器的应用部分了,在使用定时器的时候,需要以下几个步骤:
第一步:设置特殊功能寄存器 TMOD,配置好工作模式。
第二步:设置计数寄存器 TH0 和 TL0 的初值。
第三步:设置 TCON,通过 TR0 置 1 来让定时器开始计数。
第四步:判断 TCON 寄存器的 TF0 位,监测定时器溢出情况。
写程序之前,我们要先来学会计算如何用定时器定时时间。我们的晶振是32M,时钟周期就是 1/11059200,机器周期是 12/32000000,假如要定时 20ms,就是 0.02 秒,要经过x 个机器周期得到 0.02 秒,我们来算一下 x*12/11059200=0.02,得到 x= 53333。 16 位定时器的溢出值是 65536(因 65535 再加 1 才是溢出),于是我们就可以这样操作,先给 TH0 和 TL0一个初始值,让它们经过53333个机器周期后刚好达到 65536,也就是溢出,溢出后可以通过检测 TF0 的值得知,就刚好是 0.02 秒。那么初值 y = 65536 - 53333= 12202,转成 16 进制就是 0x2faa,也就是 TH0 = 0x2f, TL0 = 0xaa。
接下来我们利用定时器设计一个程序,这个程序实现的结果是开发板上一个小灯点亮一秒,熄灭一秒,也就是以 0.5Hz 的频率进行闪烁。 QQ截图20180126232707.png 哪个地方看不明白欢迎来下方评论区交流讨论,我有什么写错的地方也欢迎大家指出,那么今天的笔记分享到此结束,希望大家看过能够学到很多。

评分

参与人数 2铜板 +200 收起 理由
alpha + 100 bug反馈奖励
AlphaSkyate + 100 赞助修改用户名

查看全部评分

好懒~~不想说~~~
 楼主| 发表于 2018-1-26 23:53:53 | 显示全部楼层
名字刚改完又变回来了,突然难受
好懒~~不想说~~~
发表于 2018-1-27 09:25:03 | 显示全部楼层
bht3090336236 发表于 2018-1-26 23:53
名字刚改完又变回来了,突然难受

你再试试,可能修改用户名的系统有问题
该会员没有填写今日想说内容.
 楼主| 发表于 2018-1-27 10:09:39 | 显示全部楼层
alpha 发表于 2018-1-27 09:25
你再试试,可能修改用户名的系统有问题

改名需要90铜币,上次改花光了,另外反馈两个bug,手机版的点击用户名修改一直进入首页页面(如图),还有就是手机号绑定,绑上去没用,我绑了3次了,每次发电开社区之前他都会说让我绑定一次手机号。
100938uvku8sbk07cn87cg.jpg
100938hdjjpoj6sjzqpudo.jpg
好懒~~不想说~~~
发表于 2018-1-27 17:41:03 | 显示全部楼层
OK,我近期来测试一下
该会员没有填写今日想说内容.
发表于 2018-1-27 18:33:27 | 显示全部楼层
应该是服务器缓存未更新,我清理了一下就好了
该会员没有填写今日想说内容.
发表于 2018-1-27 18:48:18 | 显示全部楼层
alpha 发表于 2018-1-27 18:33
应该是服务器缓存未更新,我清理了一下就好了

我贴子发不出去怎么回事。。
好懒~~不想说~~~
发表于 2018-1-27 18:59:46 | 显示全部楼层
青い栞 发表于 2018-1-27 18:48
我贴子发不出去怎么回事。。

不会吧。。。你把账号私信给我,我试试
该会员没有填写今日想说内容.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表