"); //-->
》》点此进入 http://bbs.armavr.com/ ARM-AVR嵌入式开发论坛
一、程序结构
二、仿真效果
三、程序源码
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
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。