开发者社区> 文艺小青年> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

简介:
+关注继续查看

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

  1. /********************************************************* 
  2. 程序功能:用固定频率的方波驱动蜂鸣器,共16种音调;在蜂鸣器 
  3.           发出不同音调的同时,LED发光以二进制数字形式指示 
  4.           当前音调的编号(1~16) 
  5. ---------------------------------------------------------- 
  6. 拨码开关设置:将BUZZER位拨至ON,其余位拨至OFF 
  7. 测试说明:聆听蜂鸣器发声的音调变化。同时led也有对应的指示 
  8. **********************************************************/  
  9. #include <msp430.h>  
  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. }  

本文转自emouse博客园博客,原文链接:http://www.cnblogs.com/emouse/archive/2010/07/21/2198222.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
STM32小项目总结2:(内含:1.对射式红外传感器计次+2.旋转编码器计次+3.定时器定时中断+4.定时器外部中断+5.笔记)
STM32小项目总结2:(内含:1.对射式红外传感器计次+2.旋转编码器计次+3.定时器定时中断+4.定时器外部中断+5.笔记)
0 0
TIM定时中断(内含:1.TIM简介+2.定时器类型+3.基本定时器+4.通用定时器+5.高级定时器+6.定时中断基本结构+7.预分频器时序+8.计数器时序+9.计数器有/无预装+10.RCC时钟树)
TIM定时中断(内含:1.TIM简介+2.定时器类型+3.基本定时器+4.通用定时器+5.高级定时器+6.定时中断基本结构+7.预分频器时序+8.计数器时序+9.计数器有/无预装+10.RCC时钟树)
0 0
MSP430-定时器的寄存器介绍以及测试应用
MSP430-定时器的寄存器介绍以及测试应用
0 0
MSP430-定时器的使用(PWM)
MSP430-定时器的使用(PWM)
0 0
4-MSP430定时器_定时器中断
一开始没写好就上传了,,,,,,,,这次来个全的 自己学MSP430是为了写一篇关于PID的文章,需要430在proteus上做仿真,一则认为在自动控制算法上PID真的很经典,PLC设备上大多是模块式的,拿来就是参考说明书设置,设置,,,而对于单片机而言就是程序!!!只有自己写出来PID算法,才能对PID有更深刻的理解,.
890 0
MSP430常见问题之看门狗及定时器类
Q1. 定时器两个中断TAIE 和CCIE,有什么区别?两个中断的中断向量一样吗?A1:TAIE 和CCIE指的是不同事件。TAIE指TAR 计数器溢出,从65535 到0 的变化,由TAIFG 引起的。
1084 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载