当前位置:文档之家› 通用定时器PWM应用例程--蜂鸣器演奏乐曲

通用定时器PWM应用例程--蜂鸣器演奏乐曲

通用定时器PWM应用例程--蜂鸣器演奏乐曲
通用定时器PWM应用例程--蜂鸣器演奏乐曲

通用定时器PWM应用例程:蜂鸣器演奏乐曲

一.说明:本例程是将流明LM3SLib_Timer.pdf文档中的例程9及例程10(PWM应用:蜂鸣器演奏乐曲),移植到STM32F103上。

二.流明LM3SLib_Timer.pdf例程9及例程10的拷贝:

例程9.Timer PWM应用:蜂鸣器发声

如图1.1所示,为EasyARM1138开发板上的蜂鸣器驱动电路。蜂鸣器类型是交流蜂鸣器,也称无源蜂鸣器,需要输入一列方波才能鸣响,发声频率等于驱动方波的频率。

图1.1 蜂鸣器驱动电路

程序清单1.9是Timer模块16位PWM模式的一个应用,可以驱动交流蜂鸣器发声,运行后蜂鸣器以不同的频率叫两声。其中"buzzer.h"和"buzzer.c"是蜂鸣器的驱动程序,仅有3个驱动函数,用起来很简捷。

程序清单1.9 Timer PWM应用:蜂鸣器发声

文件:main.c

#include "systemInit.h"

#include "buzzer.h"

// 主函数(程序入口)

int main(void)

{

jtagWait(); // 防止JTAG失效,重要!

clockInit(); // 时钟初始化:晶振,6MHz

buzzerInit(); // 蜂鸣器初始化

buzzerSound(1500); // 蜂鸣器发出1500Hz声音

SysCtlDelay(400* (TheSysClock / 3000)); // 延时约400ms

buzzerSound(2000); // 蜂鸣器发出2000Hz声音

SysCtlDelay(800* (TheSysClock / 3000)); // 延时约800ms

buzzerQuiet( ); // 蜂鸣器静音

for (;;)

{

}

}

文件:buzzer.h

#ifndef __BUZZER_H__

#define __BUZZER_H__

// 蜂鸣器初始化

extern void buzzerInit(void);

// 蜂鸣器发出指定频率的声音

extern void buzzerSound(unsigned short usFreq);

// 蜂鸣器停止发声

extern void buzzerQuiet(void);

#endif // __BUZZER_H__

文件:buzzer.c

#include "buzzer.h"

#include

#include

#include

#include

#include

#define PART_LM3S1138

#include

#define SysCtlPeriEnable SysCtlPeripheralEnable

#define GPIOPinTypeOut GPIOPinTypeGPIOOutput

// 声明全局的系统时钟变量

extern unsigned long TheSysClock;

// 蜂鸣器初始化

void buzzerInit(void)

{

SysCtlPeriEnable(SYSCTL_PERIPH_TIMER1); // 使能TIMER1模块

SysCtlPeriEnable(CCP3_PERIPH); // 使能CCP3所在的GPIO端口

GPIOPinTypeTimer(CCP3_PORT, CCP3_PIN); // 设置相关管脚为Timer功能TimerConfigure(TIMER1_BASE, TIMER_CFG_16_BIT_PAIR | // 配置TimerB为16位PWM TIMER_CFG_B_PWM);

}

// 蜂鸣器发出指定频率的声音

// usFreq是发声频率,取值(系统时钟/65536)+1 ~20000,单位:Hz

void buzzerSound(unsigned short usFreq)

{

unsigned long ulVal;

if ((usFreq <= TheSysClock / 65536UL) || (usFreq > 20000))

{

buzzerQuiet( );

}

else

{

GPIOPinTypeTimer(CCP3_PORT, CCP3_PIN); // 设置相关管脚为Timer功能

ulVal = TheSysClock / usFreq;

TimerLoadSet(TIMER1_BASE, TIMER_B, ulVal); // 设置TimerB初值

TimerMatchSet(TIMER1_BASE, TIMER_B, ulVal / 2); // 设置TimerB匹配值

TimerEnable(TIMER1_BASE, TIMER_B); // 使能TimerB计数

}

}

// 蜂鸣器停止发声

void buzzerQuiet(void)

{

TimerDisable(TIMER1_BASE, TIMER_B); // 禁止TimerB计数

GPIOPinTypeOut(CCP3_PORT, CCP3_PIN); // 配置CCP3管脚为GPIO输出

GPIOPinWrite(CCP3_PORT, CCP3_PIN, 0x00); // 使CCP3管脚输出低电平

}

例程10.Timer PWM应用:蜂鸣器演奏乐曲

程序清单1.10是Timer模块16位PWM模式的一个应用,能驱动交流蜂鸣器演奏一首动听的乐曲《化蝶》(乐谱参见图1.2)。"music.h"和"music.c"是演奏乐曲的驱动程序。

图1.2 乐谱《化蝶》

简谱是大众化的音乐记谱方式,比较容易理解和掌握。我们可以把一首乐谱(score)看成是由若干个基本的音符(note)单元组成。一个音符由音名和时值组成。音名就是低音、中音、高音的1234567(唱作do re mi fa sol la si),其本质是音符的发声频率。在头文件"music.h"里,用L1~L7、M1~M7、H1~H7定义了低音、中音、高音所对应的发声频率。时值是音符的发声时间长短,有全音符、二分音符、四分音符??等等。音符可以后缀一个“符点”,表示时值增加1/2,特殊地,二分音符加符点时用“-”代替圆点。参见表1.26的描述。

在头文件"music.h"里定义有一个音符结构体tNote,有两个数据成员:音名mName和时值mTime。在C文件"music.c"里定义有一个tNote型常量数表MyScore[ ],用来保存实际乐谱转换成tNote 格式的数据。有了上述一点点乐谱基础知识,我们就可以很方便地编辑这个数表了。比如音符“3”转换为“{M3, T/4}”,音符“3.”转换为“{M3, T/4+T/8}”,等等。在"music.c"里,已经在数表MyScore[ ]里给出了乐谱《化蝶》开头一部分音符转换结果,其余部分请感兴趣的读者补充完整。

程序清单1.10 Timer PWM应用:蜂鸣器演奏乐曲

文件:main.c

#include "systemInit.h"

#include "buzzer.h"

#include "music.h"

// 主函数(程序入口)

int main(void)

{

jtagWait(); // 防止JTAG失效,重要!

clockInit(); // 时钟初始化:晶振,6MHz

buzzerInit(); // 蜂鸣器初始化

for (;;)

{

musicPlay();

SysCtlDelay(4000 * (TheSysClock / 3000));

}

}

文件:music.h

#ifndef __MUSIC_H__

#define __MUSIC_H__

// 定义低音音名(数值单位:Hz)

#define L1 262 // c

#define L2 294 // d

#define L3 330 // e

#define L4 349 // f

#define L5 392 // g

#define L6 440 // a1

#define L7 494 // b1

// 定义中音音名

#define M1 523 // c1

#define M2 587 // d1

#define M3 659 // e1

#define M4 698 // f1

#define M5 784 // g1

#define M6 880 // a2

#define M7 988 // b2

// 定义高音音名

#define H1 1047 // c2

#define H2 1175 // d2

#define H3 1319 // e2

#define H4 1397 // f2

#define H5 1568 // g2

#define H6 1760 // a3

#define H7 1976 // b3

// 定义时值单位,决定演奏速度(数值单位:ms)

#define T 3600

// 定义音符结构

typedef struct

{

short mName; // 音名:取值L1~L7、M1~M7、H1~H7分别表示低音、中音、高音的// 1234567,取值0表示休止符

short mTime; // 时值:取值T、T/2、T/4、T/8、T/16、T/32分别表示全音符、

// 二分音符、四分音符、八分音符?,取值0表示演奏结束

}tNote;

// 演奏乐曲

extern void musicPlay(void);

#endif // __MUSIC_H__

文件:music.c

#include "music.h"

#include "buzzer.h"

#include "systemInit.h"

// 定义乐曲:《化蝶》(梁祝)

const tNote MyScore[ ] =

{

{L3, T/4},

{L5, T/8+T/16},

{L6, T/16},

{M1, T/8+T/16},

{M2, T/16},

{L6, T/16},

{M1, T/16},

{L5, T/8},

{M5, T/8+T/16},

{H1, T/16},

{M6, T/16},

{M5, T/16},

{M3, T/16},

{M5, T/16},

{M2, T/2},

// 省略后续乐曲数据,请感兴趣的读者补充完整

{ 0, 0} // 结束

};

// 演奏乐曲

void musicPlay(void)

{

short i = 0;

for (;;)

{

if (MyScore[i].mTime == 0) break;

buzzerSound(MyScore[i].mName);

SysCtlDelay(MyScore[i].mTime * (TheSysClock/ 3000));

i++;

buzzerQuiet( );

SysCtlDelay(10 * (TheSysClock/ 3000));

}

}

三.移植到STM32F103上:

Timer3部分重映射 TIM3_CH2->PB5:PB5作为PWM输出。

// 定义低音音名(数值单位:Hz)

#define L1 262

#define L2 294

#define L3 330

#define L4 349

#define L5 392

#define L6 440

#define L7 494

// 定义中音音名

#define M1 523

#define M2 587

#define M3 659

#define M4 698

#define M5 784

#define M6 880

#define M7 988

// 定义高音音名

#define H1 1047

#define H2 1175

#define H3 1319

