新闻  |   论坛  |   博客  |   在线研讨会
AVR笔记8:7种LED亮灭模式+INT0中断+蜂鸣器(GCC)
mayer | 2009-09-01 19:36:17    阅读:2549   发布文章

AVR笔记8:7种LED亮灭模式+INT0中断+蜂鸣器(GCC)

 

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

一、程序结构
程序结构

二、仿真效果
点击看大图

三、程序源码
1、main.c
/*******************************************************************************
Platform : AVR mega16学习板(www.iccavr.com)
Project : 实验八:7种LED亮灭模式+INT0中断+蜂鸣器(GCC)
Clock F : 3.6864M
Software: WinAVR-20071221+Proteus7.4
Author  : 林夕依然
Version : 08.12.07
Updata  : 09.02.26  模块化
          09.05.03  增加proteus仿真模型,仿真通过。
    09.07.21  WinAVR-20071221环境下编译通过
comments:
1、以学习板LED灯和蜂鸣器为硬件电路,实现7种LED亮灭功能,INT0中断时产生蜂鸣器鸣叫模式
2、INT0中断的练习
3、T/C1的CTC工作模式下,频率发生器程序的编写
4、PD5用作频率发生器时,需配置为输出,否则不能发生频率
5、使用GCC自带延时函数,LED_01-LED_05参数不可用char,只能用int,否则模式2不能通过,不知何因。
*******************************************************************************/
#include <avr/io.h>
#include <avr/interrupt.h>
#include "led.h"

int main(void)
    {
    int l,m,n,o,p,r,s,i,j;
DDRA =0X00;                         //端口上拉输入
PORTA=0XFF;
    DDRB =0xFF;                         //端口输出
    PORTB="0xFF";                         //输出高电平,LED熄灭
DDRC =0X00;
PORTC=0XFF;
DDRD =0XFF;                         //PD口输出高电平
PORTD=0XFF;

    GICR |= (1 << INT0);   //使能外部中断请求0
sei();                 //全局中断使能
    for (r=0;r<1;r++)
     {
    for(l=0;l<5;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<5;m++)               //模式2:顺序单个间隔点亮
    {
             for (i = 0; i < 8; i += 2)  //顺序间隔点亮LED
              LED_01(i);
             for (i = 7; i > 0; i -= 2)  //逆序间隔点亮LED
              LED_01(i);
    }
    LED_off();
     
    for(n=0;n<5;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<5;o++)               //模式4:相临点亮
    {
       for (i = 1; i < 8; i++)     //相临顺序同时点亮
       LED_03(i);
    for (i = 6; i > 1; i--)  //相临逆序同时点亮
       LED_03(i);
    }
    LED_off();   
    for(p=0;p<5;p++)               //模式5:发散聚集点亮
    {
       for(i=0;i<4;i++)            //发散点亮
      LED_04(i);
       for(i=2;i>0;i--)            //聚集点亮
      LED_04(i);     
    }
    LED_off();
   
    for(s=0;s<5;s++)               //模式6:四四点亮
    {
       for(i=0;i<2;i++)            //四四顺序点亮
      LED_05(i);   
    }
    LED_off();
   
    for(j=0;j<10;j++)              //模式7:全部点亮熄灭
    {
      LED_on();
   LED_off();
    }
     }
    }

2、buzzer.c
#include <avr/io.h>
#include <util/delay.h>
//7种声音,由低到高
void buzzer01(void)
{
    for(OCR1A= 1000;OCR1A<1700;OCR1A+=100)
    {
      TCCR1A = 0x40;        
      TCCR1B = 0x09;
      _delay_ms(40);        //蜂鸣器鸣叫30mS钟,定时器一开始工作蜂鸣器即开始鸣叫
      TCCR1A = 0x00;       //定时器停止工作,无频率产生,蜂鸣器停止鸣叫
    }
}
//7种声音,由高到低   
void buzzer02(void)
{
    for(OCR1A= 1600;OCR1A>900;OCR1A-=100)
    {
      TCCR1A = 0x40;        
      TCCR1B = 0x09;
      _delay_ms(40);        //蜂鸣器鸣叫30mS钟,定时器一开始工作蜂鸣器即开始鸣叫
      TCCR1A = 0x00;       //定时器停止工作,无频率产生,蜂鸣器停止鸣叫
    }
}

3、led.c
#include <avr/io.h>
#include <util/delay.h>
void LED_on(void)                            //打开所有LED
    {
PORTB =0X00;
_delay_ms(100);
}

void LED_off(void)                           //关闭所有LED
    {
PORTB = 0xFF;
_delay_ms(100);
}
void LED_01(int i)                  //LED亮灭控制
    {
    PORTB = ~_BV(i);                //输出低电平
    _delay_ms(100);                   //调用延时程序
    }

void LED_02(int i)                  //间隔点亮
    {
PORTB=~(_BV(i)|_BV(i-2));
_delay_ms(100);
}

void LED_03(int i)                 //相临点亮
    {
PORTB=~(_BV(i)|_BV(i-1));      //~后内容需用括号括起来
_delay_ms(100);
}

void LED_04(int i)                 //发散聚集点亮
    {
switch(i)
  {
  case 0:PORTB=0xE7;_delay_ms(100);break;    //延时100ms
  case 1:PORTB=0xDB;_delay_ms(100);break;
  case 2:PORTB=0xBD;_delay_ms(100);break;
  case 3:PORTB=0x7E;_delay_ms(100);break;
  default:break;
  }
}

void LED_05(int i)
   {
   switch(i)
    {
case 0:PORTB=0XAA;_delay_ms(100);break;
case 1:PORTB=0X55;_delay_ms(100);break;
}
   }

4、int0_interrupt.c
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "buzzer.h"
ISR(INT0_vect)
  {  
      char i,z;
      for (z=0;z<5;z++)
   {
         buzzer01(); //7种声音,由低到高
   for (i = 0; i < 8; i ++)
    {
   PORTB = ~(1 << i);
   _delay_ms(100);        
    }
      PORTB=0XFF;               //关闭所有LED
     
   buzzer02();//7种声音,由高到低
      for (i = 0; i < 8; i ++)
    {
   PORTB = ~(1 << i);
   _delay_ms(100);        
    }
      PORTB=0XFF;               //关闭所有LED
    }
  }

5、buzzer.h
void buzzer01(void);
void buzzer02(void);

6、led.h
void LED_on(void);
void LED_off(void);
void LED_01(int i);
void LED_02(int i);
void LED_03(int i);
void LED_04(int i);
void LED_05(int i);

四、完整项目文件下载

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

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客