当计数器TCNT0的数值等于比较寄存器OCR0时计数器TCNT0主动清零。OCR0界说了计数器的最大(TOP)值,这个形式使得用户能够很容易地操控比较匹配输出的频率。T/C0的比较输出脚为OC0(PB3),PB口的第三脚,在此形式下能够在OC0上输出PWM操控外部设备。
例如:在OC0脚上输出20HZ的方波信号,方波的周期时刻为T=1/20HZ=0.05秒=50ms,半个周期为25ms,体系选用8MHZ晶振,1024分频,时钟计数频率为8000000/1024=7812.5HZ,每个时钟脉冲时刻为1/7812.5=0.128ms, 守时25ms的计数值为25ms/0.128ms=195,将195赋值为T/C0的比较寄存器OCR0,发动守时器后,TCNT0从0开端计数,当计数到195时,发生比较中止,在OC0脚上输出20HZ的占空比为50%的方波信号。
操作过程如下:
二、使能大局中止:SREG=0X80;
三、T/C0比较中止答应:TIMSK|=(1《
四、TCCR0装备:分频系数为1024, TCCR0|=(1《
CTC形式设置, TCCR0|=(1《
比较匹配时OC0取反 TCCR0|=(1《
五、计数器付初值: TCNT0=0;
OCR0=195; //付初值后守时器开端作业
//函数功用:在PB3上输出20HZ的方波,并在PD7上发生周期2秒的周期信号。(代码来自轻松玩转avr单片机c言语cd)
#include
char Counter = 0; // 计数变量清零
void port_init()
{
DDRB|=(1《PORTB&=(0《DDRD|=(1《PORTD&=(0《}
void TImer0_init()
{
SREG = 0x80; //使能大局中止
TIMSK= (1《《 OCIE0); //T/C0比较匹配中止答应
TCCR0=(1《// T/C0作业于CTC形式,1024分频,比较匹配时,触发OC0取反
TCNT0 = 0; //守时初值设置,
OCR0 = 195; //比较匹配寄存器初值
}
void main()
{
port_init();
TImer0_init();
while(1);
}
#pragma interrupt_handler timer0_COMP:20
void timer0_COMP(void)
{
TCNT0 = 0; //守时初值设置,
OCR0 = 195; //比较匹配寄存器初值
if(++Counter 》= 40) //守时时刻到1S吗?守时中止溢出40次为1S
{
PORTD^=(1《Counter = 0; //1S计时变量清零
}
}