📄 yinyue.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 + -