#define H4 1397

#define H5 1568

#define H6 1760

#define H7 1976

// 定义时值单位,决定演奏速度(数值单位:ms)

#define TT 2000

typedef struct

{

short mName; // 音名:取值L1~L7、M1~M7、H1~H7分别表示低音、中音、高音的1234567,取值0表示休止符

short mTime; // 时值:取值T、T/2、T/4、T/8、T/16、T/32分别表示全音符、二分音符、四分音符、八分音符.,取值0表示演奏结束

}tNote;

int main(void)

{

delay_init(); //延时函数初始化

NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级TIM3_PWM_Init(14399,10); //分频。PWM频率=72000/14400/11(Khz)

for (;;)

{

musicPlay();

delay_ms(1500);

delay_ms(1500);

}

}

//PWM输出初始化

//arr:自动重装值

//psc:时钟预分频数

void TIM3_PWM_Init(u16 arr,u16 psc)

{

GPIO_InitTypeDef GPIO_InitStructure;

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

TIM_OCInitTypeDef TIM_OCInitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设

和AFIO复用功能模块时钟使能

GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射 TIM3_CH2->PB5 //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOB, &GPIO_InitStructure);

TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期

的值 80K

TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值不分频

TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式

TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始

化TIMx的时间基数单位

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能

TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低

TIM_OC2Init(TIM3, &TIM_OCInitStructure); //根据TIM_OCInitStruct中指定的参数初始化外设TIMx

TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIMx在CCR2上的预装载寄存器

TIM_ARRPreloadConfig(TIM3, ENABLE); //使能TIMx在ARR上的预装载寄存器

TIM_Cmd(TIM3, ENABLE); //使能TIMx外设

}

// 蜂鸣器停止发声

void buzzerQuiet(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

TIM_Cmd(TIM3, DISABLE); //停止TIM3

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //PB.5 端口配置

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz

GPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOB.5

GPIO_ResetBits(GPIOB,GPIO_Pin_5); //PB.5 输出低

}

/////////////////////////////////////////////////////////

//蜂鸣器发出指定频率的声音

//usFreq是发声频率,取值(系统时钟/65536)+1 ~20000,单位:Hz

void buzzerSound(unsigned short usFreq)

{

GPIO_InitTypeDef GPIO_InitStructure;

unsigned long ulVal;

if((usFreq<=8000000/65536UL)||(usFreq>20000))

{

buzzerQuiet();// 蜂鸣器静音

}

else

{

GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射TIM3_CH2->PB5 //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形GPIOB.5

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO

ulVal=8000000/usFreq;

TIM3->ARR =ulVal ; //设置自动重装载寄存器周期的值(音调)

TIM_SetCompare2(TIM3,ulVal /2);//音量

TIM_Cmd(TIM3, ENABLE); //启动TIM3

}

}

// 演奏乐曲

void musicPlay(void)

{

u8 i=0;

while(1)

{

if (MyScore[i].mTime == 0) break;

buzzerSound(MyScore[i].mName);

delay_ms(MyScore[i].mTime);

i++;

buzzerQuiet(); // 蜂鸣器静音

delay_ms(10);// 10 ms

}

}

// 定义乐曲:刘德华《恭喜发财》

const tNote MyScore[]=

{

{L3,TT/8},{M6,TT/4},{M5,TT/4},{M6,TT/4},{M5,TT/8},{M3,TT/8},{M3,TT/4},{L3,TT/8},{M6,TT/4},{M5,T T/4},{M6,TT/4},{M5,TT/8},{M6,TT/8},{M6,TT/2},{M3,TT/8},{M2,TT/8+TT/16},{M3,TT/16},{M2,TT/8},

{M1,TT/8},{L6,TT/4},{M3,TT/8},{M2,TT/8+TT/16},{M3,TT/16},{M2,TT/8},{M1,TT/8},{M2,TT/4},{M2,TT/ 8+TT/16},{M1,TT/8},{M1,TT/4},{M2,TT/4},{M3,TT/4},{M5,TT/4},{M6,TT},{M6,TT/8+TT/16},{M5,TT/16}, {M3,TT/8},{M5,TT/8},{M6,TT/4}, //恭喜你发财。。。礼多人不怪

{L3,TT/8},{L6,TT/4},{L6,TT/8},{L5,TT/8},{L6,TT/8},{L3,TT/8},{L3,TT/8},{L5,TT/8},{L6,TT/8},{M1,TT/8}, {L6,TT/8},{L5,TT/8},{L6,TT/4},{L3,TT/8},{L5,TT/8},{M1,TT/4},{M1,TT/8},{M1,TT/8},{M2,TT/8},

{M2,TT/8},{M1,TT/8},{M2,TT/8},{M3,TT/2},{L3,TT/8},{M2,TT/4},{M2,TT/8},{M1,TT/8},{M2,TT/8},{L6,T T/8},{L6,TT/8},{M1,TT/8},{M2,TT/8},{M3,TT/8},{M2,TT/8},{M1,TT/8},{M2,TT/8},{M1,TT/8},{L6,TT/8}, {M1,TT/8},{M3,TT/8},{M3,TT/8},{M2,TT/8},{M1,TT/8},{M3,TT/4},{L5,TT/4},{L6,TT/2},//我祝满天下的女孩。。。智商充满你脑袋

{L3,TT/8},{L6,TT/4},{L6,TT/8},{L5,TT/8},{L6,TT/8},{L3,TT/8},{L3,TT/8},{L5,TT/8},{L6,TT/8},{M1,TT/8}, {L6,TT/8},{L5,TT/8},{L6,TT/4},{L3,TT/8},{L5,TT/8},{M1,TT/4},{M1,TT/8},{M1,TT/8},{M2,TT/8},

{M2,TT/8},{M1,TT/8},{M2,TT/8},{M3,TT/2},{L3,TT/8},{M2,TT/4},{M2,TT/8},{M1,TT/8},{M2,TT/8},{L6,T T/8},{L6,TT/8},{M1,TT/8},{M2,TT/8},{M3,TT/8},{M2,TT/8},{M1,TT/8},{M2,TT/8},{M1,TT/8},{L6,TT/8}, {M1,TT/8},{M3,TT/8},{M3,TT/8},{M2,TT/8},{M1,TT/8},{M3,TT/4},{L5,TT/4},{L6,TT/2},//我祝满天下的女孩。。。智商充满你脑袋

{L5,TT/4},{M1,TT/2+TT/4},{M1,TT/8},{M2,TT/8},{M3,TT/2+TT/4},{M3,TT/8},{M5,TT/8},{M5,TT/4+TT/8} ,{M3,TT/8},{M2,TT/4},{M1,TT/4},{M2,TT/2},{M2,TT/4+TT/8},{L6,TT/8},{M2,TT/4},{M3,TT/4},

{M4,TT/8+TT/16},{M5,TT/16},{M4,TT/8},{M3,TT/8},{M2,TT/2},{M5,TT/8},{M5,TT/8},{M3,TT/8},{M2,TT/ 8},{M1,TT/4},{L5,TT/8},{L6,TT/2},//大摇大摆。。。要喊得够豪迈

{L3,TT/8},{M6,TT/4},{M5,TT/4},{M6,TT/4},{M5,TT/8},{M3,TT/8},{M3,TT/4},{L3,TT/8},{M6,TT/4},{M5,T T/4},{M6,TT/4},{M5,TT/8},{M6,TT/8},{M6,TT/2},{M3,TT/8},{M2,TT/8+TT/16},{M3,TT/16},{M2,TT/8},

{M1,TT/8},{L6,TT/4},{M3,TT/8},{M2,TT/8+TT/16},{M3,TT/16},{M2,TT/8},{M1,TT/8},{M2,TT/4},{M2,TT/ 8+TT/16},{M1,TT/8},{M1,TT/4},{M2,TT/4},{M3,TT/4},{M5,TT/4},{M6,TT},{M6,TT/8+TT/16},{M5,TT/16}, {M3,TT/8},{M5,TT/8},{M6,TT/4}, //恭喜你发财。。。礼多人不怪

{L3,TT/8},{L6,TT/4},{L6,TT/8},{L5,TT/8},{L6,TT/8},{L3,TT/8},{L3,TT/8},{L5,TT/8},{L6,TT/8},{M1,TT/8}, {L6,TT/8},{L5,TT/8},{L6,TT/4},{L3,TT/8},{L5,TT/8},{M1,TT/4},{M1,TT/8},{M1,TT/8},{M2,TT/8},

{M2,TT/8},{M1,TT/8},{M2,TT/8},{M3,TT/2},{L3,TT/8},{M2,TT/4},{M2,TT/8},{M1,TT/8},{M2,TT/8},{L6,T T/8},{L6,TT/8},{M1,TT/8},{M2,TT/8},{M3,TT/8},{M2,TT/8},{M1,TT/8},{M2,TT/8},{M1,TT/8},{L6,TT/8}, {M1,TT/8},{M3,TT/8},{M3,TT/8},{M2,TT/8},{M1,TT/8},{M3,TT/4},{L5,TT/4},{L6,TT/2},//我祝满天下的女孩。。。智商充满你脑袋

{L5,TT/4},{M1,TT/2+TT/4},{M1,TT/8},{M2,TT/8},{M3,TT/2+TT/4},{M3,TT/8},{M5,TT/8},{M5,TT/4+TT/8} ,{M3,TT/8},{M2,TT/4},{M1,TT/4},{M2,TT/2},{M2,TT/4+TT/8},{L6,TT/8},{M2,TT/4},{M3,TT/4},

{M4,TT/8+TT/16},{M5,TT/16},{M4,TT/8},{M3,TT/8},{M2,TT/2},{M5,TT/8},{M5,TT/8},{M3,TT/8},{M2,TT/ 8},{M1,TT/4},{L5,TT/8},{L6,TT/2},//大摇大摆。。。要喊得够豪迈

{L3,TT/8},{M6,TT/4},{M5,TT/4},{M6,TT/4},{M5,TT/8},{M3,TT/8},{M3,TT/4},{L3,TT/8},{M6,TT/4},{M5,T T/4},{M6,TT/4},{M5,TT/8},{M6,TT/8},{M6,TT/2},{M3,TT/8},{M2,TT/8+TT/16},{M3,TT/16},{M2,TT/8},

{M1,TT/8},{L6,TT/4},{M3,TT/8},{M2,TT/8+TT/16},{M3,TT/16},{M2,TT/8},{M1,TT/8},{M2,TT/4},{M2,TT/ 8+TT/16},{M1,TT/8},{M1,TT/4},{M2,TT/4},{M3,TT/4},{M5,TT/4},{M6,TT},{M6,TT/8+TT/16},{M5,TT/16}, {M3,TT/8},{M5,TT/8},{M6,TT/4}, //恭喜你发财。。。礼多人不怪

{L3,TT/8},{M6,TT/4},{M5,TT/4},{M6,TT/4},{M5,TT/8},{M3,TT/8},{M3,TT/4},{L3,TT/8},{M6,TT/4},{M5,T T/4},{M6,TT/4},{M5,TT/8},{M6,TT/8},{M6,TT/2},{M3,TT/8},{M2,TT/8+TT/16},{M3,TT/16},{M2,TT/8},

{M1,TT/8},{L6,TT/4},{M3,TT/8},{M2,TT/8+TT/16},{M3,TT/16},{M2,TT/8},{M1,TT/8},{M2,TT/4},{M2,TT/ 8+TT/16},{M1,TT/8},{M1,TT/4},{M2,TT/4},{M3,TT/4},{M5,TT/4},{M6,TT},{M6,TT/8+TT/16},{M5,TT/16}, {M3,TT/8},{M5,TT/8},{M6,TT/4}, //恭喜你发财。。。礼多人不怪

{0,0},

};

