蜂鸣器唱小星星

#include

sbit BEEP = P2^5; // 蜂鸣器引脚

sbit D1 = P1^0; // LED引脚

sbit KEY = P3^2; // 按键引脚

 

// 定义音符频率(单位:Hz)

#define C4 262 // Do

#define D4 294 // Re

#define E4 330 // Mi

#define F4 349 // Fa

#define G4 392 // Sol

#define A4 440 // La

#define B4 494 // Si

 

// 《小星星》前两句音符序列:1155665 4433221

unsigned int code melody[] = {C4, C4, G4, G4, A4, A4, G4, F4, F4, E4, E4, D4, D4, C4};

// 每个音符的节拍(4分音符=1,8分音符=0.5)

unsigned char code rhythm[] = {1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2};

 

void delay(unsigned int t) {

    while(t--);

}

 

// 播放指定频率的音符(duration为节拍倍数)

void play_note(unsigned int freq, float duration) {

    unsigned int i, cycles;

    unsigned long delay_time = 100000 / freq; // 计算半周期延时(us级)

    cycles = (unsigned int)(freq * duration * 0.5); // 总震荡次数

 

    for(i = 0; i < cycles; i++) {

        BEEP = ~BEEP; // 翻转电平,生成方波

        delay(delay_time); // 控制频率

    }

    BEEP = 0; // 关闭蜂鸣器

    delay(50000); // 音符间隔(防粘连)

}

 

// 播放《小星星》

void play_star() {

    for(int i = 0; i < 14; i++) {

        play_note(melody[i], rhythm[i] * 0.5); // 节拍缩放(调整播放速度)

    }

}

 

void main() {

    while(1) {

        if(!KEY) { // 检测按键按下

            D1 = ~D1; // LED状态翻转

            play_star(); // 播放音乐

            // 此处可添加数码管显示代码

        }

    }

}

你可能感兴趣的:(智能路由器)