0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

开发板产生不同频率声音的程序(两个定时器的使用)

算法&编程学院 来源:网络整理 作者:工程师3 2018-04-20 09:12 次阅读

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

[cpp] view plain copy/*********************************************************

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

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

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

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

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

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

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

#include 《msp430.h》

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; // 接着往上加,和清零的效果一样,循环播放

}

}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 定时器
    +关注

    关注

    23

    文章

    3247

    浏览量

    114747
  • 蜂鸣器
    +关注

    关注

    12

    文章

    891

    浏览量

    45930
收藏 人收藏

    评论

    相关推荐

    STM32G4定时器TIM输入捕获频率测量

    摘要本文章基于国信长天M4开发板,讲述了STM32G4 定时器TIM输入捕获频率测量的因通过用,祝各位学生蓝桥杯比赛取得好成绩!M4开发板 频率
    发表于 08-16 06:35

    定时器介绍

    同时用两个定时器控制蜂鸣器发声, 定时器0控制频率定时器1控制同
    发表于 02-23 15:56 20次下载

    【实验38】定时器定时

    HL配套C实验例程100例之定时器定时,配合开发板学习效果更好。
    发表于 04-11 16:09 7次下载

    【实验45】用定时器产生方波0

    HL配套C实验例程100例之用定时器产生方波0,配合开发板学习效果更好。
    发表于 04-11 16:09 6次下载

    stm32定时器中断程序

    STM32的定时器强大的模块,定时器使用的频率也是很高的,定时器可以做一些基本的定时,还可以
    发表于 10-12 16:59 1.3w次阅读

    555定时器产生方波原理(四款555定时器产生方波的电路详解)

    本文主要介绍了555定时器产生方波原理(五款555定时器产生方波的电路详解)。555定时器的功能主要由
    发表于 01-22 09:07 36w次阅读
    555<b class='flag-5'>定时器</b><b class='flag-5'>产生</b>方波原理(四款555<b class='flag-5'>定时器</b><b class='flag-5'>产生</b>方波的电路详解)

    如何同时使用两个定时器控制蜂鸣器发声详细单片机程序免费下载

    本文档的主要内容详细介绍的是如何同时使用两个定时器控制蜂鸣器发声嵌套运用的详细单片机程序免费下载。
    发表于 11-05 08:00 11次下载
    如何同时使用<b class='flag-5'>两个</b><b class='flag-5'>定时器</b>控制蜂鸣器发声详细单片机<b class='flag-5'>程序</b>免费下载

    同时使用两个定时器控制蜂鸣器发声的程序代码免费下载

    本文档的主要内容详细介绍的是同时使用两个定时器控制蜂鸣器发声的程序代码免费下载。
    发表于 06-20 17:44 6次下载
    同时使用<b class='flag-5'>两个</b><b class='flag-5'>定时器</b>控制蜂鸣器发声的<b class='flag-5'>程序</b>代码免费下载

    使用单片机开发板实现LED流水和定时器程序免费下载

    本文档的主要内容详细介绍的是使用单片机开发板实现LED流水和定时器程序免费下载。
    发表于 06-10 17:15 2次下载
    使用单片机<b class='flag-5'>开发板</b>实现LED流水和<b class='flag-5'>定时器</b>的<b class='flag-5'>程序</b>免费下载

    MSP430F5529通过定时器A产生两个反相频率占空比可调PWM波

    两个定时器产生两个反相的PWM波并通过一捕获比较捕获其中一
    发表于 11-19 20:36 3次下载
    MSP430F5529通过<b class='flag-5'>定时器</b>A<b class='flag-5'>产生</b><b class='flag-5'>两个</b>反相<b class='flag-5'>频率</b>占空比可调PWM波

    【国信长天蓝桥杯】③ STM32G431 TIM输入捕获,定时器输入捕获频率测量使用步骤

    摘要本文章基于国信长天M4开发板,讲述了STM32G4 定时器TIM输入捕获频率测量的因通过用,祝各位学生蓝桥杯比赛取得好成绩!M4开发板 频率
    发表于 11-30 11:51 11次下载
    【国信长天蓝桥杯】③ STM32G431 TIM输入捕获,<b class='flag-5'>定时器</b>输入捕获<b class='flag-5'>频率</b>测量使用步骤

    基于cubemx的stm32开发之路(使用正点原子战舰V3开发板)——基本定时器的应用

    1hz的闪烁实验设备正点原子新战舰V3 STM32F103ZET6开发板学习st-link烧录定时器原理F103定时器组成STM32F1
    发表于 12-08 15:21 5次下载
    基于cubemx的stm32<b class='flag-5'>开发</b>之路(使用正点原子战舰V3<b class='flag-5'>开发板</b>)——基本<b class='flag-5'>定时器</b>的应用

    基于两个NE555定时器的叮咚声音发生电路图

    这是基于两个NE555定时器IC的叮咚声音发生的电路图,该电路设计用于在两个可调频率之间切换以
    的头像 发表于 04-02 14:23 2296次阅读
    基于<b class='flag-5'>两个</b>NE555<b class='flag-5'>定时器</b>的叮咚<b class='flag-5'>声音</b>发生<b class='flag-5'>器</b>电路图

    基于两个555定时器构建的警笛电路

    在本教程中,您将学习如何使用两个 555定时器 IC 构建 555 警笛电路。
    的头像 发表于 06-29 14:56 2704次阅读
    基于<b class='flag-5'>两个</b>555<b class='flag-5'>定时器</b>构建的警笛电路

    stm32一定时器能同时控制两个灯以不同频率闪烁吗?

    STM32的定时器功能强大,**STM32的定时器可以同时控制两个灯以不同频率闪烁** 。
    的头像 发表于 12-13 10:43 2159次阅读