找回密码
 立即注册
查看: 75|回复: 2

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

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:175
  • 最近打卡:2025-06-28 07:19:36
已绑定手机

115

主题

392

回帖

549

积分

高级会员

积分
549
发表于 2025-6-18 06:00:01 | 显示全部楼层 |阅读模式
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_C4  262
#define NOTE_D4  294
#define NOTE_E4  330
#define NOTE_F4  349
#define NOTE_G4  392
#define NOTE_A4  440
#define NOTE_B4  494
#define NOTE_C5  523

// 定义延时函数
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[0]); i++) {
            play_note(song, song_duration);
        }
        delay_ms(2000); // 歌曲播放完后停顿2秒
    }
}

回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:220
  • 最近打卡:2025-06-28 13:49:44
已绑定手机

72

主题

2016

回帖

4540

积分

荣誉版主

无情的代码机器

积分
4540
发表于 2025-6-18 09:22:07 | 显示全部楼层
没配置IO,没开XFR,代码逻辑还有BUG

play_note(song, song_duration);

  1. #include "AI8051U.h"
  2. #include "stdio.h"
  3. #include "intrins.h"
  4. // 定义 GPIO_P5_0 宏
  5. #define GPIO_P5 P5 //(*(volatile unsigned char *)0x00C8)
  6. sbit GPIO_P5_0 = GPIO_P5^0;
  7. typedef unsigned char u8;
  8. typedef unsigned int u16;
  9. typedef unsigned long u32;
  10. #define MAIN_Fosc       24000000UL
  11. #define Timer0_Reload   (65536UL - (MAIN_Fosc / 1000))  // Timer 0 中断频率, 1000次/秒
  12. #define NOTE_C4  262
  13. #define NOTE_D4  294
  14. #define NOTE_E4  330
  15. #define NOTE_F4  349
  16. #define NOTE_G4  392
  17. #define NOTE_A4  440
  18. #define NOTE_B4  494
  19. #define NOTE_C5  523
  20. // 定义延时函数
  21. void delay_ms(unsigned int ms) {
  22.     unsigned int i, j;
  23.     for(i = 0; i < ms; i++)
  24.         for(j = 0; j < 123; j++); // 根据24MHz时钟调整
  25. }
  26. // 定义音符播放函数
  27. void play_note(unsigned int frequency, unsigned int duration) {
  28.     unsigned int period = 24000000 / frequency; // 计算周期(us)
  29.     unsigned int half_period = period / 2; // 半周期(us)
  30.     unsigned int cycles = duration * 1000 / period; // 计算播放的周期数
  31.     unsigned int i;
  32.     for(i = 0; i < cycles; i++) {
  33.         GPIO_P5_0 = 1; // 高电平
  34.         delay_ms(half_period / 1000); // 延时半周期
  35.         GPIO_P5_0 = 0; // 低电平
  36.         delay_ms(half_period / 1000); // 延时半周期
  37.     }
  38.     delay_ms(50); // 音符间的间隔
  39. }
  40. // 生日快乐歌音符序列
  41. u16 song[] = {
  42.     NOTE_C4, NOTE_C4, NOTE_D4, NOTE_C4, NOTE_F4, NOTE_E4,
  43.     NOTE_C4, NOTE_C4, NOTE_D4, NOTE_C4, NOTE_G4, NOTE_F4,
  44.     NOTE_C4, NOTE_C4, NOTE_C5, NOTE_A4, NOTE_F4, NOTE_E4, NOTE_D4,
  45.     NOTE_A4, NOTE_A4, NOTE_A4, NOTE_F4, NOTE_G4, NOTE_F4
  46. };
  47. // 生日快乐歌音符时长(ms)
  48. unsigned int song_duration[] = {
  49.     300, 300, 600, 600, 600, 900,
  50.     300, 300, 600, 600, 600, 900,
  51.     300, 300, 600, 600, 600, 600, 900,
  52.     300, 300, 600, 600, 600, 900
  53. };
  54. void main() {
  55.     unsigned int i;
  56.                 P_SW2 |= 0x80;
  57.    
  58.     P0M1 = 0x00;   P0M0 = 0x00;
  59.     P1M1 = 0x00;   P1M0 = 0x00;
  60.     P2M1 = 0x00;   P2M0 = 0x00;
  61.     P3M1 = 0x00;   P3M0 = 0x00;
  62.     P4M1 = 0x00;   P4M0 = 0x00;
  63.     P5M1 = 0x00;   P5M0 = 0x00;
  64.     P6M1 = 0x00;   P6M0 = 0x00;
  65.     P7M1 = 0x00;   P7M0 = 0x00;
  66.     while(1) {
  67.         for(i = 0; i < sizeof(song) / sizeof(song[0]); i++) {
  68.             play_note(song[i],song_duration[i]);
  69.         }
  70.         delay_ms(2000); // 歌曲播放完后停顿2秒
  71.     }
  72. }
复制代码


三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:175
  • 最近打卡:2025-06-28 07:19:36
已绑定手机

115

主题

392

回帖

549

积分

高级会员

积分
549
发表于 7 天前 | 显示全部楼层
感谢回复
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-28 23:56 , Processed in 0.286587 second(s), 59 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表