// 定义乐曲:《荷塘月色》

const tNote MyScore[]=

{

{M1,TT/8},{M1,TT/4},{L6,TT/8},{L5,TT/4},{L6,TT/4},{M1,TT/4},{M1,TT/8},{M2,TT/8},{M3,TT/2},{M2,TT /8},{M2,TT/4},{M1,TT/8},{M2,TT/4},{M2,TT/8},{M5,TT/8},{M5,TT/8},{M3,TT/8},

{M3,TT/8},{M2,TT/8},{M3,TT/2},{M1,TT/8},{M1,TT/4},{L6,TT/8},{L5,TT/4},{M5,TT/4},{M3,TT/8},{M2,T T/8},{M3,TT/8},{M2,TT/8},{M1,TT/2},{M2,TT/8},{M2,TT/4},//苍茫的天涯是我的爱。。。最呀最摇

{M1,TT/8},{M2,TT/8},{M2,TT/4},{M3,TT/8},{M2,TT/8},{M1,TT/8},{L6,TT/8},{M2,TT/8},{M1,TT/2},//剪一段时光。。。美丽的琴音就落在我身旁

{M1,TT/8},{M1,TT/4},{L6,TT/8},{L5,TT/4},{L6,TT/4},{M1,TT/8},{M1,TT/4},{M2,TT/8},{M3,TT/2},{M2,TT /8},{M2,TT/4},{M1,TT/8},{M2,TT/4},{M2,TT/8},{M5,TT/8},{M5,TT/8},{M3,TT/8},

{M3,TT/8},{M2,TT/8},{M3,TT/2},{M1,TT/8},{M1,TT/8},{M1,TT/8},{L6,TT/8},{L5,TT/4},{M5,TT/4},{M3,T T/8},{M2,TT/8},{M3,TT/8},{M2,TT/8},{M1,TT/2},{M2,TT/8},{M2,TT/4},//苍茫的天涯是我的爱。。。最呀最摇

{M1,TT/8},{M2,TT/8},{M2,TT/4},{M3,TT/8},{M2,TT/8},{M1,TT/8},{L6,TT/8},{M2,TT/8},{M1,TT/2},//萤火虫。。。谁采下那一朵昨夜的忧伤

{M3,TT/8},{M5,TT/4},{M5,TT/8},{M5,TT/4},{M5,TT/4},{M6,TT/8},{M5,TT/8},{M3,TT/8},{M2,TT/8},{M1, TT/2},{M6,TT/8},{H1,TT/8},{M6,TT/8},{M5,TT/8},{M3,TT/8},{M2,TT/8},{M1,TT/8},

{L6,TT/8},{M2,TT/4},{M2,TT/8},{M3,TT/8},{M3,TT/8},{M2,TT/4+TT/8},{M3,TT/8},{M5,TT/4},{M5,TT/8}, {M5,TT/4},{M5,TT/4},{M6,TT/8},{M5,TT/8},{M3,TT/8},{M2,TT/8},//苍茫的天涯是我的爱。。。最呀最摇{M1,TT/2},{L6,TT/8},{M1,TT/8},{L6,TT/8},{L5,TT/8},{M2,TT/4},{M3,TT/4},{M1,TT/2+TT/4}, //我像只鱼儿。。。等你宛在水中央

{M1,TT/4+TT/8},{M5,TT/8},{M1,TT/8},{M5,TT/8},{M1,TT/8},{M2,TT/8},{M3,TT},{M1,TT/4+TT/8},{M5,T T/8},{M1,TT/8},{M5,TT/8},{M1,TT/8},{M2,TT/8},{M2,TT},{M1,TT/4+TT/8},{M5,TT/8},{M1,TT/8},{M5,TT /8},

{M2,TT/8},{M1,TT/8},{L6,TT/2},{L6,TT/8},{L5,TT/8},{M1,TT/8},{M2,TT/8},{M1,TT/4+TT/8},{M5,TT/8},{ M1,TT/8},{M5,TT/8},{M1,TT/8},{L6,TT/8},{M1,TT},

{M1,TT/8},{M1,TT/4},{L6,TT/8},{L5,TT/4},{L6,TT/4},{M1,TT/8},{M1,TT/4},{M2,TT/8},{M3,TT/2},{M2,TT /8},{M2,TT/4},{M1,TT/8},{M2,TT/4},{M2,TT/8},{M5,TT/8},{M5,TT/8},{M3,TT/8},

{M3,TT/8},{M2,TT/8},{M3,TT/2},{M1,TT/8},{M1,TT/8},{M1,TT/8},{L6,TT/8},{L5,TT/4},{M5,TT/4},{M3,T

T/8},{M2,TT/8},{M3,TT/8},{M2,TT/8},{M1,TT/2},{M2,TT/8},{M2,TT/4},//苍茫的天涯是我的爱。。。最呀最摇

{M1,TT/8},{M2,TT/8},{M2,TT/4},{M3,TT/8},{M2,TT/8},{M1,TT/8},{L6,TT/8},{M2,TT/8},{M1,TT/2},//萤火虫。。。谁采下那一朵昨夜的忧伤

{M3,TT/8},{M5,TT/4},{M5,TT/8},{M5,TT/4},{M5,TT/4},{M6,TT/8},{M5,TT/8},{M3,TT/8},{M2,TT/8},{M1, TT/2},{M6,TT/8},{H1,TT/8},{M6,TT/8},{M5,TT/8},{M3,TT/8},{M2,TT/8},{M1,TT/8},

{L6,TT/8},{M2,TT/4},{M2,TT/8},{M3,TT/8},{M3,TT/8},{M2,TT/4+TT/8},{M3,TT/8},{M5,TT/4},{M5,TT/8}, {M5,TT/4},{M5,TT/4},{M6,TT/8},{M5,TT/8},{M3,TT/8},{M2,TT/8},//苍茫的天涯是我的爱。。。最呀最摇{M1,TT/2},{L6,TT/8},{M1,TT/8},{L6,TT/8},{L5,TT/8},{M2,TT/4},{M3,TT/4},{M1,TT/2+TT/4}, //我像只鱼儿。。。等你宛在水中央

{M1,TT/4+TT/8},{M5,TT/8},{M1,TT/8},{M5,TT/8},{M1,TT/8},{M2,TT/8},{M3,TT},{M1,TT/4+TT/8},{M5,T T/8},{M1,TT/8},{M5,TT/8},{M1,TT/8},{M2,TT/8},{M2,TT},{M1,TT/4+TT/8},{M5,TT/8},{M1,TT/8},{M5,TT /8},

{M2,TT/8},{M1,TT/8},{L6,TT/2},{L6,TT/8},{L5,TT/8},{M1,TT/8},{M2,TT/8},{M1,TT/4+TT/8},{M5,TT/8},{ M1,TT/8},{M5,TT/8},{M1,TT/8},{L6,TT/8},{M1,TT},

{0,0},

};

// 定义乐曲:《最炫民族风》

const tNote MyScore[]=

