Board logo

标题: 编程点滴:8位AVR定时器比较匹配中断测试程序 [打印本页]

作者: yuchengze    时间: 2016-10-22 10:06     标题: 编程点滴:8位AVR定时器比较匹配中断测试程序

程序实现以Timer0比较匹配中断方式控制LED以500ms为间隔产生亮灭变化。

TCCR0寄存器的WGM0位配置为CTC模式时,当比较匹配发生时会自动清除计数器,无需对TCNT0手动置零。

文件组成:测试程序定时器配置程序和头文件。


/* *******************************************
* File name: main.c
* Function: 8位定时器比较匹配中断方式测试程序
* Description: 定时器控制LED以500ms间隔闪烁
* Author & Date: Joshua Chan, 2012/03/24
* *******************************************/
#include <ioavr.h>
#include
#include
#include
#include
#include "timer_8bit_test2.h"

/* 利用timer0比较匹配中断控制LED每500ms间隔亮灭 */
void main(void)
{
set_pb0_output();
timer0_comp_init();
_SEI(); /* 全局中断使能 */
while (1)
_WDR();
}</io

/* *******************************************
* File name: timer_8bit_test2.h
* Function: 8位定时器比较匹配中断方式测试程序
* Description: 定时器控制LED以500ms间隔闪烁
* Author & Date: Joshua Chan, 2012/03/24
* *******************************************/
#ifndef _TIMER_8BIT_TEST2_H
#define _TIMER_8BIT_TEST2_H

/* 配置8位定时器timer0比较匹配中断使能 */
extern void timer0_comp_init(void);

/* 配置LED管脚为输出 */
extern void set_pb0_output(void);

/* LED亮 */
extern void set_pb0_low(void);

/* LED灭 */
extern void set_pb0_high(void);

/* 检测LED状态 */
extern unsigned char pb0_is_high(void);

#endif


/* *******************************************
* File name: timer_8bit_test2.c
* Function: 8位定时器比较匹配中断方式测试程序
* Description: 定时器控制LED以500ms间隔闪烁
* Author & Date: Joshua Chan, 2012/03/24
* *******************************************/
#include
#include
#include
#include
#include
#include "timer_8bit_test2.h"

/* 配置8位定时器timer0比较匹配中断使能 */
void timer0_comp_init(void)
{
TCCR0 |= 0x0F; /* 预分频值1024, CTC模式(比较匹配发生清除计数器) */
TIMSK |= 0x02; /* 比较匹配中断使能 */
OCR0 = 0x9B; /* 中断发生间隔 (0x9B+1)*1024*(1/16.0MHz)*1000 = 10ms */
TCNT0 = 0x00;
_SEI(); /* 全局中断使能 */
}

/* 配置LED管脚为输出 */
void set_pb0_output(void)
{
DDRB |= 0x01;
}

/* LED亮 */
void set_pb0_low(void)
{
PORTB &= ~(0x01);
}

/* LED灭 */
void set_pb0_high(void)
{
PORTB |= 0x01;
}

/* 检测LED状态 */
unsigned char pb0_is_high(void)
{
return (PORTB & 0x01);
}

/* 定义timer0比较匹配中断处理函数 */
#pragma vector = TIMER0_COMP_vect
__interrupt void timer0_isr(void)
{
static volatile unsigned char count = 50;

// TCNT0 = 0x00;
if (!(--count)) {
count = 50;
if (pb0_is_high())
set_pb0_low();
else
set_pb0_high();
}
}

关键字:8位AVR  定时器  中断测试




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0