×
单片机 > 单片机程序设计 > 详情

编程点滴:16位AVR定时器比较匹配中断测试程序

发布时间:2020-08-24 发布时间:
|
程序实现以Timer1比较匹配中断方式控制LED以500ms为间隔产生亮灭变化。

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



/* *********************************************
* 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();
}
 
 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
qemu+chroot构建arm aarch64虚拟机