2019-10-08定时器

1.定时器介绍

1.1、什么是定时器

(1)Soc(单片机)的一种内部外设
(2)定时器就是CPU的“闹钟”

1.2、什么是计数器

(1)定时器就是用计数的原始实现的
(2)计数器可以计算外部脉冲个数

1.3、定时器如何工作

(1)第1步:先设置好定时器的时钟源(如果需要的话)
(2)第2步:初始化时钟相关寄存器
(3)第3步:设置定时时间(计数个数)
(4)第4步:设置中断处理程序
(5)第5步:打开定时器
(6)运行时:定时器计数到后产生中断,然后执行中断isr。

2.软件控制硬件的关键——寄存器

2.1、什么是寄存器

(1)register
(2)寄存器,寄存,内容可变,一般按位定义。也就是内容要么是1要么是0.
(3)寄存器使用地址访问,编程上像内存一样

2.2、寄存器的工作原理

(1)寄存器和硬件之间有双向影响。寄存器位上的1/0可以控制LED亮灭,键盘的按下也可以改变寄存器位上的1/0。
(2)软件可以读写寄存器
(3)总结:寄存器时软件能够控制硬件的关键

2.3、单片机学习的关键就是各种寄存器

(1)单片机的学习主要包括2个:CPU和各种内部外设
(2)各种内部外设的编程接口就是寄存器
(3)熟悉一款单片机其实就是熟悉他的寄存器
(4)寄存器会随着单片机的复杂化而变得复杂
(5)学会用C语言操作寄存器的技巧

3.51单片机的定时器简介

看数据手册
外部12MHZ晶振,单片机工作在12T模式下,则内部时钟频率是1MHZ,则时钟脉冲宽度为1us(1/1MHZ=1us)。外部12MHZ晶振,单片机工作在6T模式下,则内部时钟频率是2MHZ,则时钟脉冲宽度为1us(1/2MHZ=0.5us)。

4.定时器的主要寄存器介绍

4.1、TCON

TCON

(1)8个位,但是有4个名字:TF、TR、IE、IT,每个名字的符号都有2个,后面分别带0和1,对应T0和T1.
(2)TF:timer flag,定时器(溢出)标志位,是只读(软件只是通过读取TF1来知道硬件的状态,而不用去写这一位来设置硬件的状态)的。timer定时时间到了后会做2件事情:第一个是把TF标志改为1,第二个是产生中断让CPU去中断处理;TF是硬件清零的(由1变0是自动的,不需要软件来干预。)有一些CPU的设计时需要软件去清零的(一般高级芯片),这时候用户的程序就一定要记得给标志位清零,不然就不能重复进入中断或者反复不停的重复进入中断。
(3)TR就是timer run,就是定时器的启动计数的开关。当我们把整个定时器初始化好了以后,我们给TR位写1就可以开始计数了。TR位和GATE位有一定关联性。
(4)GATE是TMOD寄存器中的,也有2个分别对应T0和T1。GATE位中文名叫门控位,工作方式是:当GATE=0时(相当于门是打开的,此时GATE位是可以忽略的),此时定时器开关就只受TR位影响。具体就是TR=1开启计数,TR=0结束计数。当timer用来计数时,很关键的就是什么条件下计数,什么条件下不计数。当GATE=0时计数条件只有TR1一个(TR1=1就计数,TR1=0就不计数),当GATE=1时是否计数不仅取决于TR1还取决于INT1引脚(P3.3),实际规则是:当TR1=1并且INT1引脚也为高电平时才会计数。
1000 = 0x3E8 = 高0x3 低0xE8 => TL0 = 0xE8 TH0 = 0x3
8888 = 0x22B8 = 高0x22 低0xB8 => TL0 = 0xB8 TH0 = 0x22

4.2、IE&IT

