微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 音乐盒课程设计,求大神帮忙修改一下代码,感...

音乐盒课程设计,求大神帮忙修改一下代码,感...

时间:10-02 整理:3721RD 点击:

#include <reg52.h>


#define uchar unsigned char


#define uint unsigned int


sbit duan=P2^6;


sbit key1=P3^4;//按key1可切换花样


sbit key2=P3^5;//按key2可切换歌曲


sbit fm=P1^5;//蜂鸣器连续的IO口


sbit P34=P3^4;//矩阵键盘的一列


uchar code huayang1[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,


                                                        0xfd,0xfb,0xf7,0xef,0xdf,0xbf};//花样1


uchar code huayang2[]={0x7f,0xfe,0xbf,0xfd,0xdf,0xfb,0xef,0xf7,


                                                        0xef,0xfb,0xdf,0xfd,0xbf,0xfe};//花样2


uchar code huayang3[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x0,


                                                        0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};


char code huayang4[]={0x55,0xaa,0xcc,0x33,0x99,0x66,0x0f,0xf0};


uchar count1;//花样标志      


uchar count2;//歌曲标志      


uchar timeh,timel,i;


//---------------------------简谱---------------------------------------


//编程规则:字节高位是简谱,低位是持续时间,


//代表多少个十六分音符


//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,


//有花儿伴着蝴蝶


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};


//----------------------------简谱音调对应的定时器初值---------------------------


//适合11.0592M的晶振


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


          };


ucharyinyue[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x0,0x0};


//将音调转化为对应的LED样式


void delay1(uint z);      //延时1MS


void delay(uint z);        //延时165MS,即十六分音符


void song();


void beep();//蜂鸣器叫一声


main()


{       ucharx;


         count1=0;//流水灯无花样


         count2=1;//唱第一首歌


         P34=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(count1!=0)


                   {


                            switch(count1)


                            {


                                     case1:


                                               for(x=0;x<14;x++)


                                               {


                                                        duan=1;


                                                        P0=huayang1[x];


                                                        beep();


                                                        delay1(300);


                                                        duan=0;


                                                        if(count1!=1)


                                                                 break;         


                                               }


                                     break;


                                     case2:


                                               for(x=0;x<14;x++)


                                               {


                                                        duan=1;


                                                        P0=huayang2[x];


                                                        beep();


                                                        delay1(300);


                                                        duan=0;


                                                        if(count1!=2)


                                                                 break;         


                                               }


                                     break;


                                     case3:


                                               for(x=0;x<16;x++)


                                               {


                                                        duan=1;


                                                        P0=huayang3[x];


                                                        beep();


                                                        delay1(300);


                                                        duan=0;


                                                        if(count1!=3)


                                                                 break;         


                                               }


                                     break;


                                     case4:


                                               for(x=0;x<8;x++)


                                               {


                                                        duan=1;


                                                        P0=huayang4[x];


                                                        beep();


                                                        delay1(300);


                                                        duan=0;


                                                        if(count1!=4)


                                                                 break;         


                                               }


                                     break;


                            }


                   }


                   else


                   {


                            song();


                            delay1(1000);


                   }


         }


                                    


}


void int0() interrupt 0


{


         EA=0;//关总中断


         delay1(1);//去抖


         if(key1==0)


         {


                   count2=0;//不让蜂鸣器唱歌


                   TR0=0;


                   count1++;


                   if(count1==5)


                             count1=1;



         }


         EA=1;//开总中断


}


void int1() interrupt 2


{


         EA=0;//关总中断


         delay1(1);//去抖


         if(key2==0)


         {


                   count1=0;//流水灯无花样


                   TR0=1;


                   i=0;//从头开始唱


                   count2++;


                   if(count2==3)


                             count2=1;



         }


         EA=1;//开总中断


}


void timer0() interrupt 1        //用于产生各种音调


{


         TH0=timeh;


         TL0=timel;


         fm=~fm;


}


void song()


{


         uinttemp;


         ucharjp;//jp是简谱


         i=0;


         while(1)


         {       if(count2==0)


                   {      


                            break;


                   }


                   if(count2==1)     //选曲


                             temp=qnzl;


                  if(count2==2)


                            temp=jmszl;


                   if(temp==0xff)


                            break;


                           


                   jp=temp/16;//取数的高4位


                   duan=1;


                   P0=yinyue[jp];


                   duan=0;


                   if(jp!=0)


                   {


                   timeh=cuzhi[jp*2];


                   timel=cuzhi[jp*2+1];


                   }


                   else


                   {


                   TR0=0;


                   fm=1;//关蜂鸣器


                   }


                   delay(temp%16);//取数的低4位


                   TR0=0;       //唱完一个音停10MS


                   fm=1;


                   delay1(10);


                   TR0=1;


                   i++;


         }


         TR0=0;


         fm=1;


         


}


void delay(uint z)         //延时165MS,即十六分音符


{       uintx,y;


         for(x=z;x>0;x--)


                 for(y=19000;y>0;y--);


}



void delay1(uint z)       //延时1MS


{       uintx,y;


         for(x=z;x>0;x--)


                 for(y=112;y>0;y--);


}


void beep() //蜂鸣器叫一声


{       uchari;


         for(i=0;i<50;i++)


         {       fm=~fm;


                   delay1(1);


         }


         fm=1;


}




已退回10积分

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top