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

📄 yinyue.c

📁 此程序是利用51单片机
💻 C
字号:
/*=============================================================
	该程序的功能是利用定时器0的定时中断,控制无源蜂鸣器演奏
"焚心似火",定时器0用方式1控制P3.3倒相频率,根据曲谱产生不同
的音频输出给无源蜂鸣器。
	曲谱数据类型music_type中的两项数据tone和delay用来描述同一
音符的两项数据:
tone对应曲谱中的音名,如1+0,1+7,+14分别对应低音1,中音1和高音1
delay对应简谱中的音符持续时间,如0x01,0x02,0x03分别表示1/8拍,
2/8拍,3/8拍
	曲谱标注:
			1=c 4/4
==============================================================*/
#include<reg52.h>
//#include<absacc.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit beep=P3^4;//蜂鸣器

/*=====曲谱数据类型=======*/
struct music_type 
{
	char tone;
	char delay;
};
/*=========================*/
uchar th0,tl0;  //变量th0,tl0为TH0和TL0的定时参数

/*========E调7声音阶的定时器定时参数表==================*/
uint code tonetab_E[]={	   	
63771,63967,64138,64216,64360,64489,64603,	//低音1,2,3,4,5,6,7
64654,64752,64837,64876,64948,65012,65070,	//中音1,2,3,4,5,6,7
65095,65144,65186,65206,65242,65274,65303,	//高音1,2,3,4,5,6,7
65120,65166,65195,64913,65259,65289,65309,	//高音#1,#2,(#3),#4,#5,#6,(#7)
10	//停顿
};
/*=======================================================*/

