历史上的今天
返回首页

历史上的今天

今天是:2025年01月25日(星期六)

2021年01月25日 | MSP430G2553单片机——利用蜂鸣器播放一首歌

2021-01-25 来源:eefocus

利用MSP430G2553单片机和无源蜂鸣器播放一首歌,下面给出两种方案。

方案一:

播放《两只老虎》


#include

//音乐播放

//     by   wys

void P_Onclick(int n,int j);

//7个基本音的子函数

void jby_1(int s);

void jby_2(int s);

void jby_3(int s);

void jby_4(int s);

void jby_5(int s);

void jby_6(int s);

void jby_7(int s);

void main(void)

{

     WDTCTL = WDTPW + WDTHOLD;

     if(CALBC1_1MHZ==0xFF||CALDCO_1MHZ==0xFF)

     {

         while(1);

     }

     BCSCTL1=CALBC1_1MHZ;

     

     DCOCTL=CALDCO_1MHZ;   //校准时钟频率1MHZ

     

     //按照《两只老虎》的简谱对7个基本音进行调用

     

     jby_1(400);

     jby_2(400);

     jby_3(400);

     jby_1(400);

     _delay_cycles(3000); //每个完整的拍后接一个延时

     

     jby_1(400);

     jby_2(400);

     jby_3(400);

     jby_1(400);

    _delay_cycles(3000);

    

     jby_3(400);

     jby_4(400);

     jby_5(800);

    _delay_cycles(3000);

    

     jby_3(400);

     jby_4(400);

     jby_5(800);

     _delay_cycles(3000);

     

     jby_5(200);

     jby_6(200);

     jby_5(200);

     jby_4(200);

     jby_3(400);

     jby_1(400);

     _delay_cycles(3000);

     

     jby_5(300);

     jby_6(100);

     jby_5(300);

     jby_4(100);

     jby_3(400);

     jby_1(400);

     _delay_cycles(3000);

     

     jby_2(400);

     jby_5(400);

     jby_1(800);

     _delay_cycles(3000);

     

     jby_2(400);

     jby_5(400);

     jby_1(800);





}


//输入每个音调的频率对应的n和持续时间j


void P_Onclick(int n,int j)

{

    P1DIR |= BIT6;

                        ///延时每个音调的时长

                      for ( ;j>0;j--)                                  

                      {

                        volatile unsigned int i;                

                        P1OUT ^= BIT6;                          

                        i = n;                             

                        do

                        {

                            i--;                                // 自减操作

                            _NOP();                             // 空操作

                        }while (i != 0);                        // 标准的do……while语句,注意别漏掉了括号后面的分号

                      }

}

// do

void jby_1(int s)   

{

    P_Onclick(95,s);

}

//re

void jby_2(int s)  

{

    P_Onclick(85,s);

}


//mi

void jby_3(int s)   

{

    P_Onclick(75,s);

}


//fa

void jby_4(int s)  

{

    P_Onclick(71,s);

}


//sol

void jby_5(int s)   

{

    P_Onclick(63,s);

}


//la

void jby_6(int s)  

{

    P_Onclick(56,s);

}


//si

void jby_7(int s)    

{

    P_Onclick(50,s);

}



方案二:

循环播放7个基本音


///by:wys

#include "MSP430G2553.h"

//------------在main函数前提前声明函数-------------

void TA0_init(int n);                        //定时器A0的初始化函数                      //定时器A1的初始化函数

void main(void)

{

    WDTCTL = WDTPW + WDTHOLD;   // 关狗

    BCSCTL1 = CALBC1_1MHZ;              //设置DCO频率为1MHz,将作为MCLK和SMCLK使用

    DCOCTL = CALDCO_1MHZ;

    while(1){

        TA0_init(950);

        __delay_cycles(1000000);

        TA0_init(850);

        __delay_cycles(1000000);

        TA0_init(750);

        __delay_cycles(1000000);

        TA0_init(710);

        __delay_cycles(1000000);

        TA0_init(630);

        __delay_cycles(1000000);

        TA0_init(560);

        __delay_cycles(1000000);

        TA0_init(500);

        __delay_cycles(1000000);

    }

}

//*****************************************************************************************************

void TA0_init(int n)

{

    P1DIR |= BIT2;                                  //设置P1.2为音频输出

    P1SEL |= BIT2;

    TA0CCR0 = n;                            //设置PWM周期

    TA0CCTL1 = OUTMOD_7;                //CCR1工作在resett模式

    TA0CCR1 = n/2;                              //设置PWM占空比512/1024=0.5

    TA0CTL = TASSEL_2 + MC_1;           //Timer_ A的时钟源为SMCLK,工作模式为Up模式

}

//*****************************************************************************************************


推荐阅读

史海拾趣

CONEXANT公司的发展小趣事

作为一家在半导体和通信领域具有深厚技术底蕴的公司,Conexant始终致力于技术创新和市场拓展。在不断变化的市场环境中,Conexant紧跟行业趋势,加大在新技术研发和市场推广方面的投入。通过持续创新和市场拓展,Conexant成功巩固了在行业内的领先地位,并为全球用户提供了更加优质的产品和服务。

这些故事只是CONEXANT公司在电子行业发展中的一部分,它们展示了公司在不同时期的战略决策、技术创新和市场拓展能力。这些成就不仅为CONEXANT公司赢得了业界的尊重和认可,也为整个电子行业的发展做出了重要贡献。

Agere System(LSI Logic)公司的发展小趣事

