历史上的今天
返回首页

历史上的今天

今天是:2025年04月18日(星期五)

正在发生

2018年04月18日 | MSP430学习笔记5-利用蜂鸣器演奏音乐

2018-04-18 来源:eefocus

这个小程序仍然是定时器的运用,比较简单,具体的地方都在注释中注明了,参考注释。


  1. /********************************************* 

  2. 程序功能:MCU控制蜂鸣器演奏歌曲《祝你平安》 

  3. ---------------------------------------------- 

  4. 拨码开关设置:将BUZZER位拨至ON,其余位拨至OFF 

  5. 测试说明:聆听蜂鸣器“唱出”的乐曲 

  6.  

  7. 既然是演奏乐曲对于一个音符应该包括两个部分 

  8. 一是声调 二是持续时间,在这个程序中声调是用简单的 

  9. 延时-电平翻转来实现的,改变了延时的时间就改变了 

  10. 声调,而时间是通过计数比较来实现的,当计数值相等时 

  11. 就跳出循环演奏下一个音符。 

  12. *********************************************/  

  13. #include    

  14.   

  15. typedef unsigned char uchar;  

  16.   

  17. #include  "music.h"  

  18.   

  19. #define   Buzzer        BIT7  

  20. #define   Buzzer_Port   P6OUT  

  21. #define   Buzzer_DIR    P6DIR  

  22.   

  23. uchar counter;  

  24. void Play_Song(void);  

  25.   

  26. /***************主函数****************/  

  27. void main(void)  

  28. {  

  29.     uchar i;  

  30.       

  31.     /*下面六行程序关闭所有的IO口*/  

  32.     P1DIR = 0XFF;P1OUT = 0XFF;  

  33.     P2DIR = 0XFF;P2OUT = 0XFF;  

  34.     P3DIR = 0XFF;P3OUT = 0XFF;  

  35.     P4DIR = 0XFF;P4OUT = 0XFF;  

  36.     P5DIR = 0XFF;P5OUT = 0XFF;  

  37.     P6DIR = 0XFF;P6OUT = 0XFF;  

  38.     P6DIR |= BIT2;P6OUT |= BIT2;         //关闭电平转换  

  39.        

  40.     WDTCTL = WDTPW + WDTHOLD;                 //关闭看门狗  

  41.     /*------选择系统主时钟为8MHz-------*/  

  42.     BCSCTL1 &= ~XT2OFF;                       // 打开XT2高频晶体振荡器  

  43.     do  

  44.     {  

  45.         IFG1 &= ~OFIFG;                       //清除晶振失败标志  

  46.         for (i = 0xFF; i > 0; i--);           // 等待8MHz晶体起振  

  47.     }  

  48.     while ((IFG1 & OFIFG));                   // 晶振失效标志仍然存在?  

  49.     BCSCTL2 |= SELM_2 + SELS;                 //主时钟和从时钟都选择高频晶振  

  50.       

  51.       

  52.     //设置定时器A每10ms中断一次  

  53.     CCTL0 = CCIE;  

  54.     CCR0 = 10000;//改变这个值就改变了演奏的速度  

  55.     TACTL |= TASSEL_2 + ID_3;   

  56.     //设置控制蜂鸣器的IO方向为输出  

  57.     Buzzer_DIR |= Buzzer;  

  58.     //打开全局中断  

  59.     _EINT();  

  60.     //循环演奏歌曲  

  61.     while(1)  

  62.     {  

  63.         Play_Song();  

  64.     }  

  65. }  

  66.   

  67. /******************************************* 

  68. 函数名称:TimerA_ISR 

  69. 功    能:定时器A的中断服务函数 

  70. 参    数:无 

  71. 返回值  :无 

  72. ********************************************/  

  73. #pragma vector = TIMERA0_VECTOR  

  74. __interrupt void TimerA_ISR(void)  

  75. {  

  76.     counter++;  

  77. }  

  78. /******************************************* 

  79. 函数名称:Delay_Nms 

  80. 功    能:延时N个ms的函数              ps:不知道这个地方怎么算出来的是延时毫秒 

  81. 参    数:n--延时长度 

  82. 返回值  :无 

  83. ********************************************/  

  84. void Delay_Nms(uchar n)  

  85. {  

  86.     uchar i,j;  

  87.       

  88.     for( i = 0;i < n; i++ )  

  89.     {  

  90.         for( j = 0;j < 3;j++ )  

  91.           _NOP();  

  92.     }  

  93. }  

  94. /******************************************* 

  95. 函数名称:Play_Song 

  96. 功    能:播放《祝你平安》的乐曲 

  97. 参    数:无 

  98. 返回值  :无 

  99. ********************************************/  

  100. void Play_Song(void)  

  101. {  

  102.     uchar Temp1,Temp2;  

  103.     uchar addr = 0;  

  104.       

  105.     counter = 0; //中断计数器清0  

  106.     while(1)  

  107.     {  

  108.         Temp1 = SONG[addr++];  

  109.         if ( Temp1 == 0xFF )        //休止符  

  110.         {  

  111.             TACTL &=~MC_1;          //停止计数  

  112.             Delay_Nms(100);  

  113.         }  

  114.         else if ( Temp1 == 0x00 )   //歌曲结束符  

  115.         {  

  116.             return;  

  117.         }  

  118.         else  

  119.         {  

  120.             Temp2 = SONG[addr++];  

  121.             TACTL |=MC_1;           //开始计数  

  122.             while(1)  

  123.             {  

  124.                 Buzzer_Port ^= Buzzer;//电平取反  

  125.                 Delay_Nms(Temp1);//Temp1的值决定了延时的长短,也决定了声音的频率  

  126.                 if ( Temp2 == counter )//决定了音调持续的时间,计数时间到时就跳出循环演奏下一个。  

  127.                 {  

  128.                     counter = 0;  

  129.                     break;  

  130.                 }  

  131.             }  

  132.         }  

  133.     }  

  134. }  



