ATmega16开发板教程(4)——定时器

5、定时器

这里主要编写定时器0和1的定时功能,通过数码管显示

定时器T0

首先T0是一个8位定时器,其主要由TCNT0(初值寄存器)、TCCR0(控制寄存器)。

TCCR0:FOC0,WGM00,COM01,COM00,WGM01,CS02,CS01,CS00。

如图,第5和6位是用来设置T/C的4种工作模式,这里主要是一般的定时器功能,所以WGM01和WGM00=0,即可。

其次,低3位是用来设置分频,程序里面设置1024分频,而时钟是11.0592MHz,所以定时时间=1024*(255-初值TCNT0)/11059200=10ms,所以初值寄存器TCNT0=147。T0是向上计数,溢出后清零,触发中断。

除了以上设置定时器0的基本初值和分频外,还有定时器0的使能位在寄存器TIMSK中,它包括3个定时器的使能以及比较中断的使能。

TIMSK:OCIE2,TOIE2,TICIE1,OCIE1A,OCIE1B,TOIE1,OCIE0,TOIE0

其中TOIE0=1,使能定时器0;OCIE0=1,是使能比较匹配中断,类似51单片机的TR0。其余是定时器1和2的使能位。

总中断-SREG:I,T,H,S,V,N,Z,C。总中断的最高位I=1即可,类似于51单片机的EA

具体编程讲解如下图:

定时器0中断服务函数——按照格式写,更改向量名称即可

与51单片机类似,TCNT0在中断函数中重新赋值。

定时器T1

首先T1是一个16位定时器,其初值由TCNT1H、TCNT1L(初值寄存器)控制、工作模式由TCCR1A和TCCR1B控制。

TCNT1H和TCNT1L的初值设置与T0类似,根据分频设置来计算所得,如本例中定时器10ms,分频256,所以10ms=256*(65535- TCNT1)/11059200,得到TCNT1= 65535-432,然后将其分为2个8位字节,与51单片机类似的做法:TCNT1H =(65535-432)/ 256;TCNT1L= (65535-432)% 256。

TCCR1A:COM1A1,COM1A0,COM1B1,COM1B0,FOC1A,FOC1B,WGM11,WGM10

TCCR1B:ICNC1,ICES1,Dummy5,WGM13,WGM12,CS12,CS11,CS10

工作模式寄存器与T0类似,TCCR1B的低3位是设置分频,所以设置为100,即256分频,TCCR1B = 0x04

如图,其中WGM13/WGM12/WGM11/WGM10是用来设置定时计数器的工作模式,这里是普通模式,所以TCCR1A = 0x00

定时器1的使能位也在TIMSK中,TICIE1,OCIE1A,OCIE1B,TOIE1第2-5位都是设置定时器1的,其中TOIE1 = 1即可使能。

具体编程讲解如下图:

设置分频、计算初值、开启定时器即可完成所有配置。

与T0类似,定时器1的中断向量设置完毕后,重新赋初值。最后通过数码管显示定时器定时效果。

仿真视频

/**
******************************************************************************
*   @file      main.c
*   @author    Alex——小白
*   @version   V1.0
*   @date      2021.1.20
*   @brief     定时器定时,数码管显示
*   @store     Proteus仿真店子
*   @Link      https://shop484534014.taobao.com/
*   @Email     844545015@qq.com
******************************************************************************
*   @attention  All Rights Reserved  
**/
​
#include <main.h>
​
/*定义驱动数码管显示段和位,此处为共阴极数码管编码,共阳极可直接取反即可*/
uint8_t table_duan[16]={
  0x3f,0x06,0x5b,0x4f,
  0x66,0x6d,0x7d,0x07,
  0x7f,0x67,0x77,0x7c,
  0x39,0x5e,0x79,0x71
};
​
uint8_t table_wei[8]={         
  0xfe,0xfd,0xfb,0xf7,
  0xef,0xdf,0xbf,0x7f
};
​
void main(void)
{
    SEG.SEG_Init();
    TIMER.Timer0_Init();
    TIMER.Timer1_Init();
    while(1)
    {
        SEG.SEG_Display(table_wei[0],table_duan[TIMER.Timer0_Sec%10]);
        SEG.SEG_Display(table_wei[1],table_duan[TIMER.Timer0_Sec/10]);
        SEG.SEG_Display(table_wei[6],table_duan[TIMER.Timer1_Sec%10]);
        SEG.SEG_Display(table_wei[7],table_duan[TIMER.Timer1_Sec/10]);        
    }
}

 

如需Proteus和IAR安装包以及AVR编程参考手册,请关注公众号:

Proteus仿真店子

可通过查看历史记录,查看源码和仿真工程

(若需Proteus和IAR安装包以及AVR编程参考手册,后台回复:AVR;若需其它设计,后台回复:AVR设计

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值