#include "reg52.h"
typedef unsigned char uchar; //数据类型重命名
typedef unsigned int uint ;
sbit Led = P3^7; //小灯
sbit Sound = P3^5; //喇叭
uchar TH0_val,TL0_val; //定时器0高低8位
uchar time,flag,num=0; //延时形参 算歌曲的节拍 flag标志位用于切换功能 num用于录音计数
uchar count=0;
uint code C_music[] = { 63628,63835,64021,64103,64260,64400,64524, //低音DO RA M FA SO LA SI
64580,64684,64777,64820,64898,64968,65030, //中音DO RA M FA SO LA SI
65058,65110,65157,65178,65217,65252,65283};//高音DO RA M FA SO LA SI
uint code C_music_1[] = {64580,64684,64777,64820,64898,64968,65030};
uchar code star[] = {1,1,2,1,1,2,5,1,2,5,1,2,6,1,2,6,1,2,5,1,4,4,1,2,4,1,2,3,1,2,3,1,2,2,1,2,2,1,2,1,1,4,
5,1,2,5,1,2,4,1,2,4,1,2,3,1,2,3,1,2,2,1,4,5,1,2,5,1,2,4,1,2,4,1,2,3,1,2,3,1,2,2,1,4,
1,1,2,1,1,2,5,1,2,5,1,2,6,1,2,6,1,2,5,1,4,4,1,2,4,1,2,3,1,2,3,1,2,2,1,2,2,1,2,1,1,4,
0,0,0};
uchar F_H [20]; //录音数组
void Delay_Init(uchar n) //延时1毫秒
{
uchar i;
while(n--)
for(i = 0; i < 125; i++);
}
void delay(unsigned char t)//延时t半个节拍
{
unsigned char t1;
unsigned long t2;
for(t1 = 0; t1 < t; t1++)
for(t2 = 0; t2 < 8000; t2++);
TR0 = 0;
}
void delay_1(unsigned char t)//延时t半个节拍
{
unsigned char t1;
unsigned long t2;
for(t1 = 0; t1 < t; t1++)
for(t2 = 0; t2 < 5000; t2++);
TR0 = 0;
}
void Play_songs() //播放歌曲中一个音符函数
{
TH0 = TH0_val; //重新给初值 设置溢出时间
TL0 = TL0_val;
TR0 = 1;
delay(time); //等待音符播放完毕
}
void Play_music(uchar song[]) //播放歌曲函数
{
unsigned char k, i;
i = 0;
time = 1;
while(time)
{ //Delay_Init(3);
k = song[i] + 7 * song[i+1] - 1; //i代表音符1~7 i+1代表哪个八度 i+2代表音符占几个节拍
TH0_val = C_music[k]/256; //定时器初值
TL0_val = C_music[k]%256;
time = song[i+2];
i +=3;
Play_songs();
if(flag==2) //等待功能切换键 结束播放
{
break;
}
}
}
void Comman_Init() //常规初始化
{
TMOD = 0x01; //定时器0 方式1
TH0 = 0xff;
TL0 = 0xff;
ET0 = 1;
IT0 = 1; //下降沿触发
EX0 = 1;
EA = 1;
}
void Led_Init() //小灯的闪灭
{
Led = 0;
Delay_Init(100);
Led = 1;
}
void Keyscan() //键盘扫描
{
uchar key,Key_val;
key = P1;
if(key != 0xff)
{
switch(key)
{
case 0x7f:Key_val=0;Led_Init();break; //Key_val 代表中音音符 DO RA M FA SO LA SI 高音 DO
case 0xbf:Key_val=1;Led_Init();break;
case 0xdf:Key_val=2;Led_Init();break;
case 0xef:Key_val=3;Led_Init();break;
case 0xf7:Key_val=4;Led_Init();break;
case 0xfb:Key_val=5;Led_Init();break;
case 0xfd:Key_val=6;Led_Init();break;
case 0xfe:Key_val=7;Led_Init();break;
}
TH0_val = C_music[Key_val+7]/256;
TL0_val = C_music[Key_val+7]%256;
TR0 = 1;
}
else
{
Sound = 1;
TR0 = 0;
}
}
void Keyscan_s()
{
switch(P1)
{
case 0x7f:Led_Init();Play_music(nanhai);break; //star
}
}
void main()
{
uchar Key_val_1;
Comman_Init(); //初始化
while(1)
{
if(flag==0) //判断哪种功能
{
Keyscan(); //单音符播放
}
else if(flag==1)
{
Keyscan_s(); //整首歌曲播放
}
}
else
{
TR0=0;
Sound =1;
}
}
if(flag==2) //退出播放
{
TR0=0;
Sound =1;
}
}
}
}
void int0_Enable() interrupt 0 //中断服务程序
{
Led_Init();
flag++;
if(flag==5)
{
flag=0;
}
}
void T0_Enable() interrupt 1 //定时器服务程序
{
TH0 = TH0_val; //重新赋值 为下次溢出做准备
TL0 = TL0_val;
Sound = ~Sound;
}