标题:
编程点滴: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 <io
avr
.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