#include<reg51.h>//51单片机头文件 typedef unsigned char uchar; typedef unsigned int uint; sbit RS=P2^7;//LCD1602数据/命令选择端(H/L) sbit RW=P2^6;//LCD1602读/写选择端(H/L) sbit E=P2^5;//LCD1602使能信号端 sbit BEEP=P2^0;//蜂鸣器接口 sbit k1=P3^2;//下一首 sbit k2=P3^3;//上一首 sbit k3=P2^1;//播放/暂停 sbit k4=P2^2;//复位 char count2;//歌曲标志 uchar a,b,c,aa,num; uchar num1,num2; //---------------------------简谱--------------------------------------- //编程规则:字节高位是简谱,低位是持续时间, //代表多少个十六分音符 //1-7代表中央C调,8-E代表高八度,0代表停顿 //最后的0是结束标志 uchar code table1[]={ //千年之恋 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 table2[]={ //寂寞沙洲冷 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,//有花儿伴着蝴蝶 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 table3[]={ 0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20, 0x30,0x20,0x39,0x10,0x30,0x10,0x30,0x80,0x26,0x20,0x20,0x20,0x20,0x20,0x1c,0x20, 0x20,0x80,0x2b,0x20,0x26,0x20,0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x80,0x26,0x20, 0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x60,0x40,0x10,0x39,0x10,0x26,0x20, 0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x80,0x26,0x20,0x2b,0x10,0x2b,0x10, 0x2b,0x20,0x30,0x10,0x39,0x10,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x20, 0x20,0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x18,0x20,0x18,0x20,0x26,0x20, 0x20,0x20,0x20,0x40,0x26,0x20,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,0x20,0x20, 0x20,0x80,0x1c,0x20,0x1c,0x20,0x1c,0x20,0x30,0x20,0x30,0x60,0x39,0x10,0x30,0x10, 0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x10,0x26,0x10,0x26,0x10,0x2b,0x10,0x2b,0x80, 0x18,0x20,0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x60,0x26,0x10,0x2b,0x20,0x30,0x20, 0x30,0x20,0x1c,0x20,0x20,0x20,0x20,0x80,0x26,0x20,0x30,0x10,0x30,0x10,0x30,0x20, 0x39,0x20,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x10,0x40,0x10,0x20,0x10, 0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0xff, }; uchar code table4[]={ 0x30,0x1C,0x10,0x20,0x40,0x1C,0x10,0x18,0x10,0x20,0x10,0x1C,0x10,0x18,0x40,0x1C, 0x20,0x20,0x20,0x1C,0x20,0x18,0x20,0x20,0x80,0xFF,0x20,0x30,0x1C,0x10,0x18,0x20, 0x15,0x20,0x1C,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20, 0x30,0x80,0xFF,0x20,0x20,0x1C,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30, 0x20,0x2B,0x40,0x20,0x20,0x1C,0x10,0x18,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30, 0x20,0x2B,0x40,0x20,0x30,0x1C,0x10,0x18,0x20,0x15,0x20,0x1C,0x20,0x20,0x20,0x26, 0x40,0x20,0x20,0x2B,0x20,0x26,0x20,0x20,0x20,0x30,0x80,0x20,0x30,0x1C,0x10,0x20, 0x10,0x1C,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20,0x15,0x1F, 0x05,0x20,0x10,0x1C,0x10,0x20,0x20,0x26,0x20,0x2B,0x20,0x30,0x20,0x2B,0x40,0x20, 0x30,0x1C,0x10,0x18,0x20,0x15,0x20,0x1C,0x20,0x20,0x20,0x26,0x40,0x20,0x20,0x2B, 0x20,0x26,0x20,0x20,0x20,0x30,0x30,0x20,0x30,0x1C,0x10,0x18,0x40,0x1C,0x20,0x20, 0x20,0x26,0x40,0x13,0x60,0x18,0x20,0x15,0x40,0x13,0x40,0x18,0x80,0xff, }; //简谱音调对应的定时器初值 //适合12的晶振 uchar code cuzhi[]={ 0xff,0xff,//占位 0xFC,0x8E,//中央C调1-7 0xFC,0xED, 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 }; uchar code yinyue[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x00,0x00}; //将音调转化为对应的LED样式 //延时165MS,即十六分音符子函数 void delay1(uint z) { uint x,y; for(x=z;x>0;x--) for(y=19000;y>0;y--); } //延时1MS子函数 void delay2(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } //LCD1602液晶写命令子函数 void write_com(uchar com) { RS=0; //选择写指令 RW=0; E=0; P0=com; E=1; delay2(5); //无延时不能正常工作 E=0; } //LCD1602液晶写数据子函数 void write_date(uchar date) { RS=1; //选择写数据 RW=0; E=0; P0=date; E=1; delay2(5); //无延时不能正常工作 E=0; } //LCD1602液晶初始化子函数 void LCD1602_init() //初始化 { delay2(15); //主函数 void main() { TMOD=0x11;//定时器0工作在方式1 TH1=0; TL1=0; ET1=1; TH0=0; TL0=0; ET0=1; TR0=1; EA=1;//开总中断 EX1=1;//开外部中断1 IT1=1;//下降沿时触发中断 EX0=1;//开外部中断0 IT0=1;//下降沿时触发中断 count2=0;//唱第一首歌 LCD1602_init(); while(1)//大循环 { song(); } } //定时器0中断子函数 void t0() interrupt 1 { num2++; if(num2==5) { num2=0; key(); } } //定时器1中断子函数 void t1() interrupt 3 //用于产生各种音调 { TH1=a; TL1=b; BEEP=~BEEP; } void wb0() interrupt 0 { TR1=0; if(k1==0) { delay2(10); if(k1==0) { count2++; c=0;//从头开始唱 if(count2==1) { write_com(0x01); delay2(10); write_com(0x80+0); write_date(' '); write_com(0x80+1); write_date(' '); write_com(0x80+2); write_date(' '); write_com(0x80+3); write_com(0xc0+8); write_date(' '); write_com(0xc0+9); write_date('f'); write_com(0xc0+10); write_date('l'); write_com(0xc0+11); write_date('o'); write_com(0xc0+12); write_date('w'); write_com(0xc0+13); write_date('e'); write_com(0xc0+14); write_date('r'); write_com(0xc0+15); write_date('s'); } if(count2>4) { count2=1; c=0;//从头开始唱 TR1=1; } while(!k1); } } } void wb1() interrupt 2 { TR1=0; if(k2==0) { delay2(10); if(k2==0) { count2--; c=0;//从头开始唱 if(count2==1) } if(count2<=0) { count2=4; c=0;//从头开始唱 TR1=1; } while(!k2); } } }
|