推荐阅读

史海拾趣

Ametherm公司的发展小趣事

Ametherm公司成立于XXXX年,由一群热衷于电子技术的工程师创立。他们看到了功率热敏电阻在电子行业中的巨大潜力,并决定专注于此领域的发展。在创立初期,公司面临着资金短缺、市场竞争激烈等挑战,但创始人们凭借着对技术的热情和坚持,逐步攻克了技术难关,开发出了具有竞争力的产品。

Gamma Microelectronics ( APM )公司的发展小趣事

2007年10月,G24i在英国建立了DSSC的30MW试产线,这是全球范围内的重要里程碑。这条生产线具备高效的生产能力,能够在不到3小时的时间内制造出长达约800米的太阳能电池,生产速度高达每分钟4米以上。这一成就不仅展示了G24i在规模化生产方面的实力,也为后续的商业化应用奠定了产能基础。尽管初期商业化模组产品的转换效率仅为3%,但G24i通过不断优化生产工艺和降低成本,逐步提升了产品的市场竞争力。

Hitron公司的发展小趣事

为了进一步满足市场需求,G24i在英国威尔士卡迪夫建成了世界上第一条25MW的大规模生产基于钛衬底的DSSC基地。这一基地的建成标志着G24i在DSSC领域实现了从研发到生产的全链条覆盖。大规模生产不仅降低了产品的制造成本,也提高了生产效率和质量稳定性。G24i通过不断优化生产流程和提升管理水平,确保了产品的市场竞争力。

Carlo Gavazzi公司的发展小趣事

为了进一步拓展市场,Carlo Gavazzi公司开始实施国际化战略。公司先后在多个国家和地区设立销售和服务团队,将产品和服务推向全球市场。这一过程中,公司不仅面临着文化差异和市场环境的挑战,也积极寻求与当地企业的合作与共赢。通过不断努力,公司逐渐在全球范围内建立起自己的品牌形象和市场地位。

德国ACAM公司的发展小趣事

