小5带你飞(10)—AVR(ATmega 328P)单片机定时器的原理和使用(1)

以前写过一个关于ATmega328p的定时/计数器的文章,但是写的不够详细,这一次我将详细的介绍一下ATmega328p的3个片内定时/计数器的相关知识。

328p有3个定时计数器,分别是8bit的T/C0,16bit的T/C1和8bit的T/C2。我们来看这个16bit的T/C2。

我们先看看最简单的普通模式。定时器的基本原理其实就是根据设定的时钟频率,每过一个时钟,计数计时器的值加1。即16位计数器TCNT1一直累加,当计数到0xFFFF之后,由于计数器溢出,TCNT1返回到最小值0x0000重新开始计数。

普通模式涉及到的寄存器有:(对于每一个位,我也只写出在普通模式下面涉及到的)

1.TCCR1A:控制寄存器A

2.TCCR1B:控制寄存器B

在普通模式下面,对于这两个寄存器只需要用到下面这个表了:

这个位WGM13:0就是波形发生模式的设置,我们设置为普通模式,那么WGM13:0均设置为0即可

我们还需要来设置3个重要的位:

位CS12:0看表如下:作用时钟的选择

3.TCNT1H与TCNT1L:数据寄存器。

这是一个16位的,分高八位和低八位,

主要来看一下这个数据在普通模式下怎么计算:

假如现在要做一个定时1s的计数器,即1s产生一个中断,timer1是一个16位的计数器,能够存放的最大值为0xFFFF,

有这样一个公式:TCNT1=0Xffff-定时时间/(分频数*(1/晶振频率))

再假设分频数为设置为1024,328p的晶振频率为12MHz,那么

TCNT1=0XFFFF-1/(1024*(1/16000000))=0xFFFF–0x3D09=0XC2F6

在程序中TCNT1的赋值写法有很多,

TCNT1=0xC2F6

TCNT1H=0xC2TCNT1L=0xF6均是正确的。

4.TIMSK1:中断屏蔽寄存器

这只要置位bit0就好了,即开中断使能。

有了这些知识,普通模式下的定时器就可以跑起来了,是不是特别的简单。

再附上demo程序:

版权声明:本站所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,不声明或保证其内容的正确性,如发现本站有涉嫌抄袭侵权/违法违规的内容。请举报,一经查实,本站将立刻删除。

相关推荐