1916|0

2781

帖子

419

TA的资源

五彩晶圆(中级)

楼主
 

MSP430学习笔记4-两个定时器产生步进单频音 [复制链接]

这个程序是开发板中用来产生不同频率声音的程序,整体程序较为简单,主要是两个定时器的使用,代码及我的注释如下。
  1. /*********************************************************
  2. 程序功能:用固定频率的方波驱动蜂鸣器,共16种音调;在蜂鸣器
  3.           发出不同音调的同时,LED发光以二进制数字形式指示
  4.           当前音调的编号(1~16)
  5. ----------------------------------------------------------
  6. 拨码开关设置:将BUZZER位拨至ON,其余位拨至OFF
  7. 测试说明:聆听蜂鸣器发声的音调变化。同时led也有对应的指示
  8. **********************************************************/
  9. #include

  10. typedef unsigned char uchar;

  11. uchar step = 0xff;

  12. /************************主函数************************/
  13. void main( void )
  14. {
  15.     uchar i;
  16.    
  17.     WDTCTL = WDTPW + WDTHOLD;           //关狗
  18.    
  19.     /*下面六行程序关闭所有的IO口*/
  20.     P1DIR = 0XFF;P1OUT = 0XFF;
  21.     P2DIR = 0XFF;P2OUT = 0XFF;
  22.     P3DIR = 0XFF;P3OUT = 0XFF;
  23.     P4DIR = 0XFF;P4OUT = 0XFF;
  24.     P5DIR = 0XFF;P5OUT = 0XFF;
  25.     P6DIR = 0XFF;P6OUT = 0XFF;
  26.     P6DIR |= BIT2;P6OUT |= BIT2;         //关闭电平转换
  27.    
  28.     /*------选择系统主时钟为8MHz-------*/
  29.     BCSCTL1 &= ~XT2OFF;                 //打开XT2高频晶体振荡器
  30.     do
  31.     {
  32.         IFG1 &= ~OFIFG;                 //清除晶振失败标志
  33.         //IFG1是中断寄存器 OFIFG是晶振启动失败中断标志位
  34.         for (i = 0xFF; i > 0; i--);     //等待8MHz晶体起振
  35.     }
  36.     while ((IFG1 & OFIFG));             //晶振失效标志仍然存在?
  37.     //上面这一步主要是等待晶振正常工作
  38.     BCSCTL2 |= SELM_2 + SELS;           //MCLK和SMCLK选择高频晶振
  39.    
  40.     TACCTL0 |= CCIE;                    //使能比较中断
  41.     TACTL |= TASSEL_2 + ID_3 ;          //计数时钟选择SMLK=8MHz,1/8分频后为1MHz
  42.    
  43.     TBCCR0 = 4096*2 - 1;                //周期两秒
  44.     //时间计算:32768/8*2+1注意使用的是手表晶振
  45.     TBCCTL0 |= CCIE;
  46.     TBCTL |= TBSSEL_1 + ID_3 + MC_1;    //时钟源ACLK/8,up mode
  47.    
  48.     P6DIR |= BIT7;                      //蜂鸣器对应IO为6.7设置为输出
  49.     P2DIR = 0xff;                       //指示对应的状态
  50.     P2OUT = 0xff;
  51.    
  52.     _EINT();
  53.    
  54.     LPM1;
  55. }
  56. /*******************************************
  57. 函数名称:Timer_A
  58. 功    能:定时器A的中断服务函数,在这里驱动
  59.           蜂鸣器发声
  60. 参    数:无
  61. 返回值  :无
  62. ********************************************/
  63. #pragma vector=TIMERA0_VECTOR
  64. __interrupt void Timer_A (void)
  65. {
  66.   P6OUT ^= BIT7;                            // Toggle P6.7
  67. }
  68. /*******************************************
  69. 函数名称:Timer_B
  70. 功    能:定时器B的中断服务函数,在这里更改
  71.           蜂鸣器发声频率
  72. 参    数:无
  73. 返回值  :无
  74. ********************************************/
  75. #pragma vector=TIMERB0_VECTOR
  76. __interrupt void Timer_B (void)
  77. {
  78.     if(step == 0xff)                        //step的初值就是0xff,
  79.       TACTL |= MC_1;//需要将TimerA设置为增计数模式,可以在初始化的时候设置,不明白为什么放在这个地方。   
  80.     step++;
  81.     switch(step)
  82.     {  
  83.     case    0:  TACCR0 = 5000;  P2OUT = ~1;   break;      // 100Hz
  84.     //P2OUT使用led显示对应的数值,只是为了便于演示,没实际意义
  85.     case    1:  TACCR0 = 2500;  P2OUT = ~2;   break;      // 200Hz
  86.     case    2:  TACCR0 = 1250;  P2OUT = ~3;   break;      // 400Hz
  87.     case    3:  TACCR0 = 625;   P2OUT = ~4;   break;      // 800Hz
  88.     case    4:  TACCR0 = 500;   P2OUT = ~5;   break;      // 1KHz
  89.     case    5:  TACCR0 = 250;   P2OUT = ~6;   break;      // 2KHz
  90.     case    6:  TACCR0 = 167;   P2OUT = ~7;   break;      // 3KHz
  91.     case    7:  TACCR0 = 125;   P2OUT = ~8;   break;      // 4KHz
  92.     case    8:  TACCR0 = 100;   P2OUT = ~9;   break;      // 5KHz
  93.     case    9:  TACCR0 = 83;    P2OUT = ~10;   break;      // 6KHz
  94.     case    10:  TACCR0 = 71;   P2OUT = ~11;   break;      // 7KHz
  95.     case    11:  TACCR0 = 63;   P2OUT = ~12;   break;      // 8KHz
  96.     case    12:  TACCR0 = 56;   P2OUT = ~13;   break;      // 9KHz
  97.     case    13:  TACCR0 = 50;   P2OUT = ~14;   break;      // 10KHz
  98.     case    14:  TACCR0 = 33;   P2OUT = ~15;   break;      // 15KHz
  99.     case    15:  TACCR0 = 25;   P2OUT = ~16;   break;      // 20KHz
  100.     case    16:  step = 0xff;               // 接着往上加,和清零的效果一样,循环播放
  101.     }
  102. }
复制代码
 
点赞 关注
个人签名

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表