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

编程点滴:AVR外部中断测试程序

发布时间:2020-08-25 发布时间:
|
下面程序为AVR外部中断操作程序。

由测试程序,功能函数及头文件构成。



/* *******************************************
* File name: main.c
* Function: AVR外部中断测试程序
* Description: 通过外部中断控制输出端口电平
* Author & Date: Joshua Chan, 2012/03/23
* *******************************************/
#include
#include
#include
#include
#include
#include "eint_test.h"

/* 利用外部中断控制指定端口输出 */
void main(void)
{
int_init(3, 2); /* 使能中断3, 下降沿触发 */
_SEI(); /* 全局中断使能 */
while (1)
_WDR(); /* 喂狗 */
}




/* *******************************************
* File name: eint_test.h
* Function: AVR外部中断测试程序
* Description: 通过外部中断控制输出端口电平
* Author & Date: Joshua Chan, 2012/03/23
* *******************************************/
#ifndef _EINT_TEST_H
#define _EINT_TEST_H

#include

#define CPU_FOSC 16000000L

#define DELAY_S(t) __delay_cycles(CPU_FOSC * (t))
#define DELAY_MS(t) __delay_cycles(CPU_FOSC / 1000 * (t))
#define DELAY_US(t) __delay_cycles(CPU_FOSC / 1000000 * (t))

/* 使能外部中断并设置触发方式
* @intnum: 外部中断号, 取值范围 0~7
* @isc: 触发方式(0:低电平, 1:电平变换, 2:下降沿, 3:上升沿)
*/
extern void int_init(unsigned char intnum, unsigned char isc);

/* 控制PE, PF端口输出
* @num: 端口顺序号
* @stat: 控制端口输出电平
*/
extern void ctl_output(unsigned char num, unsigned char stat);

#endif



/* *******************************************
 * File name: eint_test.c
 * Function:  AVR外部中断测试程序
 * Description: 通过外部中断控制输出端口电平
 * Author & Date: Joshua Chan, 2012/03/23
 * *******************************************/
#include 
#include 
#include 
#include 
#include 
#include "delay.h"
#include "eint_test.h"

/* 使能外部中断并设置触发方式
 * @intnum: 外部中断号, 取值范围 0~7
 * @isc: 触发方式(0:低电平, 1:电平变换, 2:下降沿, 3:上升沿)
 */
void int_init(unsigned char intnum, unsigned char isc)
{
    if (intnum<=3 && isc<=3) {
        EIMSK |= (1 << intnum);
        EICRA &= ~(3 << (intnum*2));
        EICRA |= (isc << (intnum*2));
    } else if ((intnum>=4 && intnum<=7) && isc<=3) {
        EIMSK |= (1 << intnum);
        EICRB &= ~(3 << (intnum*2));
        EICRB |= (isc << (intnum*2));
    }
}

/* 控制PE, PF端口输出
 * @num: 端口顺序号
 * @stat: 控制端口输出电平
 */
void ctl_output(unsigned char num, unsigned char stat)
{
    if ((num>=1 && num<=4) && (stat==1 || stat==0)) {
        DDRF |= (1 << (4-num));
        if (stat)
            PORTF |= (1 << (4-num));
        else
            PORTF &= ~(1 << (4-num));
    } else if ((num>=5 && num<=6) && (stat==1 || stat==0)) {
        DDRE |= (1 << (num-3));
        if (stat)
            PORTE |= (1 << (num-3));
        else
            PORTE &= ~(1 << (num-3));
    }
}

/* 定义中断处理函数 */
#pragma vector = INT3_vect
__interrupt void int3_isr(void)
{
    ctl_dcmotor(6, 0);          /* 启动直流电机6 */
    DELAY_MS(100);
    ctl_dcmotor(6, 1);          /* 停止直流电机6 */
}
 


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

热门文章 更多
AVR单片机语音识别电路模块设计