{

{L6,TT/4},{L3,TT/8},{L5,TT/8},{L6,TT/4},{L6,TT/8},{M1,TT/8},{M1,TT/4},{M2,TT/8},{M1,TT/8},{L6,TT/2 },{M1,TT/4},{M1,TT/8},{L5,TT/8},{M1,TT/8},{M2,TT/8},{M3,TT/8},{M5,TT/8},

{M5,TT/8},{M3,TT/8},{M2,TT/4},{M3,TT/2},{M6,TT/8},{M6,TT/8},{M6,TT/8},{M5,TT/8},{M3,TT/8},{M3, TT/4},{M1,TT/8},{L6,TT/8},{L6,TT/8},{L6,TT/8},{M3,TT/8},//苍茫的天涯是我的爱。。。最呀最摇

{M2,TT/2},{M3,TT/8},{M3,TT/8},{M5,TT/8},{M3,TT/8},{M2,TT/8},{M3,TT/8},{M2,TT/8},{M1,TT/8},{L6,T T/4},{L5,TT/4},{L6,TT/2}, //摆,什么样的歌声才是最开怀

{L6,TT/4},{L3,TT/8},{L5,TT/8},{L6,TT/4},{L6,TT/8},{M1,TT/8},{M1,TT/4},{M2,TT/8},{M1,TT/8},{L6,TT/2 },{M1,TT/4},{M1,TT/8},{L5,TT/8},{M1,TT/8},{M2,TT/8},{M3,TT/8},{M5,TT/8},

{M5,TT/8},{M3,TT/8},{M2,TT/4},{M3,TT/2},{M6,TT/8},{M6,TT/8},{M6,TT/8},{M5,TT/8},{M3,TT/8},{M3, TT/4},{M1,TT/8},{L6,TT/8},{L6,TT/8},{L6,TT/8},{M3,TT/8},//苍茫的天涯是我的爱。。。最呀最摇

{M2,TT/2},{M3,TT/8},{M3,TT/8},{M5,TT/8},{M3,TT/8},{M2,TT/8},{M3,TT/8},{M2,TT/8},{M1,TT/8},{L6,T T/4},{L5,TT/4},{L6,TT/2}, //摆,什么样的歌声才是最开怀

{M3,TT/8},{M3,TT/8},{M5,TT/8},{M3,TT/8},{M3,TT/8},{M5,TT/8},{M5,TT/8},{M6,TT/8},{H1,TT/8},{M6, TT/8},{M5,TT/4},{M6,TT/2},{L6,TT/4},{L6,TT/8},

{L5,TT/8},{L6,TT/4},{M1,TT/4},{M2,TT/8},{M3,TT/16},{M2,TT/16},{M1,TT/8},{M2,TT/8},{M3,TT/2},{L6, TT/8},{M6,TT/8},{M6,TT/8},{M5,TT/8},{M2,TT/8},{M3,TT/16},{M2,TT/16},

{M1,TT/8},{M2,TT/8},{M3,TT/2},//留下来

{M1,TT/8},{L6,TT/8},{L6,TT/8},{M1,TT/8},{M2,TT/4},{L5,TT/8},{L5,TT/8},{M3,TT/8},{M5,TT/8},{M3,TT/ 8},{M2,TT/8},{M1,TT/2},{L6,TT/8},{M1,TT/8},{M2,TT/8},{M3,TT/8},{M2,TT/8},{M1,TT/8},

{L5,TT/8},{L3,TT/8},{L6,TT/2},{L6,TT/4},{L6,TT/8},{L5,TT/8},{L6,TT/4},{M1,TT/4},{M2,TT/8},{M3,TT/1 6},{M2,TT/16},{M1,TT/8},{M2,TT/8},{M3,TT/2},{L6,TT/8},{M6,TT/8},

{M6,TT/8},{M5,TT/8},{M2,TT/8},{M3,TT/16},{M2,TT/16},

{M1,TT/8},{M2,TT/8},{M3,TT/2},//留下来

{M1,TT/8},{L6,TT/8},{L6,TT/8},{M1,TT/8},{M2,TT/4},{L5,TT/8},{L5,TT/8},{M3,TT/8},{M5,TT/8},{M3,TT/ 8},{M2,TT/8},{M1,TT/4+TT/8},{M1,TT/8},{L6,TT/8},

{M1,TT/8},{M2,TT/8},{M3,TT/8},{M5,TT/8},{M3,TT/8},{M3,TT/8},{M5,TT/8},{M6,TT/2},{M6,TT/2},{L6,T T/4},{L6,TT/8},{L5,TT/8},{L6,TT/4},

{L6,TT/8},{M1,TT/8},{M2,TT/8},{M3,TT/16},{M2,TT/16},{M1,TT/8},{M2,TT/8},{M3,TT/2},

{M6,TT/8},{M5,TT/8},{M3,TT/8},{M2,TT/8},{M5,TT/8},{M3,TT/8},{M2,TT/8},{M1,TT/8},{M1,TT/2},//登上天外云霄的舞台

{L6,TT/4},{L6,TT/8},{L5,TT/8},{L6,TT/4},{M1,TT/4},{M2,TT/8},{M3,TT/16},{M2,TT/16},{M1,TT/8},{M2, TT/8},{M3,TT/2},{L6,TT/8},{M6,TT/8},{M6,TT/8},{M5,TT/8},{M2,TT/8},{M3,TT/16},{M2,TT/16},

{M1,TT/8},{M2,TT/8},{M3,TT/2},//留下来

{M1,TT/8},{L6,TT/8},{L6,TT/8},{M1,TT/8},{M2,TT/4},{L5,TT/8},{L5,TT/8},{M3,TT/8},{M5,TT/8},{M3,TT/ 8},{M2,TT/8},{M1,TT/2},{L6,TT/8},{M1,TT/8},{M2,TT/8},{M3,TT/8},{M2,TT/8},{M1,TT/8},

{L5,TT/8},{L3,TT/8},{L6,TT/2},{L6,TT/4},{L6,TT/8},{L5,TT/8},{L6,TT/4},{M1,TT/4},{M2,TT/8},{M3,TT/1 6},{M2,TT/16},{M1,TT/8},{M2,TT/8},{M3,TT/2},{L6,TT/8},{M6,TT/8},

{M6,TT/8},{M5,TT/8},{M2,TT/8},{M3,TT/16},{M2,TT/16},

{M1,TT/8},{M2,TT/8},{M3,TT/2},//留下来

{M1,TT/8},{L6,TT/8},{L6,TT/8},{M1,TT/8},{M2,TT/4},{L5,TT/8},{L5,TT/8},{M3,TT/8},{M5,TT/8},{M3,TT/ 8},{M2,TT/8},{M1,TT/4+TT/8},{M1,TT/8},{L6,TT/8},

{M1,TT/8},{M2,TT/8},{M3,TT/8},{M5,TT/8},{M3,TT/8},{M3,TT/8},{M5,TT/8},{M6,TT/2},{M6,TT/2}, {0,0},

};

音乐演奏程序设计

音乐演奏 1 总体要求与分析 1.1设计要求 本文主要编写一段音乐程序,该程序可以进行如下操作:按大写字母“A”,奏一首歌曲;按大写字母“B”;奏另一首歌曲,曲目自选,可重复操作。按Q 退出程序。 1.2设计思路分析 在IBM-PC/XT机中都带有8253-5定时/计数器,IBM-PC/AT中带有8254定时/计数器,这两种芯片功能十分类似。本文通过对8253-5定时/计数器芯片的操作实现音乐演奏。该声音接口通过汇编语言对8253-5的端口直接进行操作,可以不必要过多的使用BIOS的调用和DOS的调用。 计数器芯片有3个通道,各自具有专用功能。通道0时系统的始终节拍计时器,通道1专用于产生动态RAM的定时刷新信号,通道2用来控制计算机的扬声器的声音频率。该音乐演奏主要用到通道2的功能,使通道2工作在“方波发生器”方式,产生相应频率的音调送至喇叭驱动电路,使喇叭发出不同音调的声音。使用8255A的PB0控制通道2的计数,PB1控制通道2的输出对扬声器产生控制的时间。 人机交互包括屏幕显示提示语以及人工输入相应参数,主要应用到BIOS的10H号中断调用以及DOS的21H号中断调用。BIOS的10H号中断调用用于显示器驱动,设置显示模式和光标位置;DOS的21H号中断调用用于单字符输入以及多字符输出显示。 音乐演奏实现的一个主要步骤是乐谱编程。通过相应的频率表将乐谱中对应的音符转化为计数器的计数初值,节奏通过延时程序转化为对喇叭发音时间的控制,从而实现音符和节拍的数字化。

2 方案设计 音乐的实现主要是对乐谱中的单音符按照一定的音符频率表转化为计数器的计数频率以及喇叭发声的控制时间,通过计数产生相应的控制动作。由此可以有两种方案比较和选择。 2.1 方案一 通过编程使用软件来实现计数和喇叭发声的时间设置,控制8255A并行I/O 接口驱动喇叭发声。CPU每执行一条指令需要耗费一定的时间,这样可以通过循环的方式设置好循环次数,实现软件计数,然后输出相应的高低电平,驱动喇叭发出对应频率和节拍的声音。 利用软件编程方式实现该功能的优点是可以减少硬件开支,便于调试和问题的查找。缺点是CPU开支太大,利用率不高,而且时间不够精准。 2.2 方案二 利用硬件实现频率计数和延时时间的控制,利用8253-5定时/计数器芯片和8255A并行I/O接口芯片。使8253的一个通道工作在“方波发生器”模式,实现对频率的计数;利用8255A的PB3端口实现发声时间的计数控制。这样可以精确的控制时间,减少CPU的开支。 该方案的优点是控制精度提高,同时也减少CPU的开支。缺点是硬件开销比较多。 2.3 方案选择 本文要实现的功能所需要的硬件电路并不是太复杂,一般的IBM-PC/XT/AT 机家族都带有相应的硬件电路。在提高精度与简易程度的比较下,决定采用方案二,这样可以大大提高时间控制精度,同时减少软件程序的复杂度。

