MSP430学习笔记4-两个定时器产生步进单频音

发布者:lcn18560863680最新更新时间:2018-04-18 来源: eefocus关键字:MSP430  定时器  步进单频音 手机看文章 扫描二维码
随时随地手机看文章

这个程序是开发板中用来产生不同频率声音的程序,整体程序较为简单,主要是两个定时器的使用,代码及我的注释如下。


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

  2. 程序功能:用固定频率的方波驱动蜂鸣器,共16种音调;在蜂鸣器 

  3.           发出不同音调的同时,LED发光以二进制数字形式指示 

  4.           当前音调的编号(1~16) 

  5. ---------------------------------------------------------- 

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

  7. 测试说明:聆听蜂鸣器发声的音调变化。同时led也有对应的指示 

  8. **********************************************************/  

  9. #include   

  10.   

  11. typedef unsigned char uchar;  

  12.   

  13. uchar step = 0xff;  

  14.   

  15. /************************主函数************************/  

  16. void main( void )  

  17. {  

  18.     uchar i;  

  19.       

  20.     WDTCTL = WDTPW + WDTHOLD;           //关狗  

  21.      

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

  23.     P1DIR = 0XFF;P1OUT = 0XFF;  

  24.     P2DIR = 0XFF;P2OUT = 0XFF;  

  25.     P3DIR = 0XFF;P3OUT = 0XFF;  

  26.     P4DIR = 0XFF;P4OUT = 0XFF;  

  27.     P5DIR = 0XFF;P5OUT = 0XFF;  

  28.     P6DIR = 0XFF;P6OUT = 0XFF;  

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

  30.       

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

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

  33.     do  

  34.     {  

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

  36.         //IFG1是中断寄存器 OFIFG是晶振启动失败中断标志位  

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

  38.     }  

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

  40.     //上面这一步主要是等待晶振正常工作  

  41.     BCSCTL2 |= SELM_2 + SELS;           //MCLK和SMCLK选择高频晶振  

  42.       

  43.     TACCTL0 |= CCIE;                    //使能比较中断  

  44.     TACTL |= TASSEL_2 + ID_3 ;          //计数时钟选择SMLK=8MHz,1/8分频后为1MHz  

  45.       

  46.     TBCCR0 = 4096*2 - 1;                //周期两秒  

  47.     //时间计算:32768/8*2+1注意使用的是手表晶振  

  48.     TBCCTL0 |= CCIE;  

  49.     TBCTL |= TBSSEL_1 + ID_3 + MC_1;    //时钟源ACLK/8,up mode  

  50.       

  51.     P6DIR |= BIT7;                      //蜂鸣器对应IO为6.7设置为输出  

  52.     P2DIR = 0xff;                       //指示对应的状态  

  53.     P2OUT = 0xff;  

  54.       

  55.     _EINT();  

  56.       

  57.     LPM1;  

  58. }  

  59. /******************************************* 

  60. 函数名称:Timer_A 

  61. 功    能:定时器A的中断服务函数,在这里驱动 

  62.           蜂鸣器发声 

  63. 参    数:无 

  64. 返回值  :无 

  65. ********************************************/  

  66. #pragma vector=TIMERA0_VECTOR  

  67. __interrupt void Timer_A (void)  

  68. {  

  69.   P6OUT ^= BIT7;                            // Toggle P6.7  

  70. }  

  71. /******************************************* 

  72. 函数名称:Timer_B 

  73. 功    能:定时器B的中断服务函数,在这里更改 

  74.           蜂鸣器发声频率 

  75. 参    数:无 

  76. 返回值  :无 

  77. ********************************************/  

  78. #pragma vector=TIMERB0_VECTOR  

  79. __interrupt void Timer_B (void)  

  80. {  

  81.     if(step == 0xff)                        //step的初值就是0xff,  

  82.       TACTL |= MC_1;//需要将TimerA设置为增计数模式,可以在初始化的时候设置,不明白为什么放在这个地方。     

  83.     step++;  

  84.     switch(step)  

  85.     {    

  86.     case    0:  TACCR0 = 5000;  P2OUT = ~1;   break;      // 100Hz  

  87.     //P2OUT使用led显示对应的数值,只是为了便于演示,没实际意义  

  88.     case    1:  TACCR0 = 2500;  P2OUT = ~2;   break;      // 200Hz  

  89.     case    2:  TACCR0 = 1250;  P2OUT = ~3;   break;      // 400Hz  

  90.     case    3:  TACCR0 = 625;   P2OUT = ~4;   break;      // 800Hz  

  91.     case    4:  TACCR0 = 500;   P2OUT = ~5;   break;      // 1KHz  

  92.     case    5:  TACCR0 = 250;   P2OUT = ~6;   break;      // 2KHz  

  93.     case    6:  TACCR0 = 167;   P2OUT = ~7;   break;      // 3KHz  

  94.     case    7:  TACCR0 = 125;   P2OUT = ~8;   break;      // 4KHz  

  95.     case    8:  TACCR0 = 100;   P2OUT = ~9;   break;      // 5KHz  

  96.     case    9:  TACCR0 = 83;    P2OUT = ~10;   break;      // 6KHz  

  97.     case    10:  TACCR0 = 71;   P2OUT = ~11;   break;      // 7KHz  

  98.     case    11:  TACCR0 = 63;   P2OUT = ~12;   break;      // 8KHz  

  99.     case    12:  TACCR0 = 56;   P2OUT = ~13;   break;      // 9KHz  

  100.     case    13:  TACCR0 = 50;   P2OUT = ~14;   break;      // 10KHz  

  101.     case    14:  TACCR0 = 33;   P2OUT = ~15;   break;      // 15KHz  

  102.     case    15:  TACCR0 = 25;   P2OUT = ~16;   break;      // 20KHz  

  103.     case    16:  step = 0xff;               // 接着往上加,和清零的效果一样,循环播放  

  104.     }  

  105. }  



