单片机生日快乐音符表和节拍表怎么写?要数字生成的,跪求!

单片机生日快乐音符表和节拍表怎么写?要数字生成的,跪求!,#include <reg52.h> sbit BUZZ = P1^6; //蜂鸣器控制引脚 unsigned…

单片机生日快乐音符表和节拍表怎么写?要数字生成的,跪求!,#include <reg52.h>
sbit BUZZ = P1^6; //蜂鸣器控制引脚

unsigned int code NoteFrequ[] = { //中音 1-7 和高音 1-7 对应频率列表
        523, 587, 659, 698, 784, 880, 988, //中音 1-7
        1047, 1175, 1319, 1397, 1568, 1760, 1976 //高音 1-7
};

unsigned int code NoteReload[] = { //中音 1-7 和高音 1-7 对应的定时器重载值
        65536 – (11059200/12) / (523*2), //中音 1
        65536 – (11059200/12) / (587*2), //2
        65536 – (11059200/12) / (659*2), //3
        65536 – (11059200/12) / (698*2), //4
        65536 – (11059200/12) / (784*2), //5
        65536 – (11059200/12) / (880*2), //6
        65536 – (11059200/12) / (988*2), //7
        65536 – (11059200/12) / (1047*2), //高音 1
        65536 – (11059200/12) / (1175*2), //2
        65536 – (11059200/12) / (1319*2), //3
        65536 – (11059200/12) / (1397*2), //4
        65536 – (11059200/12) / (1568*2), //5
        65536 – (11059200/12) / (1760*2), //6
        65536 – (11059200/12) / (1976*2), //7
};

bit enable = 1; //蜂鸣器发声使能标志

bit tmrflag = 0; //定时器中断完成标志
unsigned char T0RH = 0xFF; //T0 重载值的高字节
unsigned char T0RL = 0x00; //T0 重载值的低字节
void PlayTwoTiger();
void main()
{
        unsigned int i;
        EA = 1; //使能全局中断
        TMOD = 0x01; //配置 T0 工作在模式 1
        TH0 = T0RH;
        TL0 = T0RL;
        ET0 = 1; //使能 T0 中断
        TR0 = 1; //启动 T0
        while (1)
        {
        PlayTwoTiger(); //播放乐曲–两支老虎
        for (i=0; i<40000; i++); //停止一段时间
        }
}
/* 两只老虎乐曲播放函数 */
void PlayTwoTiger()
{
        unsigned char beat; //当前节拍索引
        unsigned char note; //当前节拍对应的音符
        unsigned int time = 0; //当前节拍计时
        unsigned int beatTime = 0; //当前节拍总时间
        unsigned int soundTime = 0; //当前节拍需发声时间

unsigned char code TwoTigerNote[] = {
// 生日快乐音符表 数字
        };
/节拍表,4 表示一拍,1 就是 1/4 拍,8 就是 2 拍
unsigned char code TwoTigerBeat[] = {
     生日快乐节拍表
        };
        for (beat=0; beat<sizeof(TwoTigerNote); ) //用节拍索引作为循环变量
{

while (!tmrflag); //每次定时器中断完成后,检测并处理节拍
tmrflag = 0;
if (time == 0) //当前节拍播完则启动一个新节拍
{
        note = TwoTigerNote[beat] – 1;
        T0RH = NoteReload[note] >> 8;
        T0RL = NoteReload[note];
        //计算节拍总时间,右移 2 位相当于除 4,移位代替除法可以加快执行速度
        beatTime = (TwoTigerBeat[beat] * NoteFrequ[note]) >> 2;
        //计算发声时间,为总时间的 0.75,移位原理同上
        soundTime = beatTime – (beatTime >> 2);
        enable = 1; //指示蜂鸣器开始发声
        time++;
}
        else //当前节拍未播完则处理当前节拍
        {
                if (time >= beatTime) //当前持续时间到达节拍总时间时归零,
                { //并递增节拍索引,以准备启动新节拍
                time = 0;
                beat++;
                }
                else //当前持续时间未达到总时间时,
                {
                time++; //累加时间计数
                        if (time == soundTime) //到达发声时间后,指示关闭蜂鸣器,
                        { //插入 0.25*总时间的静音间隔,
                        enable = 0; //用以区分连续的两个节拍
                        }
                }
        }
}
}
/* T0 中断服务函数,用于控制蜂鸣器发声 */
void InterruptTimer0() interrupt 1
{
        TH0 = T0RH; //重新加载重载值
        TL0 = T0RL;
        tmrflag = 1;
        if (enable) //使能时反转蜂鸣器控制电平
        BUZZ = ~BUZZ;
        else //未使能时关闭蜂鸣器
        BUZZ = 1;
}

,用的芯片是STC89c52的,在线求生日快乐节拍表和音符表   要数字组成的,1,0,1,2,1,4,3,0,
1,0,1,2,1,5,4,0,
1,0,1,8,6,4,3,2,0,
7,0,7,6,4,5,4,0  这是音符
24,1,24,48,48,48,72,5,
24,1,24,48,48,48,72,5,
24,1,24,48,48,48,48,72,5,
24,1,24,48,48,48,72,5这是节拍。

作者: soufei

为您推荐


Fatal error: Can't use function return value in write context in /www/wwwroot/www.qianrushi.com.cn/wp-content/themes/news/footer.php on line 115