将高四位移至低四位,并将其中唯一的0 变成1,其余为0 //对0~3行分别附加其初始值0,4,8,12 switch(tmp)
{case 1:k+=0; break; case 2:k+=4; break; case 4:k+=8; break; case 8:k+=12; break; default:return;}
keyno=k; //将k的值赋给keyno由数码管输出 }
//---------------------------简谱--------------------------------------- //编程规则:字节高位是简谱,低位是持续时间, //代表多少个十六分音符
//1-7代表中央C调,8-E代表高八度,0代表停顿 //最后的0是结束标志
uchar code qnzl[]={ //千年之恋
0x12,0x22,0x34,0x84,0x74,0x54,0x38,0x42,0x32,0x22,0x42,0x34,0x84,0x72,0x82,0x94,0xA8,0x08,
0x32,0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62,
0x32,0x31,0x21,0x32,0x82,0x71,0x81,0x71,0x51,0x32,0x22, 0x32,0x31,0x21,0x32,0x52,0x32,0x31,0x21,0x32,0x62, 0x32,0x31,0x21,0x32,0x83,0x82,0x71,0x72,0x02, 0x63,0xA1,0xA2,0x62,0x92,0x82,0x52,
0x31,0x51,0x63,0x51,0x63,0x51,0x63,0x51,0x62,0x82,0x7C,0x02, 0x61,0x71,0x82,0x71,0x62,0xA2,0x71,0x76, 0x61,0x71,0x82,0x71,0x62,0x52,0x31,0x36,
0x61,0x71,0x82,0x71,0x62,0xA3,0x73,0x62,0x53, 0x42,0x63,0x83,0x83,0x91,0x91,
0x61,0x71,0x82,0x71,0x62,0x0A2,0x71,0x76, 0x61,0x71,0x82,0x71,0x62,0x52,0x31,0x36,
0x61,0x71,0x82,0x71,0x62,0xA3,0x73,0x62,0x53, 0x42,0x82,0x88,0x02,0x74,0x93,0x89,0xff//结束标志 };
uchar code jmszl[]={ //寂寞沙洲冷
0x12,0x12,0x22,0x32,0x31,0x22,0x21,0x22,
0x21,0x31,0x51,0x52,0x31,0x52,0x61,0x15,0x14,
0x51,0x52,0x31,0x52,0x62,0x13,0x11,0x13,0x32,0x28,0x08,0x28, 0x31,0x32,0x31,0x32,0x11,0x21,0x51,0x52,0x51,0x52, 0x51,0x51,0x31,0x32,0x31,0x32,0x81,0x72,0x63,
0x62,0x71,0x81,0x72,0x61,0x61,0x52,0x31,0x21,0x32,0x51,0x54, 0x22,0x12,0x11,0x12,0x11,0x12,0x12,0x14,0x26,0x32,0x26,
0x32,0x61,0x51,0x51,0x31,0x31,0x21,0x31,0x51,0x61,0x51,0x31,0x51, 0x02,0x32,0x81,0x81,0x81,0x81,0x62,0x52,0x34, 0x31,0x81,0x81,0x81,0x61,0x91,0x82,
第 24 页 共 32 页
0x51,0x51,0x51,0x51,0x31,0x61,0x53,
0x21,0x11,0x21,0x11,0x22,0x11,0x21,0x26,
0x32,0x61,0x51,0x51,0x31,0x31,0x21,0x31,0x51,0x61,0x51,0x31,0x51,0x52, 0x31,0x31,0x81,0x81,0x81,0x61,0x91,0x81,0x61,0x31,0x56,
0x32,0x32,0x81,0x81,0x81,0x81,0x91,0x81,0x61,0x81,0x61,0x51,0x31,0x51,0x34, 0x21,0x31,0x51,0x31,0x21,0x11,0x61,0x21,0x16, 0xff//结束标志 };
uchar code qizige[]={ //七子之歌
0x54,0x32,0x52,0x32,0x54,0x62,0x52,0x32,0x62,0x54, 0x14,0x12,0x22,0x34,0x52,0x32,0x02,0x32,0x58,
0x52,0x52,0x62,0x52,0x32,0x54,0x52,0x62,0x52,0x82,0x62,0x58, 0x14,0x52,0x32,0x22,0x12,0x24,0x32,0x54,0x2,0x22,0x34,0x1f,0x18,
0x04,0x54,0xa4,0x92,0x81,0x62,0x52,0x54,0x62,0x64,0x52,0x62,0x81,0xa2,0x82,0x9c,
0x02,0x52,0xa4,0x92,0x81,0x62,0x52,0x54,0x62,0x64,0x52,0x64,0xa2,0x92,0x9f, 0xa4,0x92,0x81,0x62,0x52,0x54,0x84,0x62,0x52,0x32,0x22,0x14, 0x04,0x22,0x32,0x58,0x58,0x04,0x52,0x62,0x8f, 0xff//结束标志 };
uchar code ganen[]={ //感恩的心
0x12,0x14,0x22,0x32,0x54,0x32,0x84,0x72,0x62,0x54, 0x02,0x62,0x62,0x52,0x54,0x12,0x22,0x32,0x28,
0x12,0x14,0x22,0x32,0x54,0x32,0x84,0x92,0x82,0x54, 0x32,0x24,0x21,0x61,0x54,0x22,0x32,0x12,0x18,
0x22,0x24,0x12,0x24,0x11,0x21,0x34,0x32,0x21,0x31,0x34,
0x12,0x22,0x22,0x22,0x11,0x21,0x22,0x64,0x52,0x52,0x32,0x38,
0x31,0x52,0x51,0x52,0x31,0x51,0x58,0x31,0x82,0x81,0x82,0x31,0x61,0x68, 0x62,0x62,0x62,0x51,0x61,0x64,0x61,0x82,0x61,0x9c,
0x52,0xa4,0x92,0xa4,0x32,0x84,0x72,0x64,0x62,0x94,0x82,0x94,
0x61,0x81,0x92,0x91,0x91,0x92,0x81,0xa1,0xa2,0x92,0x94, 0x52,0xa4,0x92,0xa4,0x32,0x84,0x72,0x64, 0x52,0x62,0x81,0x81,0x82,0x92,0xa2,0x94,0x82,0x72,0x82,0x88, 0xff//结束标志 };
//----------------------------简谱音调对应的定时器初值---------------------------
//适合11.0592M的晶振 uchar code cuzhi[]={ 0xff,0xff,//占位
0xFC,0x8E,//中央C调1-7 0xFC,0xED,
第 25 页 共 32 页
0xFD,0x43, 0xFD,0x6A, 0xFD,0xB3, 0xFD,0xF3, 0xFE,0x2D,
0xFE,0x47, //高八度1-7 0xFE,0x76, 0xFE,0xA1, 0xFE,0xC7, 0xFE,0xD9, 0xFE,0xF9, 0xFF,0x16 };
void delay1(uint z); //延时1MS
void delay(uint z); //延时165MS,即十六分音符void song();
void beep();//蜂鸣器叫一声 void main() {
P0=0xbf; KK=0;
count2=0; //不唱歌 EA=1;//开总中断
EX0=1;//开外部中断0
IT0=1;//外部中断0下降沿触发方式 EX1=1;//开外部中断1
IT1=1;//外部中断1下降沿触发方式 TMOD=0x01;//定时器0工作在方式1 TH0=0; TL0=0; ET0=1; while(1) {
if(count2!=0) {
song();
delay1(1000); }
if(count2==0)
{ keys_scan(); //矩阵键盘无限扫描 P1=0xf0; if(P1!=0xf0) {
第 26 页 共 32 页
P0=DSY_table[keyno]; TR0=1; }
if(P1==0XF0) {TR0=0; }
delay_ms(2); } } }
void int0() interrupt 0 {
EA=0;//关总中断 delay1(1);//去抖 if(key1==0) {
count2=0; //暂停音乐 TR0=0; } EA=1; }
void int1() interrupt 2 {
TR0 = 0;
delay1(1);//去抖 if(key2==0) {
i=0;//从头开始唱 count2++; TR0=~TR0; if(count2==5) count2=0; } }
void timer0() interrupt 1 //用于产生各种音调{
if(count2==0) {
TH0=tone_delay_table[keyno]/256; TL0=tone_delay_table[keyno]%6;
第 27 页 共 32 页
fm=~fm; }
if(count2!=0) {
TH0=timeh; TL0=timel; fm=~fm; } }
void song() {
uint temp;
uchar jp;//jp是简谱 i=0; while(1)
{ if(count2==0) {
break; }
if(count2==1) //选曲 temp=jmszl[i]; if(count2==2)
temp=qnzl[i]; if(count2==3)
temp=qizige[i]; if(count2==4)
temp=ganen[i]; if(temp==0xff) break;
jp=temp/16; //取数的高4位 if(jp!=0) {
timeh=cuzhi[jp*2]; timel=cuzhi[jp*2+1]; } else { TR0=0;
fm=1;//关蜂鸣器 }
delay(temp); //取数的低4位 TR0=0; //唱完一个音停10MS fm=1;
第 28 页 共 32 页