📄 无线遥控音乐.c
字号:
0x42,0x32,0x32,0x12,0x44,0x51,0x71,
0x72,0x72,0x71,0x82,0x71,0x84,0x52,0x42,
0x32,0x32,0x32,0x41,0x51,0x54,0x51,0x71,
0x72,0x72,0x72,0x81,0xA1,0xA2,0x82,0x72,0x51,0x41,
0x42,0x42,0x44,0x32,0x51,0x61,
0x72,0x42,0x44,0x52,0x41,0x31,
0x34,0x52,0x41,0x31,0x34,0x52,0x42,
0x52,0x32,0x52,0x81,0x71,0x74,0x51,0x71,
0x82,0x81,0x71,0x72,0x81,0x71,0x74,0x51,0x41,0x31,
0x42,0x41,0x51,0x42,0x31,0x41,0x44,0x52,0x41,0x31,
0x34,0x52,0x41,0x31,0x34,0x52,0x42,
0x52,0x32,0x52,0x81,0x71,0x74,0x51,0x41,
0x82,0x82,0xA2,0x71,0x81,0x72,0x71,0x51,0x41,0x31,
0x44,0x41,0x31,0x41,0x51,0x44,0x52,0x52,
0x42,0x31,0x34,0x52,0x41,0x31,
0x42,0x31,0x34,
0xFF};
//第八首 偏偏喜欢你
unsigned char code song8[]={
0XC2,0XB2,
0X36,0X52,0X42,0X32,0X11,0XC1,0XB2,
0XC6,0X12,0XC4,0X12,0XC2,
0X76,0XA2,0X82,0X72,0X51,0X41,0X32,
0X4C,0X42,0X32,
0X74,0X82,0X74,0X82,0X72,
0X52,0X41,0X38,0X32,0X42,
0X16,0XC2,0X72,0X52,0X42,0X42,
0X3C,0XC2,0XB2,
0X36,0X52,0X42,0X32,0X11,0XC1,0XB2,
0XC6,0X12,0XC4,0X12,0XC2,
0X76,0XA2,0X82,0X72,0X51,0X41,0X32,
0X4C,0X42,0X32,
0X76,0X82,0X74,0X82,0X72,
0X53,0X41,0X38,0X32,0X42,
0X16,0XC2,0X72,0X52,0X41,0X51,0X12,
0XCC,0XC2,0XB2,
0X16,0XC2,0X72,0X52,0X42,0X42,
0X3C,0X32,0X32,
0X26,0X22,0X24,0X42,0X32,
0x22,0x12,0x18,0x02,0x52,
0X46,0X12,0X44,0X72,0X82,
0X5C,0X52,0X52,
0X46,0X42,0X74,0X42,0X32,
0X36,0X42,0X58,
0X82,0X72,0X62,0X52,0X46,0X32,
0X3C,0X12,0XB2,
0X36,0X52,0X42,0X32,0X11,0XC1,0XB2,
0XC6,0X12,0XC4,0X12,0XC2,
0X76,0XA2,0X82,0X72,0X51,0X41,0X32,
0X48,0X02,0X42,0X52,0X62,
0X76,0X82,0X74,0X82,0X72,
0X56,0X41,0X38,0X32,0X22,
0X16,0XC2,0X72,0X52,0X42,0X42,
0X3C,0X04,0X04,0X04,0X04,
0xFF};
unsigned char code* code songs[]={song0,song1,song2,song3,song4,song5,song6,
song7,song8}; //指向8首歌
/*C调各音符频率与计数初值T的对照表*/
unsigned char code yin[30]={0xFF,0xFF,0xFB,0x90,0xFC,0x0C,0xFC,0x44,
0xFC,0xAC,0xFD,0x09,0xFD,0x34,0xFD,0x82,
0xFD,0xC8,0xFE,0x06,0xFE,0x22,0xFA,0X15,
0XFB,0x04,0xFA,0x67,0xFE,0x85};
/*****延时1ms****/
void delay1ms(void)
{
unsigned char i,j;
for(i=2;i>0;i--)
for(j=230;j>0;j--) ;
}
/*延时1/4拍时间即187ms*/
void delay187ms()
{
unsigned char i,j;
for(i=255;i>0;i--)
{
for(j=120;j>0;j--)
{
if(wl_OK==1) {break;}
}
}
}
/******每个音符的发声******/
void timer0() interrupt 1 using 1 //定时器T0
{
TH0=yin[2*l];
TL0=yin[2*l+1];
SPK = !SPK;
}
/******演奏函数******/
void sing_song()
{
unsigned int data j; //取码指针
unsigned char data i; //用于循环
unsigned char data k; //几个1/4拍
wl_OK=0; //不能少掉!!!!
song=songs[song_number];
j=0;
while(*(song+j)!=0xFF) //是否取到结束码
{
if(wl_OK==1){break;} //这一句很重要的!!!!!
k=*(song+j)&0x0F; //后4位为多少个1/4拍
l=*(song+j)>>4; //song(song+j)[]中所放的每个字节
//前4位乘2表示为音符频率在数组yin[]中的位置
TH0=yin[2*l]; //置初值
TL0=yin[2*l+1];
TR0=1; //起动定时器0
if ((yin[2*l]==0xff)&&(yin[2*l+1]==0xff)) //如果取到的都是休止符,则不输出音频
{
TR0=0;SPK=1;
}
for(i=k;i>0;--i) //节拍K为多少就执行多少个1/4拍
{ delay187ms(); }
TR0=0;
j++;
} //回22222
} //回xxxxxx
/******端口值读取函数*****/
void Getch()
{
P1=0x0f; //先对P2置数,进行行扫描//
if(P1!=0x0f) //判断端口数据是否变化//
{
delay1ms(); //软件延时//
if(P1!=0x0f) //确认端口数据变化//
{
P0=P1; //送到P0口显示第几首音乐
song_number=P1; //调整音乐曲目
}
}
}
/*****主函数*****/
void main()
{
EA=1; //总中断
TMOD=0x01; //timer0工作在方式1
IT0=1; //外部中断0触发方式控制位,下降沿触发
ET0=1; //允许定时器T0中断
EX0=1; //外部中断0(INT0)中断允许位
IP=0x01; //定义外部中断0优先于定时器中断的优先级
P0=0x00;
wl_OK=0;
while(1)
{
if(wl_OK==1)
sing_song(); //演奏
else P0=0; //等待
}
}
/*****外部中断T0*****/
void t0(void) interrupt 0 using 2//外部中断0的函数
{
EA=0; //关总中断
wl_OK=1; //接到无线信号
Getch(); //端口扫描
EA=1; //开总中断
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -