• 【TB作品】msp430单片机,播放蜂鸣器音乐,天空之城


    功能

    msp430单片机,连接一个无源蜂鸣器,播放蜂鸣器音乐,天空之城。

    适用于所有msp430单片机

    硬件

    无源蜂鸣器,接单片机P1.5,使用vcc3.3v供电。

    如果根据简谱修改音乐?

    //第一步
    //首先修改music0 的变量,
    //低音下面加点
    //中音不加点
    //高音上面加点
    //根据简朴的符号写出对应C调音
    //第二步 修改music0_JP数组 这个数组和上一个数组对应 就是每一个音 响多长时间
    //普通无点是延时 7 即是800ms
    //如果音 下有一条下划线,延时 4
    //如果音 下有两条下划线,延时2
    //如果音 后加一个点 延时12
    //如果音后加一条线 延时16
    //如果音后加2条线 延时20
    //当然 觉得不好听 可以适当修改延时的值

    部分程序

    
    /*  ******************************************    */
    //  ********  音乐0	   天空之城
    /*  ******************************************    */
    //以下是《天空之城》简谱    //每行对应一小节音符
    unsigned int  music0[]=
    {	Z6,Z7,/**/H1,Z7,H1,H3,/**/Z7,Z3,Z3, /**/Z6,Z5,Z6,H1,/**/Z5,Z3,Z3, /**/Z4,Z3,Z4,H1,
    	Z3,H1,H1,H1,/**/Z7,Z4,Z4,Z7,/**/Z7,Z6,Z7, /**/H1,Z7,H1,H3,/**/Z7,Z3,Z3, /**/Z6,Z5,Z6,H1,
    	Z5, Z3,/**/Z4,H1,Z7,H1,/**/H2,H2,H2,H1,/**/H1,Z6,Z7,Z5,/**/Z6,H1,H2, /**/H3,H2,H3,H5,
    	H2,Z5,Z5, /**/H1,Z7,H1,H3,/**/H3, /**/Z6,H1,Z7,H2,/**/H1,Z5,Z5, /**/H4,H3,H2,H1,
    	H3, /**/Z3,H3, /**/H6,H5,H5, /**/H3,H2,H1,H1,/**/H2,H1,H2,H5,/**/H3,H3,
    	H6,H5, /**/H3,H2,H1,H1,/**/H2,H1,H2,Z7,/**/Z6,Z6,Z7, /**/Z6,0xff}; //以0xff作为音符的结束标志
    
    //以下是简谱中每个音符的节拍
    //"4"对应4个延时单位,"2"对应2个延时单位,"1"对应1个延时单位
    unsigned char  music0_JP[ ]=
    {	4,4, /**/12,4,8,8, /**/20,4,4, /**/12,4,8,8, /**/20,4,4, /**/12,4,4,12,
    	20,4,4,4, /**/12,4,8,8, /**/20,4,4, /**/12,4,8,8, /**/20,4,4, /**/12,4,8,8,
    	32, 4, /**/8,4,6,8, /**/4,4,4,16, /**/8,4,6,8, /**/24,4,4, /**/12,4,8,8,
    	24,4,4, /**/4,4,8,8, /**/32, /**/4,8,8,6, /**/12,4,16, /**/8,8,8,8,
    	30, /**/20,8, /**/16,8,8, /**/4,4,16,8, /**/8,4,4,8, /**/20,8,
    	16,16, /**/4,20,8, /**/8,4,4,8, /**/20,4,4, /**/32};
    
    
    
    
    /*  ******************************************    */
    /*  ********   延时100ms	控制音乐节拍 */
    /*  ******************************************    */
    void delay1()
    {
    	delay_ms( 100 );
    }
    
    int main( void )
    {
    	unsigned char u = 0, t = 0;
    
    
    	WDTCTL = WDTPW + WDTHOLD;                               /* Stop WDT */
    
    	P1DIR |= BIT5;                                          /* P1.0 output */
    
    
    	_EINT();
    
    	while ( 1 )
    	{
    		u = 0, t = 0;
    		while ( music0[u] != 0xff )                     /* 只要没有读到结束标志就继续播放 */
    		{
    			CCR0	= SYSCLK / music0[u] / 2;       /*选一个频率 */
    
    			for ( t = 0; t < music0_JP[u]; t++ )    /* 控制节拍数 */
    				delay1();                       /* 延时1个节拍单位 */
    
    			TACTL = TASSEL_2 + MC_0;                /* 关闭 */
    			u++;                                    /* 播放下一个音符 */
    		}
    	}
    }
    
    
    /* Timer A0 interrupt service routine */
    #pragma vector=TIMER0_A0_VECTOR
    __interrupt void Timer_A( void )
    {
    	P1OUT ^= BIT5;
    }
    
    
    

    全部程序

    https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2
    
  • 相关阅读:
    RK3568多千兆网口安卓视频控制器全国产方案
    企业架构LNMP学习笔记28
    PCIE基础知识-3
    等精度频率计的设计与验证
    Codeforces Round #809 (Div. 2)
    开发调试:提高代码质量与开发效率的关键步骤
    机器学习-预备知识
    Leetcode(406)——根据身高重建队列
    Android Banner - ViewPager 02
    深入解析分布式限流
  • 原文地址:https://blog.csdn.net/x1131230123/article/details/139425568