新闻  |   论坛  |   博客  |   在线研讨会
AVR笔记6:无源蜂鸣器驱动实验(GCC)
mayer | 2009-09-01 19:37:44    阅读:2762   发布文章

AVR笔记6:无源蜂鸣器驱动实验(GCC)

 

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

一、程序结构
程序结构

下载 (5.3 KB)
2009-7-23 21:13



二、仿真效果
点击看大图

下载 (176.84 KB)
2009-7-23 21:13



三、程序源码
1、main.c
/*******************************************************************************
Platform: AVR mega16学习板(www.iccavr.com)
Project : 实验六:无源蜂鸣器驱动实验(GCC)
Clock F : 3.6864M
Software: WinAVR-20071221+Proteus7.4
Author  : 林夕依然
Version : 08.12.06
Updata  : 09.02.26  模块化
          09.04.30  增加proteus仿真模型,通过仿真
    09.07.21  WinAVR-20071221环境下编译通过
comments:
1、以学习板蜂鸣器为硬件电路,实现蜂鸣器的周期鸣叫,同时LED流水灯运行
2、TC1的CTC工作模式下,频率发生器程序的编写
3、频率计算公式:F=系统时钟频率/(2*OCR1A)/预分频,如OCR1A=500时:
   当预分频为1时, F="3".6864MHz/2*500/1=3686.4HZ,频率表测得3678HZ
   当预分频为8时, F="3".6864MHz/2*500/8=460.8HZ,频率表测得459.8HZ
   当预分频为64时,F=3.6864MHz/2*500/64=57.6HZ,频率表测得57.4HZ
4、使用GCC自带延时函数,ICC中的DelayMs()函数在GCC中失效,不知何因
*******************************************************************************/
#include <avr/io.h>
#include <util/delay.h>
void port_init(void);
int main(void)
{
unsigned char i;
    port_init();
while (1)
      {
  for (i = 0; i < 8; i ++)
                  {
   PORTB = ~(1 << i);
   _delay_ms(300);        
   }
  TCCR1A = 0x40;        
  TCCR1B = 0x09;        //比较匹配时OCA1电平取反,CTC模式,无预分频
     //TCCR1B = 0x0A;      //比较匹配时OCA1电平取反,CTC模式,CLK/8预分频
  //TCCR1B = 0x0B;      //比较匹配时OCA1电平取反,CTC模式,CLK/64预分频
  OCR1A  = 500;         //无预分频时,频率=3.6864M/(2*500)=3686.4KHz
  _delay_ms(1000);        //蜂鸣器鸣叫1S钟,定时器一开始工作蜂鸣器即开始鸣叫
  TCCR1A = 0x00;        //定时器停止工作,无频率产生,蜂鸣器停止鸣叫
  //PORTD &= ~(1 << 5); //PD5端口置低,可以不要此句
      }
}
//端口初始化程序
void port_init(void)
{
DDRA = 0x00;      /*方向输入*/
PORTA = 0xFF;      /*打开上拉*/
DDRB = 0xFF;      /*方向输出*/
PORTB = 0xFF;      /*高电平*/
DDRC = 0x00;
PORTC = 0xFF;
DDRD = 0xFF;
PORTD = 0xFF;
}

四、完整项目文件下载

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

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

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