//用定时器产生延迟,并通过蜂鸣器来播放一段旋律,下表为各个音符对应的频率值
//---------------------------------------------------------------------------------------------------------------------------------------------
//简谱 1 2 3 4 5 6 7 1 2 3 4 5 6 7 1
//频率 523 587 659 698 784 880 987 1046 1174 1318 1396 1567 1760 1975 2092
//周期(us) 1912.04 1703.58 1517.45 1432.7 1275.5 1136.4 1013.2 956 851.8 758.7 716.3 638.2 568.2 506.3 478
//半周期 956 851.8 758.73 716.3 637.7 568.2 506.6 478 425.9 379.3 358.1 319.1 284.1 253.1 239
//本程序对应的数字 0xEF 0xD5 0xCE 0xb3 0xa0 0x8e 0x7f 0x78 0x6A 0x5f 0x5a 0x50 0x47 0x3f 0x3c
//----------------------------------------------------------------------------------------
//
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
sbit BEEP=P3^7; //喇叭输出端
sbit LED=P0^5; //指示灯端口
uchar Song_index;
uchar status; //用于判断按键是否按下
uchar code song[]={0x78,0x10,0x6A,0x10,0x5F,0x10,0x78,0x10,0x78,0x10,0x6A,0x10,0x5F,0x10,0x78,0x10,0x5F,0x10,0x5A,0x10,0x50,0x20,0x5F,0x10,0x5A,0x10,0x50,0x20,
0x50,0x08,0x47,0x08,0x50,0x08,0x5A,0x05,0x5F,0x10,0x78,0x10,0x50,0x08,0x47,0x08,0x50,0x08,0x5A,0x08,0x5F,0x10,0x78,0x10,
0x78,0x10,0xA0,0x10,0x78,0x20,0x78,0x10,0xA0,0x10,0x78,0x20,0x00,//两只老虎
0x5F,0x10,0x5F,0x10,0x5F,0x10,0x6A,0x10,0x5F,0x40,
0x6A,0x10,0x5F,0x10,0x6A,0x10,0x6A,0x10,0x8E,0x20,0x8E,0x10,0x7F,0x10,0x78,0x20,0x6A,0x10,
0x78,0x10,0x7F,0x20,0x8E,0x10,0xA0,0x10,0x8E,0x80,/*一起走过*/
0x5F,0x10,0x5F,0x10,0x5F,0x10,0x6A,0x10,0x5F,0x30,0x47,0x10,0x50,0x10,0x47,0x10,0x50,0x10,0x50,0x10,0x6A,0x20,
0x6A,0x10,0x5F,0x10,0x5A,0x20,0x50,0x10,0x5A,0x10,0x5F,0x20,0x6A,0x10,0x78,0x10,0x5F,0x70,/*的承诺*/
0x5F,0x10,0x47,0x20,0x3F,0x10,0x47,0x10,0x50,0x30,0x5F,0x10,0x50,0x60,/*飘过*/
0x5F,0x10,0x50,0x10,0x6A,0x20,0x47,0x10,0x50,0x10,0x5F,0x20,0x6A,0x10,0x6A,0x10,0x5F,0x80,/*传说*/
0x6A,0x20,0x47,0x10,0x47,0x50,0x78,0x20,0x47,0x10,0x47,0x30,0x47,0x10,0x3F,0x10,0x3C,0x20,/*天地痴*/
0x3F,0x10,0x47,0x10,0x3F,0x20,0x50,0x20,0x47,0x80,0x00,0x00};
/*uchar code song2[]={0x5F,0x10,0x5F,0x10,0x5F,0x10,0x6A,0x10,0x5F,0x40,
0x6A,0x10,0x5F,0x10,0x6A,0x10,0x6A,0x10,0x8E,0x20,0x8E,0x10,0x7F,0x10,0x78,0x20,0x6A,0x10,
0x78,0x10,0x7F,0x20,0x8E,0x10,0xA0,0x10,0x8E,0x80,//一起走过
0x5F,0x10,0x5F,0x10,0x5F,0x10,0x6A,0x10,0x5F,0x30,0x47,0x10,0x50,0x10,0x47,0x10,0x50,0x10,0x50,0x10,0x6A,0x20,
0x6A,0x10,0x5F,0x10,0x5A,0x20,0x50,0x10,0x5A,0x10,0x5F,0x20,0x6A,0x10,0x78,0x10,0x5F,0x70,//的承诺
0x5F,0x10,0x47,0x20,0x3F,0x10,0x47,0x10,0x50,0x30,0x5F,0x10,0x50,0x60,//飘过
0x5F,0x10,0x50,0x10,0x6A,0x20,0x47,0x10,0x50,0x10,0x5F,0x20,0x6A,0x10,0x6A,0x10,0x5F,0x80,//传说
0x6A,0x20,0x47,0x10,0x47,0x50,0x78,0x20,0x47,0x10,0x47,0x30,0x47,0x10,0x3F,0x10,0x3C,0x20,//天地痴
0x3F,0x10,0x47,0x10,0x3F,0x20,0x50,0x20,0x47,0x80,0x00,0x00};*/
uint count;
//Function Prototype
void Play_Song(uchar);
//
void t0(void) interrupt 1 //Time 0定时器中断
{
TH0=0xC3;
TL0=0x68;
count++;
}
void update_song(void) //检测按钮,并选择相应的歌曲进行播放:当Into0按下时,从头开始播放第一首;当Into1按下时,从头开始播放第二首
{
status=P3;
if(status==247)
Play_Song(0);
else if(status==251)
Play_Song(1);
}
void Delay_xMs(unsigned char x) //延迟
{
uchar i,j;
for (i=0;i<x;i++)
{
for(j=0;j<4;j++);
}
}
void Time0_Init(void) //用定时器定时:15ms
{
IE=0x82; //允许定时器0中断
TH0=0xC3;
TL0=0x68;
TMOD=0x01; //选择模式1:16位计数器;并且TR0=1就会启动定时功能
}
void Change_State(unsigned char j)
{
Delay_xMs(j);
BEEP=~BEEP;
LED=~LED;
}
void Play_Song(uchar i)
{
uint addr=65*i;
unsigned char temp1,temp2;
count=0;
TR0=1;
while(1)
{
update_song();
temp1=song[addr++];
temp2=song[addr++];
if(temp1==0x00)
{
addr=65*i;
Delay_xMs(50000);
continue;
}
TR0=1;
while(1)
{
Change_State(temp1);
if(count==temp2)
{
count=0;
TR0=0;
Delay_xMs(10000);
break;
}
}
}
}
void main(void)
{
Time0_Init();
Play_Song(0);
/* uint addr=0;
unsigned char temp1,temp2;
Time0_Init();
count=0;
TR0=1;
Song_index=0;
flag=0;
while(1)
{
if(Song_index!=flag)
{
addr=64*Song_index;
flag=Song_index;
continue;
}
temp1=song[addr++];
temp2=song[addr++];
if(temp1==0x00)
{
addr=64*Song_index;
Delay_xMs(50000);
continue;
}
TR0=1;
while(1)
{
Change_State(temp1);
if(count==temp2)
{
count=0;
TR0=0;
Delay_xMs(10000);
break;
}
}
}*/
}
- 1
- 2
前往页