音乐演奏程序设计

课程设计任务书 学生姓名:王琨专业班级:自动化1105班 指导教师:向馗工作单位:自动化学院 题目: 音乐演奏程序设计 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) 1.使用汇编语言设计一个在计算机上运行的音乐演奏程序。 2.屏幕显示钢琴图像。 3.实现以下附加功能:按“D”键,加快播放速度,按“E”键,降低播放速度。 4. 按"X"鍵,退出。 5.撰写课程设计说明书。内容包括:摘要、目录、正文、参考文献、附录(程序清单)。正文部分包括:设计任务及要求、方案比较及论证、软件设计说明(软件思想,流程,源程序设计及说明等)、程序调试说明和结果分析、课程设计收获及心得体会。 时间安排: 12月30日-----12月31日查阅资料及方案设计 1月2日-----1月3日编程 1月6日调试程序 1月7日-----1月8日撰写课程设计报告 指导教师签名:年月日 系主任(或责任教师)签名:年月日

摘要 汇编语言(Assembly Language)是面向机器的程序设计语言。在汇编语言中,用助记符(Memoni)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址,如此就增强了程序的可读性并且降低了编写难度,象这样符号化的程序设计语言就是汇编语言,因此亦称为符号语言。使用汇编语言编写的程序,机器不能直接识别,还要由汇编程序或者叫汇编语言编译器转换成机器指令。因为用汇编语言设计的程序最终被转换成机器指令,故能够保持机器语言的一致性,直接、简捷,并能像机器指令一样访问、控制计算机的各种硬件设备,如磁盘、存储器、CPU、I/O端口等。使用汇编语言,可以访问所有能够被访问的软、硬件资源。 使用的编译软件是masm for windows ,MASM是微软公司开发的汇编开发环境,拥有可视化的开发界面,使开发人员不必再使用DOS环境进行汇编的开发,编译速度快,支持80x86汇编以及Win32asm,是Windows下开发汇编的利器。它与Windows平台的磨合程度非常好,但是在其他平台上就有所限制,使用MASM 的开发人员必须在Windows下进行开发。 关键词:汇编语言、MASM、DOS环境

音乐演奏程序设计

信息与电气工程学院 电子信息工程CDIO一级项目(2013/2014学年第一学期) 题目:音乐演奏程序设计 专业班级:xxxxxxxxxxxxxxxxx 学生姓名:xxxxxxx 学号:xxxxxxxxx 指导教师:xxxxxxx 设计周数: 设计成绩: 2013年12月28日

1、项目设计目的 1.1掌握接口电路的应用和设计技术。 1.2掌握汇编语言的设计思路。 1.3掌握8086的控制流程,以及8255和8253芯片的功能。 1.4用汇编程序完成键控音乐播放器,用8253定时器来产生声音。 1.5使学生能够较全面地巩固和应用课堂中所学的基本理论和程序设计方法,能够较熟练地完成汇编语言程序的设计和调试。 2、项目设计正文 2.1设计内容 要求完成一个音乐程序,即通过按下键盘上某个按键就可以按预先设定的程序播放音乐或者终止程序。比如:按大写字母“1”,唱乐曲“沂蒙山小调”;按大写字母“2”,唱乐曲“生日快乐”按大写字母“3”,唱乐曲“棉花糖”;按"4"键,退出。并且可以重复操作。 2.2总体设计思路 在IBM-PC/XT机中都带有8253-5定时/计数器,IBM-PC/AT中带有8254定时/计数器,这两种芯片功能十分类似。本文通过对8253-5定时/计数器芯片的操作实现音乐演奏。该声音接口通过汇编语言对8253-5的端口直接进行操作,可以不必要过多的使用BIOS的调用和DOS的调用。 计数器芯片有3个通道,各自具有专用功能。通道0时系统的始终节拍计时器,通道1专用于产生动态RAM的定时刷新信号,通道2用来控制计算机的扬声器的声音频率。该音乐演奏主要用到通道2的功能,使通道2工作在“方波发生器”方式,产生相应频率的音调送至喇叭驱动电路,使喇叭发出不同音调的声 音。使用8255A的PB 0控制通道2的计数,PB 1 控制通道2的输出对扬声器产生控制的时间。 人机交互包括屏幕显示提示语以及人工输入相应参数,主要应用到BIOS的10H号中断调用以及DOS 的21H号中断调用。BIOS的10H号中断调用用于显示器驱动,设置显示模式和光标位置;DOS的21H号中断调用用于单字符输入以及多字符输出显示。 音乐演奏实现的一个主要步骤是乐谱编程。通过相应的频率表将乐谱中对应的音符转化为计数器的计数初值,节奏通过延时程序转化为对喇叭发音时间的控制,从而实现音符和节拍的数字化。 2.3流程图 2.3.1主程序流程图

音乐演奏器设计

山东工商学院 电子设计大赛 作品设计报告 题目:音乐演奏器设计 队名: XXXXXX 成员: XXXXXXXXXXXXXXXXXXXX 提交时间: 2016.7.1

目录 一、引言....................................................................................................................................... 3 二、方案比较以及选择................................................................................................................. 3 2.1 控制模块选择方案......................................................................................................... 3 2.2 按键选择方案.................................................................................................................. 4 三、硬件设计及说明..................................................................................................................... 4 3.1系统组成及总体框图...................................................................................................... 4 3.2元件简介........................................................................................................................... 5 3.3 各功能模块原理图.......................................................................................................... 6 四、软件设计................................................................................................................................. 8 4.1 音乐相关知识.................................................................................................................. 8 4.2用单片机实现音乐的节拍............................................................................................... 9 4.3用单片机产生音频脉冲................................................................................................... 9 五、系统调试................................................................................................................................. 9 5.1硬件调试........................................................................................................................... 9 5.2 软件调试...................................................................................................................... 10 六、总结..................................................................................................................................... 10 七、参考文献............................................................................................................................. 10附录1:元器件清单...................................................................................... 错误!未定义书签。附录2:电路原理图.................................................................................................................. 11

音乐演奏程序设计

微机原理及接口技术 课程设计 题目音乐演奏小程序 学院自动化学院 专业电气工程及其自动化班级 姓名 指导教师 2014 年12 月28 日

课程设计任务书 学生姓名:专业班级:电气 指导教师:工作单位:自动化学院 题目: 音乐演奏小程序 初始条件: 音乐程序,按大写字母“A”,奏一首歌曲;按大写字母“B”;奏另一首歌曲,曲目自选。按Q退出程序。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) (1)设计任务及要求分析 (2)方案比较及认证说明 (3)系统原理阐述 (4)硬件设计课题需要说明:硬件原理,电路图,采用器件的功能说明 (5)软件设计课题需要说明:软件思想,流程图,源程序及程序注释 (6)调试记录及结果分析 (7)总结 (8)参考资料 (9)附录:芯片资料或程序清单,软件演示屏幕拷贝图或硬件实物图

目录 音乐演奏小程序 (1) 1 总体要求与设计原理 (1) 1.1设计要求 (1) 1.2设计原理 (1) 2 方案设计 (1) 2.1 方案一 (2) 2.2方案二 (2) 2.3 方案三 (2) 2.4 方案选择 (2) 3 硬件电路 (2) 4 软件设计 (3) 4.1 音乐选择模块 (3) 4.2 频率产生模块 (3) 4.3 控制音符的演奏时间 (4) 4.4 音乐乐谱编程 (5) 4.5屏幕显示设计 (7) 4.6 程序流程图 (9) 5 程序调试及运行结果 (10) 6 小结与体会 (12) 参考文献 (13) 附录1 程序源代码 (14) 附录2 芯片资料 (18)

音乐演奏小程序 1 总体要求与设计原理 1.1设计要求 本文主要编写一段音乐程序,该程序可以进行如下操作:按大写字母“A”,奏一首歌曲;按大写字母“B”;奏另一首歌曲,曲目自选,可重复操作。按Q退出程序。 1.2设计原理 在本次课程设计中大家利用课上所学的各种知识,对自己的课程设计题目进行设计。我所要设计的题目是音乐程序设计。看到大多数同学选择了8253定时器,为了与同学区分开来,我在设计的过程选择利用计数器/定时器8254芯片和可编程并行接口8255A芯片,完成2个开关选择歌曲,能用扬声器播放歌曲。 首先我们利用定时器产生各种频率的声音,如“DO”“RE”“ME” 然后将各个单音连接起来就组成了一首简单的曲子或者旋律,旋律及拍数可以按音乐简谱而定。 对8255芯片PA0和PA6口的置0和1来选择歌曲。其次实现唱歌功能即实现歌曲的节拍通过调用延时子程序控制音符发音的长短,实现连续发声把[SI]是否为0作为循环的条件在每一次扬声器发出一个相应音符之后做无条件转移,从而使扬声器连续发声。 2 方案设计 音乐的实现主要是对乐谱中的单音符按照一定的音符频率表转化为计数器 的计数频率以及喇叭发声的控制时间,通过计数产生相应的控制动作。由此可以有三种方案比较和选择。

