×
单片机 > 单片机程序设计 > 详情

51单片机音乐盒 仿真+程序

发布时间:2021-05-14 发布时间:
|

电路介绍:

1.此项目采用51单片机实现音乐盒的功能,同时电路中采用模拟示波器,可以实时查看波形的变动。

2.通过一个可调电阻实现音频信号的音量大小

3.基于8欧姆/1w的喇叭作为音频输出部件

proteus仿真原理图:
 

源代码:

#include

#include


#define uchar unsigned char 

#define uint unsigned int


sbit SPK = P2^7;


uchar tone_h;                //高音

uchar tone_l;                //低音

uint note = 1;                //音符

uchar beat;                        //节拍


uchar code chuzhi[3][16]={  //音调对应的计数初值

         0xff,0xff,//占0位 

         0xf8,0x8c,//低1  

         0xf9,0x5b,//  2                 

         0xfa,0x15,//  3                 

         0xfa,0x67,//  4                 

         0xfb,0x04,//  5                 

         0xfb,0x90,//  6                 

         0xfc,0x0c,//低7

        

         0xff,0xff,//占0位 

         0xfc,0x44,//中1   

         0xfc,0xac,//  2

         0xfd,0x09,//  3

         0xfd,0x34,//  4

         0xfd,0x82,//  5

         0xfd,0xc8,//  6

         0xfe,0x06,//中7   

        

         0xff,0xff,//占0位 

         0xfe,0x22,//高1                           

         0xfe,0x56,//        2                

         0xfe,0x85,//        3                

         0xfe,0x9a,//        4                

         0xfe,0xc1,//        5                

         0xfe,0xe4,//        6                

         0xff,0x03 //高7                             

        };        


//****** 测试曲谱 ****** 个位:音调 ,十位:低中高音 对应 0 1 2,千百位:节拍 1~16

uint code test2[] = {        120, //曲速 暂时未用到

        401,402,403,404,405,406,407,

        611,612,613,614,615,616,617,

        821,822,823,824,825,826,827,

        0xffff        //0xffff表示结尾

};


//****** 生日快乐 ******

uint code test[] = { 120,

        205,205,406,405,411,807,

        205,205,406,405,412,811,

        205,205,415,413,411,407,406,

        314,114,413,411,413,812,

        305,105,406,405,411,807,

        305,105,406,405,412,811,

        305,105,415,413,411,

        407,406,314,114,413,411,412,811,410,

        0xffff        

};

        

void delayms(uint ms)       /*ms 等于1时,延时1ms 等于2时,延时2ms,以此类推*/

{        

        uchar a,b,c;                                   //+3

        while(ms--)

    {

         for(c=1;c>0;c--)                        //         1+2 = 3

        for(b=142;b>0;b--)                  //        1*( 1+142*2)) = 285        

            for(a=2;a>0;a--);        //         142*(1+2*2) = 710

        }

}


void delay125ms(uint pai)  //延时 ?*125ms 即?个节拍 

{

    uchar a,b,c;

        while(pai--)

        {

        for(c=239;c>0;c--)

                for(b=104;b>0;b--)

                        for(a=1;a>0;a--);

        }

}

void timer0() interrupt 1

{

        TH0 = tone_h;

        TL0 = tone_l;

        SPK = ~SPK;

}



void timer_init()

{

        EA = 1;

        ET0 = 1;

        PT0 = 1;

        TMOD = 0x11;

        TH0 = 255;

        TL0 = 255;

}

void main()

{        

        timer_init();

        note = 1;

        

        while(1)

        {        

                if(test[note] == 0xffff)

                {        

                        note = 1;

                }                

                if(test[note]%10 != 0)  //音调不为0 【音调为0时表示不发声,但有节拍】

                {

                        tone_h = TH0 = chuzhi[test[note]%100/10][(test[note]%10)*2 ];                //音调高位 【二维数组 第1维表示低中高音,第二维表示音调】

                        tone_l = TL0 = chuzhi[test[note]%100/10][(test[note]%10)*2 + 1];             //音调低位

                        TR0 = 1;

                }

                delay125ms(test[note]/100);        //节拍

                TR0 = 0;

                delayms(30);

                note++;                            //下一个音符

                

        }

        

}


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈msp430f5529入门(2)----时钟配置.例程分析