AVR单片机_mega16_C语言_蜂鸣器唱歌实验程序
/*******************************************
文件:BEEP.C
环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10
硬件:ATMEGA16芯片
日期:2006年12月10日
功能:驱动开发板上的蜂鸣器
备注:参考《AVR系列单片机C语言编程与应用实例》(清华大学出版社)
/******************************************/ #include
//包含型号头文件
#include //包含"位"操作头文件
#include //
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
输入输出头文件
#include //包含自定义常量头文件
#pragma interrupt_handler Timer1_Ov:10
/*-------------两只老虎-------------*/
const uchar MusicTable2[77]={13,2, 15,2, 17,2, 13,1, 0,1,
13,2, 15,2, 17,2, 13,1, 0,1,
17,2, 18,2, 20,2, 0,2,
17,2, 18,2, 20,2, 0,2,
20,1, 22,1, 20,1, 18,1, 17,2, 13,2,
20,1, 22,1, 20,1, 18,1, 17,2, 13,2,
15,2, 8,2, 13,2, 0,2,
15,2, 8,2, 13,2, 0,2,
0xff};
/*-----------------新年好------------------*/
const uchar MusicTable1[129]={ 13,1, 13,1, 13,2, 8,2,//音符,拍数,
17,1, 17,1, 17,2, 13,2,
13,1, 17,1, 20,2, 20,2,
18,1, 17,1, 15,2, 0,2,
15,1, 17,1, 18,2, 18,2,
17,1, 15,1, 17,2, 13,2,
13,1, 17,1, 15,2, 8,2,
12,1, 15,1, 13,2, 0,2,
13,1, 13,1, 13,2, 8,2,//音符,拍数,
17,1, 17,1, 17,2, 13,2,
13,1, 17,1, 20,2, 20,2,
18,1, 17,1, 15,2, 0,2,
15,1, 17,1, 18,2, 18,2,
17,1, 15,1, 17,2, 13,2,
13,1, 17,1, 15,2, 8,2,
12,1, 15,1, 13,2, 0,2,
0xff};
//0, 1, #1, 2, #2, 3, 4, #4, 5, #5, 6,
#6, 7,
uint
ToneTable[37]={ZERO,DO_L,DOA_L,RE_L,REA_L,MI_L,FA_L,FAA_L,SO_L,SOA_L,LA_L,LAA_L,
TI_L,
DO ,DOA ,RE ,REA ,MI ,FA ,FAA ,SO ,SOA ,LA ,LAA ,TI ,
DO_H,DOA_H,RE_H,REA_H,MI_H,FA_H,FAA_H,SO_H,SOA_H,LA_H,LAA_H,TI_H};
uint tone;
/******************************************* 函数名称: Timer1_Ov
功 能: 定时器1溢出中断服务函数(完成单个音的产生)
参 数: 无
返回值 : 无
/********************************************/ void Timer1_Ov(void)
{
if(tone)//若不是休止符,则发声
{
TCNT1=tone; //计数值装入寄存器
PORTA^=BIT(BEEP);//蜂鸣器接口电平翻转
}
}
/******************************************* 函数名称: Timer1_init
功 能: Timer1的初始化
参 数: 无
返回值 : 无
/********************************************/ void Timer1_init(void)
{
TCCR1A=0x00; //普通端口操作
TCCR1B=0x02; //8分频
SREG|=0x80; //开放全局中断
}
/******************************************* 函数名称: Music
功 能: 完成整曲的音乐演奏
参 数: pmusic--曲谱数组指针
返回值 : 无
/********************************************/ void Music(const uchar *pMusic)
{
while(*pMusic!=0xFF) //0xFF为音乐结尾符
{
TIMSK=0x04; //Timer1溢出中断使能
tone=ToneTable[*pMusic]; //取音调频率
TCNT1=tone; //将频率值对应的计数值写入计时器,开始发声
pMusic++; //乐谱音符指针+1 ,取拍数
Delayms((*pMusic)*100); //按拍数延时
Delayms((*pMusic)*100);
TIMSK=0x00; //发声结束 ,屏蔽Timer1溢出中断
pMusic++; //乐谱音符指针+1 ,取下一音符
}
Delayms(1000); //曲谱结束,等待
}
/*******************************************
函数名称: main
功 能: 演奏指定的音乐
参 数: 无
返回值 : 无
/********************************************/
void main(void)
{
Board_init( ); //初始化开发板/
Timer1_init(); //Timer1初始化
while(1)
{
Music(MusicTable2); //循环演奏歌曲(改变参数MusicTable1可以变换歌曲)
}
}