五年级下册信息技术教案- 18《弹奏音乐》 苏教版新版

弹奏音乐 【教材分析】 本课属于Scratch编程模块的范畴,教材介绍了超声波传感器的工作原理,以及与主控板的连接方法;根据发出超声波与接收到超声波的距离差,计算出超声波传感器与物体之间的距离,根据测量出不同的距离发出不同的声音。 【学情分析】 在此之前学生对Scratch编程有一定的编程基础,认识了声音、光敏、滑杆、摇杆等传感器,已初步了解传感器的作用及用法。在编程方面学生也均已尝试编写过顺序、选择、循环三种不同结构的写法,对编写条件判断语句程序有相应的基础。 【教学目标与要求】 1. 认识超声波传感器。 2. 了解超声波传感器的工作原理。 3. 利用超声波来测量距离,并根据不同的距离发出不同的声音。 4. 培养学生实事求是的科学态度和严谨的思维推导能力。 5. 通过对超声波传感器的应用设想,拓展思维,培养创新能力。 【教学重点与难点】 重点:正确连接超声波传感器,并正确运用其测距功能。 难点:根据超声波传感器测量的不同距离,让机器人执行不同的动作。 【教学方法与手段】 任务驱动法,实践操作。 【课时安排】 安排1课时。 【教学准备】 超声波传感器,Arduino板,数据线,课件。 【教学过程】 一、导入 播放歌曲《Do Re Mi》,让同学们一起来唱一唱这首耳熟能详的童谣,在轻松、欢快的环境中进入新课。 老师给同学们带来了一种新的传感器,也可以实现机器人弹奏歌曲,请大家猜一猜

这是什么传感器? 教师总结:是利用超声波传感器来实现音调的变化,今天就一起来学习《弹奏音乐》并板书。 二、新授 1. 认识超声波传感器。 请学生通过看书、上网查阅等方法,了解超声波传感器的相关知识与定义,并向同学解释超声波的定义、功能并举例说明它在生活中的应用。教师总结:超声波是一种频率高于20000赫兹的声波,可用于测距、测速、清洗、焊接、碎石、杀菌消毒等。根据发出超声波与接收到的超声波的时间差,可以计算出超声波传感器与物体之间的距离。今天我们就利用超声波的测距功能来编译一个可以弹相同音符的程序。 2.布置任务一:使超声波正确连接到Arduino板。请参看书自学,并以小组为单位进行学生自主操作,将超声波传感器正确地连接到主控板上。小组合作,教师巡视,给予帮助和指导。 3.布置任务二:设置舞台背景,打开“背景库”对话框,选择“室内”,选择“spolight-stage”背景图。 4.布置任务三:设置小猫演奏音符。 (1)分析: 教师给出4个音符,分别是:Do Re Mi Fa 教师给出一个X 并平均分成4 段。 总结出每一个数值范围内对应了一个音符: X<5 Do X﹥5<10 Re X﹥10<15 Mi X﹥20<25 Fa (2)教师给学生讲解“且”运算的含义,并修改板书为:X﹥0且X<5 Do X﹥5且X<10 Re

单片机 利用蜂鸣器演奏音乐