关键字:MSP430  定时器  步进单频音 引用地址:MSP430学习笔记4-两个定时器产生步进单频音

上一篇:MSP430学习笔记5-利用蜂鸣器演奏音乐
下一篇:MSP430学习笔记3-PWM的产生

推荐阅读最新更新时间:2024-03-16 16:00

MSP430F249单片机 Proteus仿真 IAR工程设置 实例和开发环境
1 开发环境与流水灯实验 使用的是IAR 7.10 新建工程的细节看这里: https://blog.csdn.net/x1131230123/article/details/106956182 需要在debug模式下设置, 编译后hex文件在proNameDebugExe下 proteus设置时钟: 代码: #include MSP430x24x.h #define uchar unsigned char #define uint unsigned int void delayms( uint t ) { uint i; while ( t-- ) for ( i = 1330; i 0; i-- )
[单片机]
<font color='red'>MSP430</font>F249单片机 Proteus仿真 IAR工程设置 实例和开发环境
51单片机你选“谁”?
一、AT89S51代替AT89C51的实质 MCS-51内核系列兼容的单片机仍是应用的主流产品(比如目前流行的89S51、已经停产的89C51等),各高校及专业学校的培训教材仍与MCS-51单片机作为代表进行理论基础学习。 兼容系列单片机,就是说MCS-51内核实际上已经成为一个8位单片机的标准。 不同公司的51单片机产品都是和MCS-51内核兼容的产品而以。同样的一段程序,在各个单片机厂家的硬件上运行的结果都是一样的,如ATMEL的89C51(已经停产)、89S51, PHILIPS(菲利浦),和WINBOND(华邦)等, 89C51最致命的缺陷在于不支持ISP(在线更新程序)功能, 89S51在工艺上进行了改进,89S5
[单片机]
使用两个定时器实现PWM(脉宽调制)——呼吸灯
PWM(脉宽调制)大家可以上网查查,其原理讲解很多。为了更好的学习PWM,我特意参照别人写的文章,自己也写了一份代码来实现PWM。代码如下: #include stc12c5a60s2.h unsigned long cnt; unsigned int cnt_T1; unsigned int high; unsigned int low; unsigned char TH0_high; unsigned char TL0_high; unsigned char TH0_low; unsigned char TL0_low; unsigned char T1H1; unsigned char T1L1; unsigned
[单片机]
MSP430 F5529 硬件SPI OLED 单片机 0.96英寸7针OLED SPI 6针OL
https://www.ti.com.cn/cn/lit/ds/symlink/msp430f5529.pdf?ts=1600611951477&ref_url=https%253A%252F%252Fwww.ti.com.cn%252Fproduct%252Fcn%252FMSP430F5529 https://www.ti.com/lit/ug/slau533d/slau533d.pdf UCA0 用了这个串口就不能用了 P2.7//UCA0CLK P3.2//UCA0STE P3.3/UCA0TXD/UCA0SIMO P3.4/UCA0RXD/UCA0SOMI #include msp430.h #incl
[单片机]
<font color='red'>MSP430</font> F5529 硬件SPI OLED 单片机 0.96英寸7针OLED SPI 6针OL
TI推出MSP430 LaunchPad开发套件,快速实现原型设计
 日前,德州仪器 (TI) 宣布推出最新MSP430TM MCU Value Line LaunchPad 开发套件 ,进一步兑现了其结合 16位MCU高性能、超低功耗以及超低成本来解决8位MCU不足之处的一贯承诺。该开源套件包含通过TI MSP430 Value Line MCU便捷启动各种设计方案所需的所有软硬件。上述MCU起价仅25美分,可实现比8位MCU锐升10倍的性能以及延长10倍的电池使用寿命。 LaunchPad使开发人员能够快速利用MSP430 Value Line MCU进行器件评估、编程或调试,从而支持快速原型设计与开发。该高灵活性有助于开发人员卸下安放在定制电路板上的编程器件,或将其插入 Laun