2014年,ACAM公司迎来了一个重要的里程碑事件——被奥地利微电子股份有限公司收购。这次收购极大地增强了ACAM公司在时间数字转换器(TDC)技术领域的实力。奥地利微电子在半导体行业有着深厚的积累和丰富的经验,与ACAM公司的技术优势相结合,进一步提升了ACAM公司在市场上的竞争力。

Cliff Electronic Components公司的发展小趣事

近年来,ACAM公司开始将目光投向增材制造领域。ACAM公司与上海交通大学等高校建立了紧密的合作关系,共同推动增材制造技术的发展。通过合作研究,ACAM公司成功地将时间数字转换技术应用于增材制造领域,为行业的发展提供了新的动力。

问答坊 | AI 解惑

linux与wince最根本的区别是什么-扫盲

让我们逐条分析评价Linux和WinCE/Windows的优缺点。 1.支持多种硬件平台由于嵌入式设备硬件平台的多样性,CPU芯片的快速更新,嵌入式操作系统要求支持常用的嵌入式CPU,如X86, ARM, MIPS, POWERPC等,并具有良好的可移植性。另外还需要支持种类繁 ...…

查看全部问答>

关于FPGA和CPLD,选择哪一个比较好?

FPGA:Field Programmable Gate Array(现场可编程门阵列) CPLD:Complex programmable logic devices(复杂可编程逻辑器件) 这两者之间的主要区别是什么?对于高速的电路系统,选择哪一个比较好? 笼统的说,两者的区别在于资源的规模和芯片 ...…

查看全部问答>

杭州汇文怎么样?

杭州汇文怎么样?能学到很多有用的东西吗? 还是骗人的啊…

查看全部问答>

s3c2440_spi.ko驱动编译失败,s3c2440 linux 2.6.29自己带的spi驱动如何编译

友善之笔 的系统,采用三星的s3c2440处理器, 想要spi驱动,不是gpio io口模拟的那种,直接采用多路复用spi的给定口,可是选择了spi_s3c2440_serial这个选项后,编译的时候总是遇到问题,说是spi_alloc_master找不到,网上搜索了很多资料,很多都是介绍 ...…

查看全部问答>

关于SLE4442读写问题:

关于SLE4442读写问题:     我用初始密码0XFF 0XFF  0XFF,效验成功,  读加密存储器器数据为7000FFFF ,         修改密码,0XF1 0XF1  0XF1,效验失败, 读加密存储器器数据为 ...…

查看全部问答>

WINCE60上的挂起与唤醒功能怎么做啊?有没做过的人啊?能不能通过触摸屏点击唤醒系统?

WINCE60上的挂起与唤醒功能怎么做啊?有没做过的人啊?能不能通过触摸屏点击唤醒系统?…

查看全部问答>

关于驱动程序的安装

我利用SetupDiXXX系列的函数进行驱动程序的安装。 但是有的机器需要10来分钟才能安装完成,而有的机器只要30秒钟就可以了 我跟踪了时间,发现时间主要花费在UpdateDriverForPlugAndPlayDevices函数上 不知道各位大大有什么建议? 我找不出来 ...…

查看全部问答>

"EVC高级编程与应用"中第11章TCP例程的使用问题!

在EVC中把程序编译好了,下到板子上的WINCE系统中运行;主机上的程序在wince的模拟器中运行。当把服务器端程序运行在主机模拟器上,把客户端程序运行在板子上,相互是可以通信的。但把两者运行的地方交换,就不能通信了,为什么??根据服务器的地 ...…

查看全部问答>

ADC123_IN0是什么意思???

                                 还有AD12_IN5等等....…

查看全部问答>

程序

大家可以对比一下程序就明白了, ASII_TAB.c里还有我的签名, 楼主还没能改掉! 边屏的主机接口都和咱的是一样的. STM32_FSMC_7.0_8bit.rar (465.28 KB) 下载次数:26 2010-12-13 11:00 …

查看全部问答>