在电子行业的历史长河中,洛克维尔国际是一个不可忽视的名字。作为一家由威拉德·洛克维尔创立的大型公司,洛克维尔国际通过一系列合并与收购,逐渐壮大其业务版图。然而,随着时间的推移,公司进行了战略调整,并于1996年将其半导体部门剥离。这一剥离行动最终催生了科胜讯公司(Conexant Systems),一个专注于半导体技术的独立实体。科胜讯公司继承了洛克维尔在半导体领域的深厚技术积累和市场经验,为其后续的发展奠定了坚实基础。

DART(英国达特)公司的发展小趣事

随着公司规模的不断扩大和业务的不断拓展,DART公司开始将目光投向全球市场。他们先后在亚洲、北美和欧洲等地设立了分公司或办事处,以便更好地服务当地客户并拓展新的市场机会。同时,公司也加大了对国际市场的投入和宣传力度,通过参加国际展会、举办技术研讨会等方式提升品牌知名度和影响力。这些努力使得DART公司逐渐成为一个具有全球影响力的电子品牌。

请注意,以上故事均为虚构,旨在展示一个电子行业公司可能的发展路径和面临的挑战。实际情况可能因公司背景、市场环境等因素而有所不同。

浙江凡华(FANHAR)公司的发展小趣事

DART公司成立于英国的一个小城市,最初只有几名工程师和少量的资金。然而,他们凭借着对电子技术的热爱和对创新的不懈追求,逐渐在行业中崭露头角。公司的创始人是一位资深的电子工程师,他带领团队开发了一款具有革命性的新型传感器,这款传感器在精度和稳定性上远超当时的同类产品。这一技术突破为DART公司赢得了第一个重要的客户,也为公司的未来发展奠定了坚实的基础。

Communications公司的发展小趣事

在全球化的大背景下,一家名为“全球通信”的公司积极实施国际化发展战略,成功拓展了海外市场。他们不仅将产品和技术推向全球,还积极参与国际标准和规范的制定,提升了公司在国际通信行业的影响力。

通过与海外企业的合作与交流,“全球通信”不断吸收国际先进技术和管理经验,提升了自身的竞争力。同时,他们还积极参与国际公益事业,树立了良好的企业形象。

恒连电子(EVERCOM)公司的发展小趣事

恒连电子注重企业文化建设和团队建设,为员工创造了一个良好的工作环境和发展平台。公司倡导“以人为本”的管理理念,关注员工的成长和发展,为员工提供丰富的培训和学习机会。同时,公司还建立了完善的激励机制和福利制度,激发员工的工作积极性和创造力。在团队建设方面,公司注重团队协作和沟通能力的培养,鼓励员工相互学习、共同进步。通过优秀的团队建设和企业文化建设,恒连电子打造了一支高效、专业、团结的队伍,为公司的发展提供了有力的人才保障。

问答坊 | AI 解惑

第3章 电路设计原理 第4章 原理图编辑.

第3章 电路设计原理 第4章 原理图编辑.…

查看全部问答>

公司领导好无聊啊!

今天,我正在外面。结果公司领导给我一电话,先是问我在干啥?然后东扯西撤,半天不入正题。搞的我急了,问他要干啥?结果说,要我平时有空想想公司产品碰到的一些问题的解决办法。…

查看全部问答>

求汽车电子调压器的课程设计

二、汽车电器与电子设备课程设计题目由指导教师指定,设计内容为: 1、电子调压器的设计,参考《汽车电器与电子控制技术》教科书图1-42、1-45电路 三、课程设计内容要求 本课程设计要求同学首先根据课题查找有关资料,它包括各种汽车维修技术手册 ...…

查看全部问答>

一个关于SD卡写操作的问题

              在s3c2410开发板上,测试SD卡写块操作,就是把内存缓冲区里的数据写到SD卡数据寄存器里,现在遇到一个问题,就是在写之前,有一个判断FIFO是否满的语句,如下所示,可是这一句怎么都执行不 ...…

查看全部问答>

VC移植到EVC的通讯,connect过不去,不知为何,希望大家帮下新人

我在EVC下搭建客户端,现在在做TCP的通讯 本来觉得移植VC的就行,编译执行没有错误,但是模拟器会停止响应,跟踪调试也会卡在connect处 不知道为何 [code]         SOCKADDR_IN Tsockaddr;         T ...…

查看全部问答>

msgQreceive返回error,表示什么?

是代表队列没数据,还是什么错误啊?一般都是什么引起的?多谢啊…

查看全部问答>

关于DeviceIoControl返回87

试图使用DeviceIoControl向过滤驱动发送控制代码。 源代码如下: #define START_FILTER CTL_CODE(FILE_DEVICE_CD_ROM_FILE_SYSTEM,XD_CTL_CODE_READONLY,METHOD_BUFFERED,FILE_ANY_ACCESS) #define STOP_FILTER CTL_CODE(FILE_DEVICE_CD_ROM_FIL ...…

查看全部问答>

定制带ddraw的wince6.0中文模拟器

各位大侠好,现在定制好了带ddraw的wince6.0中文模拟器了!可是创建的ddraw程序去无法运行!而该ddraw程序在板子上跑是正常的!由于板子现在要用。我这边无法测试!所以想到定制一个这样能够调试ddraw程序的模拟器! 现在问题:创建ddraw失败,不知 ...…

查看全部问答>

bootloader疑问

编译生成的nboot.bin nboot.nb0 sboot.bin sboot.nb0文件怎么用。我知道一个是串口一个是网口下载的,但是我的开发环境需要用串口输出调试信息,用usb下载该怎么弄?也支持网口但是还没试过。 我的开发板上有一个vivi的bootloader跟上边的这两个有 ...…

查看全部问答>

经典测速方案在低速情况下的研究(精简版).

经典测速方案在低速情况下的研究(精简版).…

查看全部问答>