/*=========================焚心似火曲谱================================*/
struct music_type code notetab[]={
//----------1--------
3+7,0x01,7+0,0x01,1+7,0x01,6+0,0x01,
3+7,0x01,7+0,0x01,1+7,0x01,6+0,0x01,
3+7,0x01,7+0,0x01,1+7,0x01,6+0,0x01,
3+7,0x01,7+0,0x01,1+7,0x01,6+0,0x01,
5+7,0x10,
4+21,0x08,2+7,0x08,
4+7,0x0c,1+7,0x02,2+7,0x02,
7+0,0x04,5+0,0x0c,
6+0,0x10,
//-------------2------

29,0x01,6+0,0x04,3+7,0x04,1+7,0x02,
5+7,0x10,
29,0x01,3+7,0x02,5+7,0x02,4+21,0x06,2+7,0x04,
2+7,0x02,3+7,0x02,3+7,0x0c,
29,0x01,6+0,0x04,3+7,0x04,1+7,0x02,
2+7,0x0c,
29,0x01,6+0,0x02,1+7,0x02,7+0,0x06,5+0,0x02,
5+0,0x02,6+0,0x02,6+0,0x0c,
//------------3----------------
29,0x01,6+0,0x04,3+7,0x04,1+7,0x02,
5+7,0x0c,
29,0x01,3+7,0x02,5+7,0x02,4+21,0x06,2+7,0x02,
2+7,0x02,3+7,0x02,3+7,0x0c,
29,0x01,6+0,0x04,3+7,0x04,1+7,0x02,
2+7,0x0c,
29,0x01,6+0,0x02,1+7,0x02,7+0,0x06,5+0,0x02,
5+0,0x02,6+0,0x02,6+0,0x0c,
//-----------4-------------
29,0x01,6+0,0x02,6+0,0x02,6+7,0x06,5+7,0x02,
6+7,0x10,
29,0x01,6+7,0x02,1+14,0x02,7+7,0x02,6+7,0x02,5+7,0x03,6+7,0x03,
3+7,0x04,2+7,0x02,3+7,0x08,
29,0x01,3+7,0x02,5+7,0x02,4+21,0x02,3+7,0x02,2+7,0x02,3+7,0x02,
7+0,0x04,6+0,0x02,7+0,0x02,7+0,0x05,
7+7,0x02,6+7,0x02,5+7,0x04,4+21,0x02,
3+7,0x010,
//-----------5----------------
29,0x02,6+0,0x04,3+7,0x06,1+7,0x02,
5+7,0x10,
29,0x01,3+7,0x02,5+7,0x02,4+21,0x06,2+7,0x02,
2+7,0x02,3+7,0x02,3+7,0x0c,
29,0x01,6+0,0x04,3+7,0x06,1+7,0x02,
2+7,0x0c,
29,0x02,6+0,0x02,1+7,0x02,7+0,0x06,5+0,0x02,
5+0,0x02,6+0,0x02,6+0,0x0c,

//---------------6-------
29,0x02,6+0,0x04,3+7,0x04,1+7,0x04,
5+7,0x0c,
4+21,0x06,2+7,0x02,2+7,0x04,3+7,0x02,2+7,0x02,
3+7,0x0c,29,0x01,1+7,0x02,
2+7,0x0c,29,0x01,3+7,0x02,
4+7,0x0c,1+14,0x04,
7+7,0x08,5+7,0x08,
6+7,0x10,

//------------1------------
29,0x01,6+0,0x04,3+7,0x04,1+7,0x02,
5+7,0x10,
29,0x01,3+7,0x02,5+7,0x02,4+21,0x06,2+7,0x04,
2+7,0x02,3+7,0x02,3+7,0x0c,
29,0x01,6+0,0x04,3+7,0x04,1+7,0x02,
2+7,0x0c,
29,0x01,6+0,0x02,1+7,0x02,7+0,0x06,5+0,0x02,
5+0,0x02,6+0,0x02,6+0,0x0c,
//------------2----------------
29,0x01,6+0,0x04,3+7,0x04,1+7,0x02,
5+7,0x0c,
29,0x01,3+7,0x02,5+7,0x02,4+21,0x06,2+7,0x02,
2+7,0x02,3+7,0x02,3+7,0x0c,
29,0x01,6+0,0x04,3+7,0x04,1+7,0x02,
2+7,0x0c,
29,0x01,6+0,0x02,1+7,0x02,7+0,0x06,5+0,0x02,
5+0,0x02,6+0,0x02,6+0,0x0c,
//-----------3-------------
29,0x01,6+0,0x02,6+0,0x02,6+7,0x06,5+7,0x02,
6+7,0x10,
29,0x01,6+7,0x02,1+14,0x02,7+7,0x02,6+7,0x02,5+7,0x03,6+7,0x03,
3+7,0x04,2+7,0x02,3+7,0x08,
29,0x01,3+7,0x02,5+7,0x02,4+21,0x02,3+7,0x02,2+7,0x02,3+7,0x02,
7+0,0x04,6+0,0x02,7+0,0x02,7+0,0x05,
7+7,0x02,6+7,0x02,5+7,0x04,4+21,0x02,
3+7,0x010,
//-----------4----------------
29,0x02,6+0,0x04,3+7,0x06,1+7,0x02,
5+7,0x10,
29,0x01,3+7,0x02,5+7,0x02,4+21,0x06,2+7,0x02,
2+7,0x02,3+7,0x02,3+7,0x0c,
29,0x01,6+0,0x04,3+7,0x06,1+7,0x02,
2+7,0x0c,
29,0x02,6+0,0x02,1+7,0x02,7+0,0x06,5+0,0x02,
5+0,0x02,6+0,0x02,6+0,0x0c,

//---------------5-------
29,0x02,6+0,0x04,3+7,0x04,1+7,0x04,
5+7,0x0c,
4+21,0x06,2+7,0x02,2+7,0x04,3+7,0x02,2+7,0x02,
3+7,0x0c,29,0x01,1+7,0x02,
2+7,0x0c,29,0x01,3+7,0x02,
4+7,0x0c,1+14,0x04,
7+7,0x08,5+7,0x08,
6+7,0x10,
2+7,0x10,
6+0,0x10,
2+7,0x10,
6+0,0x10,
//------------6-------
0,0x00
};
/*=====================================================================*/
/*==========定时器0中断服务============*/
void timer0() interrupt 1
{
	TH0=th0;		//重装定时常数                                                             
	TL0=tl0;
	beep=!beep;		//输出倒相
	
}
/*======================================*/
/*==========10us级延时子程序============*/
void delay_10us(uchar n)
{
	do
	{
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
	}while(n--);
}
/*======================================*/
/*==========毫秒级延时==================*/
void delay_ms(uchar n)
{
	do delay_10us(131);
	while(n--);
}
/*======================================*/
/*==========主函数===============*/
void main()
{

	uchar i,j;
	TMOD=0x01;//设定定时器为工作方式1
	IE=0x82;//开定时器1,0中断
	//IP=0x02;		
	//TH0=(65536-50000)/256;
	//TL0=(65536-50000)%256;
	
	while(1)
	{
		i=0;
				
		while(notetab[i].delay)		//音符的持续时间不为0
		{
			P1=0x00;//开led
			if(!notetab[i].delay)
				TR0=0;				//如果音符持续时间为0,关闭定时器0
			else 
			{
				th0=TH0=tonetab_E[notetab[i].tone-1]>>8;
				tl0=TL0=tonetab_E[notetab[i].tone-1]&0xff;
					TR0=1;			//启动定时器0
			}
		
			for(j=0;j<notetab[i].delay;j++)
			delay_ms(70);	//音符的持续时间
			i++;
			P1=0xff;
			delay_ms(70);	//关Led
		}
		TR0=0;		//停止演奏
		delay_ms(200);	//延时2s
	}
}

⌨️ 快捷键说明

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