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

这个程序是开发板中用来产生不同频率声音的程序,整体程序较为简单,主要是两个定时器的使用,代码及我的注释如下。
[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; // 接着往上加,和清零的效果一样,循环播放
}
}

华为Mate10什么时候上市?最新消息:华为Mate10成iPhone8最大竞争对手,你会选谁呢?
智能镜面电视让家居系统实现了智能化的升级
华为p50和华为mate40哪个好
无线路由器的WiFi带机量与什么因素有关
ST提供三相电机驱动器设计平台
开发板产生不同频率声音的程序(两个定时器的使用)
京东首次披露大快消事业群发展路线图:构建快消生态链
AI时代刚刚来临 国内AI公司更看重未来资源的布局与AI生态的建设
高压线束总成零件的耐高压测试
AMD新主板率先抢占300系,逼英特尔发飙嘛?
基于端到端的Al自动驾驶决策方法
放大电路微变等效电路分析法详解
PCB生产为什么要使用PCB分板机?
华为智能安防生态联盟:千亿研发投入加持,引领安防产业创新
什么是Centrino
豪威科技公司宣布推出OV16E1,最新一代的高性能1600万像素图像传感器
浅析自动驾驶线控底盘技术
惨被吊打:联发科华为荣耀V9play对标高通系坚果Pro努比亚Z17mini
研发工业软件主要有哪些难题?
三菱电机推出MELFA系列工业机器人