实验三-利用蜂鸣器演奏音乐 一、实验目的 1.了解BlueSkyC51单片机实验板中蜂鸣器的硬件电路 2.学会利用蜂鸣器实现音乐的演奏 3.掌握蜂鸣器实现音乐演奏的编程 二、实验硬件设计及电路 1. BlueSkyC51单片机实验板 ` 2.单片机最小系统

。 3.蜂鸣器电路连接 三极管主要是做驱动用的。因为单片机的IO口驱动能力不够让蜂鸣器发出声音,所以

我们通过三极管放大驱动电流,从而可以让蜂鸣器发出声音,你要是输出高电平,三极管导通,集电极电流通过蜂鸣器让蜂鸣器发出声音,当输出低电平时,三极管截止,没有电流流过蜂鸣器,所以就不会发出声音。 三、实验原理 1.音调及节拍 用一个口,输出方波,这个方波输入进蜂鸣器就会产生声音,通过控制方波的频率、时间,就能产生简单的音乐。一般说来,单片机演奏音乐基本都是单音频率,因此单片机奏乐只需控制音调和节拍。 (1)音调的确定 音调是由频率来确定的。通过单片机的定时器定时中断,将单片机上对应蜂鸣器的I/O 口来回取反,从而让蜂鸣器发出不同频率的声音。只需将定时器给以不同的定时值就可实现。通过延时,即可发出所需要的频率。 … (2)节拍的确定 一拍的时长大约为400—500ms,每个音符的时长通过节拍来计算。详细见程序代码。 2.软件设计相关 (1)头文件 #include<> #define uint unsigned int #define uchar unsigned char #define ulong unsigned long sbit beep=P1^4; 译实验相关问题 ; (1)实际发音颤音重 解决方法为修改蜂鸣器的驱动频率. (2)实际节奏过快或者过慢 调整延时 四、C51程序代码(部分来源于网络) #include<> #define uint unsigned int #define uchar unsigned char #define ulong unsigned long ~ sbit beep=P1^4; //蜂鸣器与口连接 uchar th0_f; //中断装载T0高8位 uchar tl0_f; //T0低8位 uchar code freq[36*2]={ //音阶码表 0xf7,0xd8, //440hz , 1 //0 0xf8,0x50, //466hz , 1# //1

汇编课程设计乐曲演奏程序武汉理工大学

学号:0121010340112 课程设计 课程名称汇编语言程序设计 题目乐曲演奏程序 学院计算机科学与技术学院 专业计算机科学与技术 班级1001班 姓名XXX 指导教师XXX 2012 年06 月27 日

课程设计任务书 学生姓名: XXX 专业班级:计科1001班 指导教师: XXX 工作单位:计算机科学与技术学院 题目: 乐曲演奏程序 初始条件: 理论:完成了《汇编语言程序设计》课程,对微机系统结构和80系列指令系统有了较深入的理解,已掌握了汇编语言程序设计的基本方法和技巧。 实践:完成了《汇编语言程序设计》的4个实验,熟悉了汇编语言程序的设计环境并掌握了汇编语言程序的调试方法。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)理解键盘接口的工作原理,掌握BIOS键盘I/O功能,掌握复杂内存数据结构的定义和管理方法。 具体的设计任务及要求: 1)采用位触发方式编写程序,使计算机发出音响并演奏乐曲; 2)要求在屏幕上用键盘选择歌曲; 3)程序采用子程序结构,结构清晰; 4)友好清晰的用户界面,能识别输入错误并控制错误的修改。 在完成设计任务后,按要求撰写课程设计说明书;对课程设计说明书的具体要求请见课程设计指导书。 阅读资料: 1)《IBM—PC汇编语言程序设计实验教程》实验2.4 2)《IBM—PC汇编语言程序设计(第2版)》例6.11 时间安排: 设计安排一周:周1、周2:完成系统分析及设计。 周3、周4:完成程序调试,和验收。 周5:撰写课程设计报告。 指导教师签名:年月日 系主任(或责任教师)签名:年月日

乐曲程序的设计与实现 1.实验原理 1.1 音调与频率和时间的关系 利用计算机控制发声的原理,可以编写演奏乐曲的程序。乐曲是按照一定的高低、长短和强弱关系组成的音调。在一首乐曲中,每个音符的音高和音长与频率和节拍有关。组成乐曲的每个音符的频率值和持续时间是乐曲程序发声需要的两个数据。但实际上卷入计数器的输入频率与音符频率相除的值,通用发声程序的前半部分就是完成这个计算,并将计数值送入计数器2的功能。音符的持续时间是根据乐曲的速度及音箱的节拍数来确定的。 1.2 乐曲的频率和节拍 乐曲是按照一定的高低、长短、强弱组成的音调。在一首乐曲中,每个音符的音高和音长和频率和节拍有关。每个音符的频率值和持续时间是乐曲程序发声需要的两个必要数据。高音阶从中C(263)到高C(523), 各个音阶对应的频率如下所示: DW 263 --------- C DW 294 --------- D DW 330 --------- E DW 349 --------- F DW 392 --------- G DW 440 --------- A DW 494 --------- B DW 523 --------- C 如果知道了乐曲的曲谱,就可以将每个音符的频率和持续时间定义为两个数据表,然后通过调用子程序将表中数据取出,通过扬声器发声。例如MERRY CHRISTMAS频率表和节

汇编课程音乐演奏程序设计--这个才是正确的!

08 学号: 题目音乐演奏程序设计 教学院计算机学院 专业计算机科学与技术 班级05级本科(2)班 姓名李锐 指导教师马学军晏伯武姚莉杨斐 2008年01月16日

目录 一概述 ........................... 错误!未定义书签。二总体方案设计 ................... 错误!未定义书签。三详细设计 ....................... 错误!未定义书签。四程序的调试与运行结果说明 ....... 错误!未定义书签。五课程设计总结 ................... 错误!未定义书签。参考文献 .......................... 错误!未定义书签。

一概述 汇编语言是计算机能够提供给用户使用的最快而有效的语言,也是能够利用计算机所有特性并能直接控制硬件的唯一语言。借助于汇编程序,计算机本身可以自动地把汇编源程序翻译成用机器语言表示的目的程序,从而实现了程序设计工作的部分自动化。 1课程设计的目的 掌握一些程序设计的基本方法,要指导主程序,子程序以及推栈段的使用,.了解通用发声程序.了解与掌握定时.计数.音乐.频率.时间之间的关系,学会用发声程序的设计方法,学会用汇编语言编辑音乐程序. 2课程设计的要求 1、需要的基本知识与技能。 具备汇编语言设计、编写、调试和运行程序的方法和技巧。在PC机上运行汇编程序需要经过以下几个阶段: 编辑源程序。利用文本编辑工具编辑源程序,生成一个汇编语言的纯文本文件。文件的扩展名为.ASM 汇编源程序。用汇编器汇编源程序生成目标代码文件,目标代码文件的扩展名是.OBJ,汇编器还可以生成列表文件和交叉参考文件。汇编器相当于高级语言中的编译器。汇编语言按照汇编语言的语法检查源程序,如果源程序语法有错误,汇编器就不生成目标代码文件,这时,必须重新编辑源程序,修改语法错误。当发现源程序有的行含有不确定因素,汇编器会给出警告信,但按却省处理方法生成目标代码文件。此时,可以重新编辑源程序,消去不确定因素。 连接目标程序。利用连接器连接目标代码程序和库函数代码生成可执行程序文件。一般单个模块的连接可以顺利地生成可执行程序文件。当多个模块连接,或者库函数连接时,如果在目标代码中找不到所需的连接信息,连接器就会发生错误提示信息,而不是生成可执行文件。这时,这就要重新编辑源程序,并汇编程序。 调试可执行程序。程序的动态调试是在形成可执行文件后,针对可执行程序进行的。DEBUG是简单的动态调试工具,利用调试工具动态的调试程序,找出程序中的问题,那么就要重新编辑,汇编源程序。 2、尚未掌握的知识点。

汇编_音乐乐曲演奏程序

2.2通用发声程序设计原理 PC机发声系统以8254的2号计数器为核心。系统初始化时,2号计数器I作在“方波发生器”方式,初值为二进制数,,写入顺序为先低后高,CLK2为1.193182MHz,当计数初值为533H时,OUT2输出的方波大约为900Hz,经过简单的滤波之后,送至扬声器。改变1.4号计数器的计数初值就可以使扬声器发出不同频率的音响。 ROM BIOS 中有个BEEP子程序,这能根据BL中组出的时间计数值控制8254定时器,产生持续时间为1个或几个0.5秒,频率为896HZ的声音,我们可以利用并修改BEEP,使其产生任一频率的声音。为此我们需要做两点修改,首先,BEEP程序只能产生896HZ的声音,我们的通用发声程序应能产生任一频率的声音。其次,BEEP 产生声音的持续时间(音长)只能是0.5秒的倍数,我们希望声音的持续时间更易于调整,例如可以是10ms的倍数。 我们知道BEEP能将计数值533H送给定时器2产生896HZ的声音的,那么产生其它频率声音的时间计数值应为: 533H×896÷给定频率=123280H÷给定频率 发声程序包括3个步骤: (1)在8253中的42端口送一个控制字0B6H(10110110B),该控制字对定时器2进行初始化,使定时器2准备接收计数初值。 (2)在8253中的42H端口(Timer2)装入一个16位的计数值(533H×895/频率),以建立将要产生的声音频率。 (3)把输出端口61H的PB0、PB1两位置1,发出声音。 对于发音部分。PC机上的大多数输入/输出(I/O)都是由主板上的8255(或8255A)可编程序外围接口芯片(PPI)管理的。PPI包括3个8位寄存器,两个用于输入功能,一个用于输出功能。输入寄存器分配的I/O端口号为60H和62H,输出寄存器分配的I/O端口号为61H。由PPI输出寄存器中的0、1两位来选择扬声器的驱动方式。 连接到扬声器上的是定时器2,从上图可以看到,GATE2与端口61H的PB0相连,当PB0=1时,GATE2获得高电平,使定时器2可以在模式3(方波)下工作。

STM32F103通用定时器PWM应用例程--蜂鸣器演奏乐曲

STM32F103通用定时器PWM应用例程:蜂鸣器演奏乐曲 一.说明:本例程是将流明LM3SLib_Timer.pdf文档中的例程9及例程10(PWM应用:蜂鸣器演奏乐曲),移植到STM32F103上。 二.流明LM3SLib_Timer.pdf例程9及例程10的拷贝: 例程9.Timer PWM应用:蜂鸣器发声 如图1.1所示,为EasyARM1138开发板上的蜂鸣器驱动电路。蜂鸣器类型是交流蜂鸣器,也称无源蜂鸣器,需要输入一列方波才能鸣响,发声频率等于驱动方波的频率。 图1.1 蜂鸣器驱动电路 程序清单1.9是Timer模块16位PWM模式的一个应用,可以驱动交流蜂鸣器发声,运行后蜂鸣器以不同的频率叫两声。其中"buzzer.h"和"buzzer.c"是蜂鸣器的驱动程序,仅有3个驱动函数,用起来很简捷。 程序清单1.9 Timer PWM应用:蜂鸣器发声 文件:main.c #include "systemInit.h" #include "buzzer.h" // 主函数(程序入口) int main(void) { jtagWait(); // 防止JTAG失效,重要! clockInit(); // 时钟初始化:晶振,6MHz buzzerInit(); // 蜂鸣器初始化 buzzerSound(1500); // 蜂鸣器发出1500Hz声音 SysCtlDelay(400* (TheSysClock / 3000)); // 延时约400ms buzzerSound(2000); // 蜂鸣器发出2000Hz声音 SysCtlDelay(800* (TheSysClock / 3000)); // 延时约800ms buzzerQuiet( ); // 蜂鸣器静音 for (;;) { } } 文件:buzzer.h #ifndef __BUZZER_H__ #define __BUZZER_H__ // 蜂鸣器初始化 extern void buzzerInit(void); // 蜂鸣器发出指定频率的声音 extern void buzzerSound(unsigned short usFreq); // 蜂鸣器停止发声 extern void buzzerQuiet(void);

单片机演奏简单的音乐

为了让单片机演奏音乐,看了不少的资料,现在整理了相关的资料,让你一次看懂音调、节拍的确定方法,看懂简谱,懂得编写用来演奏音乐的程序。 单片机不能像其他的专业的乐器一样能奏出多种音色的声音,即不包含相应幅度的谐波频率。单片机演奏的音乐基本都是点单音频率。因此单片机演奏音乐比较简单,只需弄清楚“音调”和“节拍”两个概念即可。 音调表示一个音符唱的多高的频率。 节拍表示一个音符唱多长的时间。 那么音调、节拍该怎样确定呢? 首先来看音调的确定: 不同音高的乐音是用C、D、E、F、G、A、B来表示,这7个字母就是音乐的音名,它们一般依次唱成DO、RE、MI、FA、SO、LA、SI,即唱成简谱的1、2、3、4、5、6、7,相当于汉字“多来米发梭拉西”的读音,这是唱曲时乐音的发音,所以叫“音调”,即Tone。在音乐中常把五线谱中央C 上方的A 音定为标准音高,其频率f=440Hz。当两个声音信号的频率相差一倍时,也即f2=2*f1时,则称f2比f1 高一个倍频程, 例如高音DO的频率(1046Hz)刚好是中音DO的频率(523Hz)的一倍,中音DO的频率(523Hz)刚好是低音DO频率(266 Hz)的一倍;同样的,高音RE的频率(1175Hz)刚好是中音RE的频率(587Hz)的一倍,中音RE的频率(587Hz)刚好是低音RE频率(294 Hz)的一倍。在音乐学中称它相差一个八度音。在一个八度音内,有12个半音。以1—i 八音区为例,12 个半音是:1—#1、#1—2、2—#2、#2—3、3—4、4—#4,#4—5、5 一#5、#5—6、6—#6、#6—7、7—i。那些在它们的左上角加上﹟号或者b号的叫变化音。﹟叫升记号,表示把音在原来的基础上升高半音,b叫降记音,表示在原来的基础上降低半音。这12 个音阶的分度基本上是以对数关系来划分的。如果我们只要知道了这十二个音符的音高,也就是其基本音调的频率,我们就可根据倍频程的关系得到其他音符基本音调的频率。基本频率看下表: 低音频率中音频率高音频率 Do 262 Do 523 Do 1046 Do﹟277 Do﹟554 Do﹟1109 Re 294 Re 587 Re 1175 Re﹟311 Re﹟622 Re﹟1245 Mi 330 Mi 659 Mi 1318 Fa 349 Fa 698 Fa 1397 Fa﹟370 Fa﹟740 Fa﹟1480 So 392 So 784 So 1568 So﹟415 So﹟831 So﹟1661 La 440 La 880 La 1760 La﹟464 La﹟932 La﹟1865 Si 494 Si 988 Si 1976 知道了一个音符的频率后,采用的方法就是通过一个延时程序,延时对应频率周期的二分之一周期(即t=1/2T)后,将单片机上连接蜂鸣器的I/O口来回取反,或者说来回清零,置位,从而让蜂鸣器发出声音,为了让单片机发出不同频率的声音,我们只需将不同的延时时间值t赋给延时程序即可实现。一般说来,常采用的方法就是通过单片机的定时器定时中断,将单片机上对应蜂鸣器的I/O口来回取反,或者说来回清零,置位,从而让蜂鸣器发出声音,为了让单片机发出不同频率的声音,我们只需将定时器予置不同的定时值就可实现。

通过单片机演奏的音乐程序(八月桂花)

/************************************************************************ [文件名] C51音乐程序(八月桂花) [功能] 通过单片机演奏音乐 /**********************************************************************/ #include #include //本例采用89C52, 晶振为11.0592MHZ //关于如何编制音乐代码, 其实十分简单,各位可以看以下代码. //频率常数即音乐术语中的音调,而节拍常数即音乐术语中的多少拍; //所以拿出谱子, 试探编吧! sbit Beep = P1^5 ; unsigned char n=0; //n为节拍常数变量 unsigned char code music_tab[] ={ 0x18, 0x30, 0x1C , 0x10, //格式为: 频率常数, 节拍常数, 频率常数, 节拍常数, 0x20, 0x40, 0x1C , 0x10, 0x18, 0x10, 0x20 , 0x10, 0x1C, 0x10, 0x18 , 0x40, 0x1C, 0x20, 0x20 , 0x20, 0x1C, 0x20, 0x18 , 0x20, 0x20, 0x80, 0xFF , 0x20, 0x30, 0x1C, 0x10 , 0x18, 0x20, 0x15, 0x20 , 0x1C, 0x20, 0x20, 0x20 , 0x26, 0x40, 0x20, 0x20 , 0x2B, 0x20, 0x26, 0x20 , 0x20, 0x20, 0x30, 0x80 , 0xFF, 0x20, 0x20, 0x1C , 0x10, 0x18, 0x10, 0x20 , 0x20, 0x26, 0x20, 0x2B , 0x20, 0x30, 0x20, 0x2B , 0x40, 0x20, 0x20, 0x1C , 0x10, 0x18, 0x10, 0x20 , 0x20, 0x26, 0x20, 0x2B , 0x20, 0x30, 0x20, 0x2B , 0x40, 0x20, 0x30, 0x1C , 0x10, 0x18, 0x20, 0x15 , 0x20, 0x1C, 0x20, 0x20 , 0x20, 0x26, 0x40, 0x20 , 0x20, 0x2B, 0x20, 0x26 , 0x20, 0x20, 0x20, 0x30 , 0x80, 0x20, 0x30, 0x1C , 0x10,

流行音乐乐曲演奏程序

流行音乐乐曲演奏程序 一、需求说明 1、通过一个较大型实用程序的设计与实现,综合运用所学知识,加深理解和掌握。 同时培养学生分析问题和解决问题的能力,以及自学能力。 2、编写用键盘选择计算机演奏歌曲的程序,歌曲清单至少包括3首; 3、程序应该有操作提示、输入和输出,界面追求友好,最好是菜单式的界面; 4、设计若干用例(测试数据),上机测试程序并分析所设计的程序; 二、设计说明 1、简要分析 为了编写一个流行音乐乐曲演奏程序,分析时按照课程设计的要求必须要有操作提示、输入和输出。在界面设计时应该追求友好,能够使用户便于使用该程序。而且按照课题要求最好能够实现菜单式的界面,进一步提高该程序界面的友好性。同时,在设计分析时也必须解决发声问题。分析设计时按照课本P383(10.4 通用发声程序)所示的设计方法解决发声问题。 2、概要分析 2.1 用户界面 以下是显示音乐菜单的字符串 msgmenu db'************************************** ',0dh,0ah db'* The pop music menu is that: * ',0dh,0ah db'* * ',0dh,0ah db'* 1:dahai * ',0dh,0ah ;张宇生《大海》 db'* 2:dongfengpo * ',0dh,0ah ;周杰伦《东风破》 db'* 3:dashetou * ',0dh,0ah ;吴克群《大舌头》 db'************************************** ',0dh,0ah,'$' 2.2 模块定义、原理 2.2.2 提示选择乐曲 msgchoose db 0dh,0ah,'Input the number(1~3) to choose the music you want,input:','$'

音乐演奏汇编语言程序设计

目录 音乐演奏汇编语言程序设计 (1) 前言 (1) 1 总体方案论证 (1) 1.1功能分析 (1) 1.2方案设计说明 (2) 1.2.1音乐的代码化 (2) 1.2.2音乐演奏的硬件配合 (2) 1.2.3音乐演奏的软件设计 (2) 2.程序流程图设计及其说明 (3) 2.1主流程图说明 (3) 2.2音乐播放流程图说明 (3) 2.3字符输入及执行操作流程图说明 (3) 3.软件设计关键问题或程序段落的说明 (6) 3.1字符串显示程序 (6) 3.2数据段与外观设计程序 (6) 3.3音乐演奏 (8) 4.程序调试说明、结果记录及分析 (8) 5.课程设计收获及心得体会 (10) 参考文献 (11) 附录 (12) 源程序代码 (12)

音乐演奏汇编语言程序设计 前言 随着科技的高速发展,计算机已经经过了好几代的更新,然而计算机的运行的基本原理依然没有改变的。而今,我们通过一个学期的学习,已经初步了解了计算机的基本结构和原理,并且已经学会了用汇编语言进行基本的程序编写。 而本次课程设计的主要目的就是巩固所学过的知识,用汇编语言熟练地运用三大结构,进一步掌握一些指令的功能、掌握子程序的定义及调用和INT 21H、INT10H中断的使用,同时熟练运用通用寄存器和堆栈来进行编写一个完整的具有某种特定功能的程序。 在本次课程设计中,考察了我们编程的技巧、运用Debug动态调试工具进行程序的调试的能力。同时,本道设计题目还检查了学生对汇编语言这门课程的基本知识的掌握程度。只有掌握汇编语言基本编程方法,掌握程序各部分功能及其相互联系、相互作用,并要熟悉基本的音乐知识,才能独立的把程序写出来,才能把程序写好。 1 总体方案论证 1.1功能分析 在此次设计中,第一个重点就是音乐播放的控制,要想能按照正常的频率和节拍播放出音乐,就需要合理的设计出给蜂鸣器的频率值和播放的时间。这样就能比较准确的把音乐按一定的节奏播放出来。如果我们要想加快播放速度,我们可以改变每一节拍的播放时间,如果我们改变了播放的频率值,那么歌曲也就相应的改变了。 第二个重点就是我们要能够根据键盘上输入的数据,合理的做出相应的应答操作,特别是在演奏过程中,我们还要求实时的检测键盘是否有输入,同时还要不能影响音乐播放的效果,并且由于我们对于键盘的输入并非是外部中断,因此实时的扫描键盘同时播放音乐的实现有一定的难度。

单片机蜂鸣器音乐演奏程序的说明

关于“世上只有妈妈好”的单片机音乐演奏程序 2009-11-22 21:45 单片机演奏一个音符,是通过引脚,周期性的输出一个特定频率的方波。 这就需要单片机,在半个周期内输出低电平、另外半个周期输出高电平,周而复始。 众所周知,周期为频率的倒数,可以通过音符的频率计算出周期;演奏时,要根据音符的不同,把对应的、半个周期的定时时间初始值,送入定时器,再由定时器按时输出高低电平。 在这个程序中,包括了两个数据表,其中存放了事先算好的、各种音符频率所对应的、半周期的定时时间初始值。有了这些数据,单片机就可以演奏从低音、中音、高音和超高音,四个八度共28个音符。 演奏乐曲时,就根据音符的不同数值,从表中找到定时时间初始值,送入定时器即可控制音调。 乐曲的数据,也要写个数据表:code unsigned char sszymmh[],表中每三个数字,说明了一个音符,它们分别代表: 第一个数字是音符的数值1234567之一,代表多来咪发...; 第二个数字是0123之一,代表低音、中音、高音、超高音; 第三个数字是时间长度,以半拍为单位。 乐曲数据表的结尾是三个0。 #include sbit speaker = P1^7; unsigned char timer0h, timer0l, time; //-------------------------------------- //单片机晶振采用11.0592MHz // 频率-半周期数据表高八位本软件共保存了四个八度的28个频率数据 code unsigned char FREQH[] = { 0xF2, 0xF3, 0xF5, 0xF5, 0xF6, 0xF7, 0xF8, //低音1234567 0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC,//1,2,3,4,5,6,7,i 0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE, //高音 234567 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF}; //超高音 1234567 // 频率-半周期数据表低八位 code unsigned char FREQL[] = { 0x42, 0xC1, 0x17, 0xB6, 0xD0, 0xD1, 0xB6, //低音1234567 0x21, 0xE1, 0x8C, 0xD8, 0x68, 0xE9, 0x5B, 0x8F, //1,2,3,4,5,6,7,i 0xEE, 0x44, 0x6B, 0xB4, 0xF4, 0x2D, //高音 234567 0x47, 0x77, 0xA2, 0xB6, 0xDA, 0xFA, 0x16}; //超高音 1234567 //-------------------------------------- //世上只有妈妈好数据表要想演奏不同的乐曲, 只需要修改这个数据表 code unsigned char sszymmh[] = { 6, 2, 3, 5, 2, 1, 3, 2, 2, 5, 2, 2, 1, 3, 2, 6, 2, 1, 5, 2, 1, //一个音符有三个数字。前为第几个音、中为第几个八度、后为时长(以半拍为单位)。 //6, 2, 3代表:6, 中音, 3个半拍; //5, 2, 1代表:5, 中音, 1个半拍; //3, 2, 2代表:3, 中音, 2个半拍; //5, 2, 2代表:5, 中音, 2个半拍; //1, 3, 2代表:1, 高音, 2个半拍;

相关主题
文本预览
相关文档 最新文档