(1)IE也是个标志位,作用就是用来展示硬件的状态改变的。比如IE1对应外部中断1(INT1),平时不发生INT1时IE1=0,当INT1发生中断时,硬件自动IE1=1,当CPU处理了INT1时硬件会自动给IE1=0(硬件自动清零)。
(2)IT是用来设置外部中断的中断触发方式的。所谓中断的触发方式,就是指硬件在某种条件下才会被判定为要产生中断,所以其实就是中断产生的条件。中断触发方式一般就是:边沿触发和电触发2种。边沿触发又分为上升沿触发、下降沿触发、双边沿触发;电平触发方式分为高电平触发、低电平触发2种。

4.3、TMOD

(1)GATE上面已经讲过了
(2)C/T位,设置T0/T1工作在定时器模式还是计数器模式。1表示计数器,0表示定时器。
(3)M1+M0,2个位一起来表示T0/T1处于哪种工作模式下,一般有4种:13位、16位、8位自动重载、双8位。


5.定时器编程实践

5.1、实验目的

(1)使用定时器来完成LED闪烁
(2)原来实现闪烁时中间的延迟是用delay函数实现的,在delay的过程中CPU要一直耗在这里不能去做别的事情。这是之前的缺点。
(3)本节用定时器来定一个时间,在这个定时器定时时间内CPU还可以去做主任务,定时时间到产生中断,在中断处理程序isr中让LED闪烁即可。

5.2、如何编程

(1)定时(timer初始化)
(2)主程序做事
(3)中断处理程序
(4)我们开发板的定时器最多能定多长时间?
内部时钟频率是1MHZ,时钟周期是1us。最多能定65535(16位定时器),也就是说最大定时时间为65535*1us=65535us=65.535ms。
如果要定比较长的时间(2s),定时器直接是不能够满足的,解决办法是多次定时后加起来构成一个长时间。
(5)计算TL0和TH0:
①确定自己定时时间,定为50ms
②确定内部时钟周期,因为12T模式,外部晶振12MHZ,所以为:1us
③定时个数就是:50ms/1us=50000
④TL0 = 50000 % 256, TH0 = 50000 / 256(设置错误,下面有说)

0xC3 0x50 => 195 80

#include <reg51.h>

unsigned char count;            // 10次,对应500ms
sbit LED = P0^1;                // LED对应的GPIO定义

#define CNT     20

void timer0_isr(void) interrupt 1 using 1
{
    TL0 = 50000 % 256;  
    TH0 = 50000 / 256;          // 手工重载计数值

    if (count-- == 0)
    {
        // 说明已经中断了10次了,500ms到了,干活了
        LED = !LED;             // LED取反
        count = CNT;
    }
}


void main(void)
{
    TMOD = 0x01;        // T0设置工作在定时器模式下,16位定时器
    TL0 = 50000 % 256;  
    TH0 = 50000 / 256;
    TR0 = 1;            // 开启计数器,开始计数了
    ET0 = 1;            // 开启T0中断
    EA = 1;             // 开启中断总开关

    count = CNT;            // 10次,对应500ms

    while (1);          // 主任务
}

6.定时时间设置错误纠正

6.1、加法定时器和减法定时器

(1)定时器的原理就是计数器,加法定时器计数方法是从我们给定的值开始计数,直到溢出(比如16位定时器最大值为0xffff,也就是65535,计数值到达这个值就溢出了)。减法定时器是从我们给定的值开始减1,减到0就溢出了。
(2)实例来看,比如16位定时器。我们设置的计数值为1000,则如果是减法定时器那么计数个数就是1000,如果是加法计数器则计数个数就是65535-1000=64535。
(3)51单片机就是典型的加法定时器
(4)现代的单片机或者嵌入式SoC,一般常用的都是减法定时器了。虽然加法定时器和减法定时器都能实现功能,但是明显减法定时器更加直观,因为不用去多加一步计算计数个数。

6.2、51单片机定时器设置值计算

计算TL0和TH0:
①确定自己定时时间,定为50ms
②确定内部时钟周期,因为12T模式,外部晶振12MHZ,所以为:1us
③定时个数就是:50ms/1us=50000
④计数个数是50000,那么写进去TL0和TH0里面的计数值应该是65535-50000=15535
⑤TL0 = 15535% 256, TH0 = 15535/ 256

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容