香河英茂工作室 发表于 2025-6-18 06:00:01

AI8051U擎天柱播放BEEP音乐,为什么还不响?是不是哪里没有使能?

AI8051U擎天柱播放BEEP音乐,为什么还不响?是不是哪里没有使能?

#include "comm\AI8051U.h"
#include "stdio.h"
#include "intrins.h"

// 定义 GPIO_P5_0 宏
#define GPIO_P5 (*(volatile unsigned char *)0x00C8)
sbit GPIO_P5_0 = GPIO_P5^0;

typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;

#define MAIN_Fosc       24000000UL
#define Timer0_Reload   (65536UL - (MAIN_Fosc / 1000))// Timer 0 中断频率, 1000次/秒

#define NOTE_C4262
#define NOTE_D4294
#define NOTE_E4330
#define NOTE_F4349
#define NOTE_G4392
#define NOTE_A4440
#define NOTE_B4494
#define NOTE_C5523

// 定义延时函数
void delay_ms(unsigned int ms) {
    unsigned int i, j;
    for(i = 0; i < ms; i++)
      for(j = 0; j < 123; j++); // 根据24MHz时钟调整
}

// 定义音符播放函数
void play_note(unsigned int frequency, unsigned int duration) {
    unsigned int period = 24000000 / frequency; // 计算周期(us)
    unsigned int half_period = period / 2; // 半周期(us)
    unsigned int cycles = duration * 1000 / period; // 计算播放的周期数

    unsigned int i;
    for(i = 0; i < cycles; i++) {
      GPIO_P5_0 = 1; // 高电平
      delay_ms(half_period / 1000); // 延时半周期
      GPIO_P5_0 = 0; // 低电平
      delay_ms(half_period / 1000); // 延时半周期
    }
    delay_ms(50); // 音符间的间隔
}

// 生日快乐歌音符序列
u16 song[] = {
    NOTE_C4, NOTE_C4, NOTE_D4, NOTE_C4, NOTE_F4, NOTE_E4,
    NOTE_C4, NOTE_C4, NOTE_D4, NOTE_C4, NOTE_G4, NOTE_F4,
    NOTE_C4, NOTE_C4, NOTE_C5, NOTE_A4, NOTE_F4, NOTE_E4, NOTE_D4,
    NOTE_A4, NOTE_A4, NOTE_A4, NOTE_F4, NOTE_G4, NOTE_F4
};

// 生日快乐歌音符时长(ms)
unsigned int song_duration[] = {
    300, 300, 600, 600, 600, 900,
    300, 300, 600, 600, 600, 900,
    300, 300, 600, 600, 600, 600, 900,
    300, 300, 600, 600, 600, 900
};

void main() {
    unsigned int i;
    while(1) {
      for(i = 0; i < sizeof(song) / sizeof(song); i++) {
            play_note(song, song_duration);
      }
      delay_ms(2000); // 歌曲播放完后停顿2秒
    }
}

ercircle 发表于 2025-6-18 09:22:07

没配置IO,没开XFR,代码逻辑还有BUG

play_note(song, song_duration);

#include "AI8051U.h"
#include "stdio.h"
#include "intrins.h"

// 定义 GPIO_P5_0 宏
#define GPIO_P5 P5 //(*(volatile unsigned char *)0x00C8)
sbit GPIO_P5_0 = GPIO_P5^0;

typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;

#define MAIN_Fosc       24000000UL
#define Timer0_Reload   (65536UL - (MAIN_Fosc / 1000))// Timer 0 中断频率, 1000次/秒

#define NOTE_C4262
#define NOTE_D4294
#define NOTE_E4330
#define NOTE_F4349
#define NOTE_G4392
#define NOTE_A4440
#define NOTE_B4494
#define NOTE_C5523

// 定义延时函数
void delay_ms(unsigned int ms) {
    unsigned int i, j;
    for(i = 0; i < ms; i++)
      for(j = 0; j < 123; j++); // 根据24MHz时钟调整
}

// 定义音符播放函数
void play_note(unsigned int frequency, unsigned int duration) {
    unsigned int period = 24000000 / frequency; // 计算周期(us)
    unsigned int half_period = period / 2; // 半周期(us)
    unsigned int cycles = duration * 1000 / period; // 计算播放的周期数

    unsigned int i;
    for(i = 0; i < cycles; i++) {
      GPIO_P5_0 = 1; // 高电平
      delay_ms(half_period / 1000); // 延时半周期
      GPIO_P5_0 = 0; // 低电平
      delay_ms(half_period / 1000); // 延时半周期
    }
    delay_ms(50); // 音符间的间隔
}

// 生日快乐歌音符序列
u16 song[] = {
    NOTE_C4, NOTE_C4, NOTE_D4, NOTE_C4, NOTE_F4, NOTE_E4,
    NOTE_C4, NOTE_C4, NOTE_D4, NOTE_C4, NOTE_G4, NOTE_F4,
    NOTE_C4, NOTE_C4, NOTE_C5, NOTE_A4, NOTE_F4, NOTE_E4, NOTE_D4,
    NOTE_A4, NOTE_A4, NOTE_A4, NOTE_F4, NOTE_G4, NOTE_F4
};

// 生日快乐歌音符时长(ms)
unsigned int song_duration[] = {
    300, 300, 600, 600, 600, 900,
    300, 300, 600, 600, 600, 900,
    300, 300, 600, 600, 600, 600, 900,
    300, 300, 600, 600, 600, 900
};

void main() {
    unsigned int i;
                P_SW2 |= 0x80;
   
    P0M1 = 0x00;   P0M0 = 0x00;
    P1M1 = 0x00;   P1M0 = 0x00;
    P2M1 = 0x00;   P2M0 = 0x00;
    P3M1 = 0x00;   P3M0 = 0x00;
    P4M1 = 0x00;   P4M0 = 0x00;
    P5M1 = 0x00;   P5M0 = 0x00;
    P6M1 = 0x00;   P6M0 = 0x00;
    P7M1 = 0x00;   P7M0 = 0x00;
    while(1) {
      for(i = 0; i < sizeof(song) / sizeof(song); i++) {
            play_note(song,song_duration);
      }
      delay_ms(2000); // 歌曲播放完后停顿2秒
    }
}

香河英茂工作室 发表于 7 天前

感谢回复
页: [1]
查看完整版本: AI8051U擎天柱播放BEEP音乐,为什么还不响?是不是哪里没有使能?