历史上的今天
返回首页

历史上的今天

今天是:2025年02月03日(星期一)

2020年02月03日 | MSP430学习笔记4-两个定时器产生步进单频音

2020-02-03 来源:eefocus

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


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

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

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

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

----------------------------------------------------------

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

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

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

#include


typedef unsigned char uchar;


uchar step = 0xff;


/************************主函数************************/

void main( void )

{

    uchar i;

    

    WDTCTL = WDTPW + WDTHOLD;           //关狗

   

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

    P1DIR = 0XFF;P1OUT = 0XFF;

    P2DIR = 0XFF;P2OUT = 0XFF;

    P3DIR = 0XFF;P3OUT = 0XFF;

    P4DIR = 0XFF;P4OUT = 0XFF;

    P5DIR = 0XFF;P5OUT = 0XFF;

    P6DIR = 0XFF;P6OUT = 0XFF;

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

    

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

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

    do

    {

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

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

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

    }

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

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

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

    

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

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

    

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

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

    TBCCTL0 |= CCIE;

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

    

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

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

    P2OUT = 0xff;

    

    _EINT();

    

    LPM1;

}

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

函数名称:Timer_A

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

          蜂鸣器发声

参    数:无

返回值  :无

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

#pragma vector=TIMERA0_VECTOR

__interrupt void Timer_A (void)

{

  P6OUT ^= BIT7;                            // Toggle P6.7

}

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

函数名称:Timer_B

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

          蜂鸣器发声频率

参    数:无

返回值  :无

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

#pragma vector=TIMERB0_VECTOR

__interrupt void Timer_B (void)

{

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

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

    step++;

    switch(step)

    {  

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    }

}



推荐阅读

史海拾趣

ESTEK公司的发展小趣事

随着国内市场的逐渐饱和,ESTEK公司开始将目光投向国际市场。公司制定了详细的国际化战略,通过参加国际展会、拓展海外销售渠道等方式,积极开拓国际市场。同时,ESTEK公司还积极引进国外先进的技术和管理经验,不断提升自身的竞争力和国际化水平。在国际市场上,ESTEK公司的产品逐渐获得了认可,公司的国际影响力也日益增强。

国盛科技(BOCHEN)公司的发展小趣事

随着市场竞争的加剧,国盛科技意识到传统生产方式已难以满足市场需求。于是,公司开始积极探索自动化生产之路。经过不懈努力,国盛科技成功自主研发了电位器自动包装设备、自动测试设备等多种自动化设备,实现了产品流水化生产。这一突破不仅大大提高了生产效率,还使得电位器年产量突破一亿只,为国盛科技赢得了市场的广泛认可。

BJB公司的发展小趣事

BJB公司的创立源于对照明电器领域的深刻理解和市场需求的敏锐洞察。创立初期,公司面临着资金短缺、技术挑战和市场竞争等多重困难。然而,通过创始人的坚定信念和团队的共同努力,BJB逐渐攻克技术难关,推出了一系列高质量的照明配件产品,初步在市场中获得了认可。

Future Designs, Inc. (FDI)公司的发展小趣事

为了进一步提升公司的竞争力和市场份额,FDI实施了国际化战略。他们积极拓展海外市场,与多个国家和地区的客户建立了合作关系。通过参加国际展会、设立海外分支机构等方式,FDI不断提升品牌知名度和影响力。同时,他们还加强与当地供应商和合作伙伴的合作,共同开拓市场,实现互利共赢。这些努力使得FDI在全球电子行业中的地位日益稳固。

American Micro Products Inc公司的发展小趣事

AMP深知品质是企业的生命线。因此,公司始终将品质管理放在首位,从原材料的采购到生产过程的每一个环节都严格把控。同时,AMP还注重客户需求的收集与反馈,根据市场变化及时调整产品策略,确保产品能够满足客户的实际需求。

方舟(ARKLED)公司的发展小趣事

方舟公司自成立以来,始终致力于LED光电技术的研发与创新。公司拥有一支由行业专家和技术骨干组成的研发团队,不断推出具有自主知识产权的新产品。其中,方舟公司独创的某款LED显示屏,以其高清晰度、低功耗和长寿命等特性,在市场上获得了广泛认可。这款产品不仅提升了方舟公司的品牌影响力,还为公司带来了丰厚的经济回报。

问答坊 | AI 解惑

100M虚拟示波器 DSO-2090 USB

DSO-2090 USB 流线型设计,体积小巧, USB2.0接口,免电源,与台式示波器类似界面,易于上手. 更适合于笔记本电脑,生产线维修调整,便于出差使用。 小的尺寸(mm):190(L)x100(W)x35(H) ,便于携带. .高刷新率, 高采样率,100MS/s实时采样. 软件 ...…

查看全部问答>

捷波875PMAX主板电路图

捷波875PMAX主板电路图 [ 本帖最后由 西门 于 2009-5-22 22:57 编辑 ]…

查看全部问答>

DS18B20单总线多点测温系统

http://www.c51bbs.com/thread-28083-1-1.html…

查看全部问答>

楼道人体感应定时器

楼道人体感应定时器 1、产品特征 Ø 红外感应语音报时提示 Ø 根据环境自动控制灯具 Ø 可扩展为声控 Ø 可扩展数码管显示时间 Ø 语音提示时间段6:00~21:00 2、电器参数 Ø 工作电压:AC22 ...…

查看全部问答>

一年一度的全球最大规模动物迁徙已经开始了,祝各位行程快乐!

一年一度的全球最大规模动物迁徙已经开始了,明天我也要加入这个大军之中。 提前祝大家新春快乐!…

查看全部问答>

vxWorks是如何响应Ctrl+X,Ctrl+C怎么重启shell的?代码在哪个函数响应这些消息的??

vxWorks是如何响应Ctrl+X,Ctrl+C怎么重启shell的?代码在哪个函数响应这些消息的??…

查看全部问答>

写下载程序到MCU

写下载程序到MCU…

查看全部问答>

大哥哥大姐姐 新手求救!!一个关于EVC程序部署到PDA上去的问题

我是个新手   请问如何将一个EVC程序部署到PDA上去,我在EVC上运行程序是报\"Cannot execute program\"的错误,各位帮帮忙,我不知道是为什么…

查看全部问答>

哪里可以下载win ce 6?

我把vs2005装好了,里面没有ce6选项啊。我想用evc怎么办呢。evc4我也装不上。急用。谢谢了。我是初学者。…

查看全部问答>

ARM入门经验

请高工们抽时间发表一些ARM入门经验,分享一下你们的苦尽甘来。让像我这样想踏进ARM这领域的菜鸟少走一些冤枉路,我正在找入门的路途,希望多多指教!!!…

查看全部问答>