原创 AVR笔记7:外部中断INT0实验(GCC)

2009-8-31 15:21 4046 8 9 分类: MCU/ 嵌入式

》》点此进入    http://bbs.armavr.com/   ARM-AVR嵌入式开发论坛


一、程序结构
attachimg.gif 程序结构

二、仿真效果
attachimg.gif 点击看大图

三、程序源码
1、main.c
/*******************************************************************************
Platform : AVR mega16学习板(www.iccavr.com
Project : 实验七:外部中断INT0实验(GCC)
Clock F : 3.6864M
Software: WinAVR-20071221+Proteus7.4
Author  : 林夕依然
Version : 08.12.06
Updata  : 09.02.26  模块化
          09.05.03  增加proteus仿真模型,仿真通过
    09.07.21  WinAVR-20071221环境下编译通过
comments:
1、以学习板流水灯和INT0键为硬件电路,练习INT0中断函数的编写
2、电路板上电后LED0进入无限闪烁状态,当按下INT0键后,程序进入四种模式流水灯,
   流水灯后程序返回LED0无限闪烁状态
3、使用GCC自带延时函数
4、同ICC比较,中断函数写法不同,中断向量名称也不相同,均需更改。
*******************************************************************************/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "functions.h"

int main(void)
{
port_init();
GICR |= (1 << INT0);   //使能外部中断请求0
sei();                 //全局中断使能
while (1)
{
  PORTB = 0XFE;     //PB0置低,点亮LED0
  _delay_ms(500);
  PORTB = 0XFF;         //PB0置高,熄灭LED0
  _delay_ms(500);
}
}

2、functions.c
/*******************************
Platform : AVR mega16学习板(www.iccavr.com
function :功能函数集
Clock F  : 3.6864M
Software : WinAVR-20071221+Proteus7.4
Author   : 林夕依然
Version  : 09.07.21
comments :
1、使用GCC自带延时函数,需包含"util/delay.h"
2、GCC中无参数的函数需要写为void,否则编译时会有警告产生。如:void LED_off(void)
********************************/
#include <avr/io.h>
#include <util/delay.h>
void LED_off(void)                       //关闭所有LED
    {
PORTB = 0xFF;
_delay_ms(1);
}

void LED_01(char i)                  //LED亮灭控制
    {
    PORTB = ~_BV(i);                //输出低电平
    _delay_ms(100);                   //调用延时程序
    }
void LED_02(char i)                  //间隔点亮
    {
PORTB=~(_BV(i)|_BV(i-2));
_delay_ms(100);
}

void LED_03(char i)                 //相临点亮
    {
PORTB=~(_BV(i)|_BV(i-1));      //~后内容需用括号括起来
_delay_ms(100);
}
//端口初始化程序
void port_init(void)
{
    DDRA = 0x00;    /*方向输入*/
PORTA = 0xFF;    /*打开上拉*/
DDRB = 0xFF;    /*方向输出*/
PORTB = 0xFF;    /*电平设置*/
DDRC = 0x00;
PORTC = 0xFF;
DDRD = 0x00;
PORTD = 0xFF;
}

3、int0_interrupt.c
#include <avr/io.h>
#include <avr/interrupt.h>
#include "functions.h"
#define uint unsigned int
//INT0中断函数,与ICCAVR写法不同,中断向量名称也不相同
ISR(INT0_vect)
  {
      uint i,l,m,n,o;
      DDRB =0xFF;                         //端口输出
      PORTB=0xFF;                         //输出高电平,LED熄灭   
      
   for(l=0;l<2;l++)               //模式1:顺序点亮
          {
       for (i = 0; i < 8; i++)     //顺序单个点亮LED
                LED_01(i);
             for (i = 6; i > 0; i--)     //逆序单个点亮LED
                LED_01(i);
    }   
    LED_off();
   
      for(m=0;m<2;m++)               //模式2:顺序单个间隔点亮
    {
             for (i = 0; i < 8; i += 2)  //顺序间隔点亮LED
              LED_01(i);
             for (i = 7; i > 1; i -= 2)  //逆序间隔点亮LED(note1:当改为i>0时,程序异常,原因为循环被破坏)
              LED_01(i);
    }
    LED_off();
   
      for(n=0;n<2;n++)               //模式3:间隔点亮
    {
       for (i = 2; i < 8; i++)     //间隔顺序同时点亮
       LED_02(i);
    for (i = 6; i > 2; i--)  //间隔逆序同时点亮
       LED_02(i);
    }
    LED_off();
   
      for(o=0;o<2;o++)               //模式4:相临点亮
    {
       for (i = 1; i < 8; i++)     //相临顺序同时点亮
       LED_03(i);
    for (i = 6; i > 1; i--)  //相临逆序同时点亮
       LED_03(i);
    }
    LED_off();
     
  }

4、functions.h
void LED_off(void);
void LED_01(char i);
void LED_02(char i);
void LED_03(char i);
void port_init(void);

四、完整项目文件下载


http://bbs.armavr.com/thread-800-1-2.html

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户1058690 2009-9-20 08:27

很实用的资料,内容很详细

用户87437 2007-9-22 09:49

一个多功能的有源滤波器而已,可用于汽车功放,降低电位器的成本,且C1,C2各由一个开关并联一个与其容量10倍的电容,可实现×1/×10,但此线路由于大环路反馈,因此LP音质一般。
相关推荐阅读
用户1400544 2012-09-24 08:55
【分享】ATmega16学习笔记PDF完整版下载(WinAVR)
  笔记均为原创,欢迎转载,转载请注明出处!   笔记1:8种LED点亮模式_GCC.pdf 笔记2:有源蜂鸣器驱动实验_GCC.pdf 笔记3:按键扫描(用KEY选择对应LED...
用户1400544 2011-01-19 23:26
博主邀请您:加入千脑,拥有“我的在线电脑”
点击加入千脑,拥有“我的在线电脑”在线电脑随时随地可用,安全可靠您可能遇到以下情况: 用户场景一:        我是一个集团公司的企业白领,经常负责写些策划书,制作各类表格等,有时候上班时间做不完就...
用户1400544 2010-04-07 00:43
ATmega16_Basic_V1.1范例2:8种LED点亮模式(ICC)
一、程序结构二、程序源码1、main.c /******************************************************************************...
用户1400544 2010-04-07 00:22
ATmega16_Basic_V1.1范例1:LED流水灯(ICC)
一、程序结构二、程序源码1、main.c /******************************************************************************...
用户1400544 2010-03-30 14:39
Altium Designer 6原理图元件库大全(7个种类)
》》点此进入      http://bbs.armavr.com/   ARM-AVR嵌入式开发论坛       ARM-AVR嵌入式开发论坛推出【Altium Designer 6 原理图元件库大...
用户1400544 2010-03-30 14:39
protel99原理图元件库大全(8个种类)
》》点此进入      http://bbs.armavr.com/   ARM-AVR嵌入式开发论坛       ARM-AVR嵌入式开发论坛推出【protel99原理图元件库大全(8个种类)】,共...
我要评论
1
8
关闭 站长推荐上一条 /3 下一条