单片机 音乐播放器+亮灯

发布网友

我来回答

4个回答

热心网友

//《世上只有妈妈好》51单片机C语言程序和音乐采灯程序

              //2007-5-22             作者:徐学军  

              //此程序在硬件上调试通过

              //本程序的单片机晶振采用11.0592MHZ

              //此程序的流水灯随音乐的节拍的快慢而动

              //程序对应的单片机的完整的电路图已经插在了程序中,可以单击放大查看

              #include <reg51.h>

              sbit             speaker=P2^0;         //接音频放大电路,

              //sbit             speaker=P3^2;

              sbit             sw=P3^0;          //电后位后,sw合上后就开始放音乐,灯开始闪动,sw断开,音乐停 止,             灯也同时停止闪动

              unsigned char timer0h,timer0l,time,led=1,j=0;

              unsigned char           flagd=0;

               //世上只有妈妈好数据表

              code unsigned char sszymmh[]={ 6,2,3,             5,2,1,             3,2,2, 5,2,2, 1,3,2, 6,2,1, 5,2,1,

                                             6,2,4,             3,2,2,             5,2,1, 6,2,1, 5,2,2, 3,2,2, 1,2,1,

                                             6,1,1,             5,2,1,             3,2,1, 2,2,4, 2,2,3, 3,2,1, 5,2,2,

                                             5,2,1,             6,2,1,             3,2,2, 2,2,2, 1,2,4, 5,2,3, 3,2,1,

                                             2,2,1,             1,2,1,             6,1,1, 1,2,1, 5,1,6, 0,0,0 

                                             }             ;

              // 音阶频率表 高八位

code unsigned char FREQH[]={

                                       0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8, 

                                       0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, //1,2,3,4,5,6,7,8,i

                                            0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,

                                       0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,

                                      } ;

                // 音阶频率表 低八位

code unsigned char FREQL[]={

                                        0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,

                                        0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, //1,2,3,4,5,6,7,8,i

                                             0xEE,0x44, 0x6B,0xB4,0xF4,0x2D, 

                                        0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,

                                       };

                    void delay(unsigned char t)

                              {

                                    unsigned char t1;

                                    unsigned long t2;

                                    for(t1=0;t1<t;t1++)

                                       {

                               

                                         for(t2=0;t2<8000;t2++)

                                             {

                                              ;

                                             }                                

                                       }

                                 TR0=0;

                               }

                     void t0int() interrupt 1

                                 {

                                  TR0=0;

                                  speaker=!speaker;

                                  TH0=timer0h;

                                  TL0=timer0l;

                                  TR0=1;

                                 }

                      void song()

                                 {

                                  TH0=timer0h;

                                  TL0=timer0l;

                                  TR0=1;

                                  delay(time);                       

                                 }

                     void main(void)

                                    {

                                     unsigned char k,i;

                                     TMOD=1; //置CT0定时工作方式1

                                    EA=1;ET0=1;//IE=0x82 //CPU开中断,CT0开中断 

                                    while(1)

                                       {

                                         i=0;

                                         time=1;

                                         sw=1;                             

                                         while(time)

                                            {  

                                                if(sw)

                                                  {P0=0;i=0;continue;}

                                                if(j==8)

                                            {

                                             //led=1;

                                             j=0;flagd=~flagd;

                                             if(flagd)

                                                {

                                                  led=0x80;

                                                   }

                                                 else

                                                   {

                                                    led=1;

                                                    }

                                         } 

                                         else

                                             {

                                              P0=~led;

                                              if(flagd)

                                                {

                                                  led=led>>1;

                                                   }

                                                 else

                                                   {

                                                    led=led<<1;

                                                    }

                                              j++;                                     

                                             }                                  

                                             k=sszymmh[i]+7*sszymmh[i+1]-1;

                                             timer0h=FREQH[k];

                                             timer0l=FREQL[k];

                                             time=sszymmh[i+2];

                                             i=i+3;

                                             song();

                                            }

                                        } 

                                    }

