⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 music.c

📁 avr单片机atmage16驱动小灯的一些例程 并且包括一些收发数据的程序利用usb口
💻 C
字号:
/*****************************************
*      用M16单片机I/O口生成模拟音乐    	 *
* 功    能:用I/O口生成模拟音乐			 *
* 时钟频率:内部1M 						 *
* 设    计:tonghe						 *
* 修改日期:2007年04月13日				 *
* 编译环境:ICC-AVR6.31					 *
* 实验环境:本站M16学习板				 *
* 发    声:无源蜂鸣器					 *
* 结    果:试验通过					 *
* 要    求:插上JP1、JP2、LED_EN短路块	 *
*****************************************/
#include <iom16v.h> 
#include <macros.h>

#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[i][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[i][1]!=0)	//等待最后一个音符到来
		    {
			sound(i);				//输出音符
			delay_ms(music_data[i][1]);//节拍延时
			TCCR1A = 0x00;			//奏完一个音符停止
			PORTB^=1<<5;			//音符节拍由LD5闪亮显示
			PORTD|=1<<5;
			i++;					//准备一下个音符
			}
		delay_ms(1000);
		i=0; 						//一遍结束,停1秒,从头开始
		}
	}
	
	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -