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 /*定义驱动数码管显示段和位,此处为共阴极数码管编码,共阳极可直接取反即可*/ 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]); } }
上一篇:ATmega16开发板教程(6)——串口通信
下一篇:ATmega16开发板教程(3)——74HC595驱动数码管显示
推荐阅读最新更新时间:2024-11-03 02:22
设计资源 培训 开发板 精华推荐
- LTC1778、2.5V/3A 转换器开关频率为 1.4MHz
- sw6208 全协议22.5W 充电宝快充模块
- 使用 Analog Devices 的 ADP3300 的参考设计
- LT1634CCZ-5 的典型应用产生 LTC1448 双路 12 位 DAC 的基准和电源电压
- NCV7381A0V2GEVB:FlexRay ® 收发器,Clamp 30 评估板
- LT6656AIDC-1.25、1.25V 2 端子电压基准电流源的典型应用
- mini-pcie尺寸键盘主控板
- 使用 Richtek Technology Corporation 的 RT2875A 的参考设计
- #第五届立创电子设计大赛#一款语音控制的显示屏挂灯
- 用于简单时钟振荡器的 NCP301LSN30T1 3V 电压检测器的典型应用