用M16单片机IO口生成模拟音乐

来源:本站
导读:目前正在解读《用M16单片机IO口生成模拟音乐》的相关信息,《用M16单片机IO口生成模拟音乐》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《用M16单片机IO口生成模拟音乐》的详细说明。
简介:用M16单片机IO口生成模拟音乐的详细的程序设计步骤

#i nclude

#i nclude

#define uchar unsigned char

#define uint unsigned int

/****************************************

* 定义音乐数据二维数组{x,y} *

* x:对应音符音阶(频率),0表示休止符 *

* y:对应音符节拍,0表示音乐结束 *

* 此数据取自《ICC AVR应用实例》 *

****************************************/

//以下音乐数据为《卡秋莎》,位于程序区

flash uint music_data[][2]=

{

{440,600},{494,200},{523,600},{443,200},{523,400},{494,200},

{440,200},{494,400},{330,400},{494,600},{523,200},{578,600},

{494,200},{578,400},{523,200},{494,200},{440,800},{659,400},

{880,400},{784,400},{880,200},{784,200},{698,400},{659,200},

{578,200},{659,400},{440,400},{ 0,200},{698,400},{578,200},

{659,600},{523,200},{494,200},{330,200},{523,200},{494,200},

{440,800},{659,400},{880,400},{784,400},{880,200},{784,200},

{698,400},{659,200},{578,200},{659,400},{440,400},{ 0,200},

{698,400},{578,200},{659,600},{523,200},{494,200},{330,200},

{523,200},{494,200},{440,800},{ 0, 0}

};

#pragma data:data //设置回到数据存储器区

/************************************

* 延时函数:1M时钟时为MS *

************************************/

void delay_ms(uint i)

{

uchar a;

for(;i;i--)

{

for (a = 220; a; a--)

{

;

}

}

}

/************************************

* 端口初始化函数 *

************************************/

void port_init(void)

{

DDRD=0xff; //D口配置为输出,驱动蜂鸣器

DDRB=0xff; //B口配置为输出,驱动LED

PORTB=0xff; //LED初值为灭

}

/***********************************

* 音乐产生函数 *

* 功能:输出频率为x的方波,延时y MS*

* 范围:x:100-20000Hz,0:不发声 *

* y:0-65536 MS *

***********************************/

void sound(uchar i)

{

uint x;

x=music_data[0]; //取音乐的频率数据

if(x!=0)

{

x=500000/x; //1M时钟数据计算

OCR1A=x; //比较值赋值

TCCR1A = 0x40; //允许比较反转输出

}

else

{

TCCR1A = 0x00; //频率为0,休止符,不发声

}

}

/*******************************

* 主函数 *

*******************************/

void main(void)

{

uchar i=0;

port_init(); //端口初始化

TCCR1A = 0x40; //将T/C1配置为比较匹配,OC1A取反

TCCR1B = 0x09;

while(1)

{

while(music_data[1]!=0) //等待最后一个音符到来

{

sound(i); //输出音符

delay_ms(music_data[1]);//节拍延时

TCCR1A = 0x00; //奏完一个音符停止

PORTB^=1<<5; //音符节拍由LD5闪亮显示

PORTD|=1<<5;

i++; //准备一下个音符

}

delay_ms(1000);

i=0; //一遍结束,停1秒,从头开始

}

}

提醒:《用M16单片机IO口生成模拟音乐》最后刷新时间 2024-03-14 01:04:14,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《用M16单片机IO口生成模拟音乐》该内容的真实性请自行鉴别。