热心网友

ORG 0000H
LJMP START
ORG 000BH
INC 20H ;中断服务,中断计数器加1
MOV TH0,#0D8H
MOV TL0,#0EFH ;12M晶振,形成10毫秒中断
RETI
START:
MOV SP,#50H
MOV TH0,#0D8H
MOV TL0,#0EFH
MOV TMOD,#01H
MOV IE,#82H
MUSIC0:
NOP
MOV DPTR,#DAT ;表头地址送DPTR
MOV 20H,#00H ;中断计数器清0
MOV B,#00H ;表序号清0
MUSIC1:
NOP
CLR A
MOVC A,@A+DPTR ;查表取代码
JZ END0 ;是00H,则结束
CJNE A,#0FFH,MUSIC5
LJMP MUSIC3
MUSIC5:
NOP
MOV R6,A
INC DPTR
MOV A,B
MOVC A,@A+DPTR ;取节拍代码送R7
MOV R7,A
SETB TR0 ;启动计数
MUSIC2:
NOP
CPL P3.3
MOV A,R6
MOV R3,A
LCALL DEL
MOV A,R7
CJNE A,20H,MUSIC2 ;中断计数器(20H)=R7否?
;不等,则继续循环
MOV 20H,#00H ;等于,则取下一代码
INC DPTR
; INC B
LJMP MUSIC1
MUSIC3:
NOP
CLR TR0 ;休止100毫秒
MOV R2,#0DH
MUSIC4:
NOP
MOV R3,#0FFH
LCALL DEL
DJNZ R2,MUSIC4
INC DPTR
LJMP MUSIC1
END0:
NOP
MOV R2,#H ;歌曲结束,延时1秒后继续
MUSIC6:
MOV R3,#00H
LCALL DEL
DJNZ R2,MUSIC6
LJMP MUSIC0
DEL:
NOP
DEL3:
MOV R4,#02H
DEL4:
NOP
DJNZ R4,DEL4
NOP
DJNZ R3,DEL3
RET
NOP
DAT:
db 26h,20h,20h,20h,20h,20h,26h,10h,20h,10h,20h,80h,26h,20h,30h,20h
db 30h,20h,39h,10h,30h,10h,30h,80h,26h,20h,20h,20h,20h,20h,1ch,20h
db 20h,80h,2bh,20h,26h,20h,20h,20h,2bh,10h,26h,10h,2bh,80h,26h,20h
db 30h,20h,30h,20h,39h,10h,26h,10h,26h,60h,40h,10h,39h,10h,26h,20h
db 30h,20h,30h,20h,39h,10h,26h,10h,26h,80h,26h,20h,2bh,10h,2bh,10h
db 2bh,20h,30h,10h,39h,10h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,20h
db 20h,10h,20h,10h,2bh,10h,26h,30h,30h,80h,18h,20h,18h,20h,26h,20h
db 20h,20h,20h,40h,26h,20h,2bh,20h,30h,20h,30h,20h,1ch,20h,20h,20h
db 20h,80h,1ch,20h,1ch,20h,1ch,20h,30h,20h,30h,60h,39h,10h,30h,10h
db 20h,20h,2bh,10h,26h,10h,2bh,10h,26h,10h,26h,10h,2bh,10h,2bh,80h
db 18h,20h,18h,20h,26h,20h,20h,20h,20h,60h,26h,10h,2bh,20h,30h,20h
db 30h,20h,1ch,20h,20h,20h,20h,80h,26h,20h,30h,10h,30h,10h,30h,20h
db 39h,20h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,10h,40h,10h,20h,10h
db 20h,10h,2bh,10h,26h,30h,30h,80h,00H

END

热心网友

可以说清楚一点吗?不太明白你的意思。不好意思啊!呵呵

热心网友

提问就要说清楚 不然人家怎么帮你

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com