[工业控制]
HAL库_RTC定时器时间卡住
在使用HAL库驱动RTC的时候,遇到过一个BUG,那就是读出来的时间没有变化,后来找到原因。 那就是在读取RTC时间的时候必须日期和时间一起读,且最好保证先读时间,再读日期。 在 HAL_RTC_GetDate 这个函数中有如下注释: * @note You must call HAL_RTC_GetDate() after HAL_RTC_GetTime() to unlock the values * in the higher-order calendar shadow registers to ensure consistency between the time and date values.
[单片机]
具有远程开启功能的指纹应用系统设计
摘要:设计了一个能用于门锁和保险箱的指纹识别与控制系统。系统以MSP430F149为主控芯片,FSC7002为指纹处理芯片,兼具密码和指纹两种开启方式。还设计了一个可选的远程开启和报警模块。模块采用MG323作为通信芯片,通过GSM网络实现了远程信息的传输。开发了基于Android系统的远程开启软件,软件采用DES对传输信息进行加密,提高了信息传输的安全性。 引言 指纹识别是一种有效的身份识别技术。随着光电技术和半导体技术的发展,自动指纹识别技术越来越多地被应用到人们的日常生活之中。指纹锁和指纹保险箱是指纹识别应用中比较重要的产品。与指纹门禁不同,应用于锁具中的指纹系统一般采用电池供电,具有功耗低、体积小等特点。本文设计和实现
[单片机]
具有远程开启功能的指纹应用系统设计
MSP430多处理器之间的通信方式及协议
在单片机系统中,多处理器是指多个相同类型或者不同类型的单片机协作处理同一个系统的不同工作。它们之间必须具备一定的数据交换和协作处理能力,共同完成一个系统化的工作。不同处理器之间可以采用数据交换方式、并行总线方式、串行总线方式进行通信。其中,数据交换方式又可以称为共享内存交换方式;串行总线方式又可以分为单总线方式、集成电路之间的通信方式和UART方式。 1 MSP430多处理器   MSP430是一款超低功耗的混合信号控制器,具有1 6位RISC结构,有着丰富的片内外设,主要包括有看门狗、定时器、比较器、硬件乘法器、液晶驱动器、ADC、I/0端口、串口(USART)等等,还集成有64 KB的Flas’E-ROM和2 KB的RAM。其
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved