/* *********************************************
* File name: main.c
* Function: 16位定时器比较匹配中断方式测试程序
* Description: 定时器控制LED以500ms间隔闪烁
* Author & Date: Joshua Chan, 2012/03/26
* *********************************************/
#include
#include
#include
#include
#include
#include "timer_16bit_test.h"
/* 利用timer1比较匹配中断控制LED每500ms间隔亮灭 */
void main(void)
{
set_pb0_output();
timer1_comp_init();
_SEI(); /* 全局中断使能 */
while (1)
_WDR();
}
/* *********************************************
* File name: timer_16bit_test.h
* Function: 16位定时器比较匹配中断方式测试程序
* Description: 定时器控制LED以500ms间隔闪烁
* Author & Date: Joshua Chan, 2012/03/26
* *********************************************/
#ifndef _TIMER_16BIT_TEST_H
#define _TIMER_16BIT_TEST_H
/* 配置16位定时器timer1比较匹配中断使能 */
extern void timer1_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_16bit_test.c * Function: 16位定时器比较匹配中断方式测试程序 * Description: 定时器控制LED以500ms间隔闪烁 * Author & Date: Joshua Chan, 2012/03/26 * *********************************************/ #include#include #include #include #include #include "timer_16bit_test.h" /* 配置16位定时器timer1比较匹配中断使能 */ void timer1_comp_init(void) { TCCR1A = 0x00; /* CTC模式, 通道A普通端口操作, 预分频1024 */ TCCR1B = 0x0D; TCCR1C = 0x00; TIMSK |= 0x10; /* 输出比较A匹配中断使能 */ OCR1A =0x1E83; /* 中断发生间隔 (0x1E83+1)*1024*(1/16.0MHz)*1000 = 500ms */ TCNT0 = 0x00; } /* 配置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); } /* 定义timer1比较匹配中断处理函数 */ #pragma vector = TIMER1_COMPA_vect __interrupt void timer1_isr(void) { if (pb0_is_high()) set_pb0_low(); else set_pb0_high(); }
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』