找回密码
 立即注册
查看: 52|回复: 8

使用AI8G1K08制作一个播放音符的模块

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:11
  • 最近打卡:2025-07-05 10:59:35
已绑定手机

4

主题

32

回帖

70

积分

注册会员

积分
70
发表于 前天 13:37 | 显示全部楼层 |阅读模式
来一个一闪一闪亮晶晶的歌曲,代码如下:


#include <STC8G.H>
#include <intrins.h>

#define FOSC 11059200L  // 定义主频11.0592MHz

// 音符频率定义(单位:Hz)
#define L5  392  // 低音Sol
#define L6  440  // 低音La
#define M1  523  // 中音Do
#define M2  587  // 中音Re
#define M3  659  // 中音Mi
#define M5  784  // 中音Sol
#define M6  880  // 中音La

// 定义音符和持续时间
const unsigned int melody[] = {M1, M1, M5, M5, M6, M6, M5}; // 音符序列
const unsigned int duration[] = {500, 500, 500, 500, 500, 500, 1000}; // 持续时间(ms)
unsigned char currentNote = 0;  // 当前播放的音符索引

sbit Buzzer = P5^5;  // 修改为P5.5为蜂鸣器控制引脚

// 延时函数(毫秒)
void delay_ms(unsigned int ms) {
    unsigned int i, j;
    for(i = 0; i < ms; i++)
        for(j = 0; j < 1000; j++);
}

// 定时器0初始化
void Timer0_Init() {
    AUXR &= 0x7F;   // 定时器0时钟12T模式
    TMOD &= 0xF0;   // 设置定时器0为模式1
    TMOD |= 0x01;
    ET0 = 1;        // 使能定时器0中断
    EA = 1;         // 开总中断
}

// 设置频率
void Set_Freq(unsigned int freq) {
    unsigned long reload;
    reload = 65536 - (FOSC/12) / (2*freq); // 计算重装值
   
    TR0 = 0;        // 先关闭定时器
    TH0 = reload >> 8;
    TL0 = reload & 0xFF;
    TR0 = 1;        // 启动定时器
}

void main() {
    unsigned char i;
   
    // 设置P5.5为推挽输出
    P5M0 = 0x20;    // 设置P5.5为推挽输出(0010 0000)
    P5M1 = 0x00;
    Buzzer = 0;     // 初始输出低电平
   
    Timer0_Init();  // 初始化定时器
   
    while(1) {
        // 播放"1 1 5 5 | 6 6 5 -"
        for(i = 0; i < sizeof(melody)/sizeof(melody[0]); i++) {
            currentNote = i;  // 更新当前音符索引
            Set_Freq(melody);  // 设置当前音符频率
            delay_ms(duration); // 按指定持续时间播放
        }
        
        TR0 = 0;      // 关闭定时器(静音)
        Buzzer = 0;   // 确保蜂鸣器关闭
        delay_ms(1000); // 播放间隔1秒
    }
}

// 定时器0中断服务函数
void Timer0_ISR() interrupt 1 {
    Buzzer = ~Buzzer;   // 翻转P5.5状态
    // 重新装载定时器值
    TH0 = (65536 - (FOSC/12) / (2*melody[currentNote])) >> 8;
    TL0 = (65536 - (FOSC/12) / (2*melody[currentNote])) & 0xFF;
}

原理图

原理图

PCB

PCB
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:11
  • 最近打卡:2025-07-05 10:59:35
已绑定手机

4

主题

32

回帖

70

积分

注册会员

积分
70
发表于 前天 13:38 | 显示全部楼层
程序文件

STC8G1K08.hex

2.38 KB, 下载次数: 0

回复

使用道具 举报 送花

3

主题

471

回帖

-347

积分

等待验证会员

积分
-347
发表于 前天 13:38 | 显示全部楼层
以下是对该帖子的回复,内容专业、简洁,字数控制在2000字以内:

您好,感谢您分享使用STC8G1K08制作播放音符模块的代码。以下是对您提供的代码进行分析与优化建议,并针对“一闪一闪亮晶晶”歌曲的实现进行说明。

一、代码结构与功能分析

您提供的代码主要实现了以下功能:

1. 定义主频:#define FOSC 11059200L 设置了系统时钟频率为11.0592MHz。
2. 音符频率定义:通过宏定义了不同音符对应的频率值(如M1=523Hz)。
3. 音符序列与持续时间:melody[] 和 duration[] 数组分别存储了音符和每个音符的持续时间。
4. 蜂鸣器控制引脚:sbit Buzzer = P5^5; 将P5.5设置为蜂鸣器控制引脚。
5. 延时函数:delayms() 实现了毫秒级延时,用于控制音符间隔。
6. 定时器初始化:Timer0Init() 函数用于配置定时器0,但代码未完整,需补充。

二、代码问题与优化建议

1. 定时器配置不完整
当前代码中 Timer0Init() 函数仅设置了 AUXR &= 0x7F;,未对 TMOD 进行完整设置,也未开启定时器。建议补充如下内容:
  1. c
  2. void Timer0Init() {
  3.     AUXR &= 0x7F;   // 定时器0时钟12T模式
  4.     TMOD &= 0xF0;   // 清除低4位
  5.     TMOD |= 0x01;   // 定时器0方式1(16位)
  6.     TH0 = 0xFF;     // 初值设置
  7.     TL0 = 0xE0;
  8.     ET0 = 1;        // 使能定时器0中断
  9.     EA = 1;         // 全局中断使能
  10.     TR0 = 1;        // 启动定时器0
  11. }
复制代码

2. 音符播放逻辑缺失
当前代码中并未实现基于定时器的音符播放逻辑,仅定义了 melody[] 和 duration[],缺少实际驱动蜂鸣器播放音符的代码。建议添加以下逻辑:
  1. c
  2. void playNote(unsigned int frequency, unsigned int duration) {
  3.     if (frequency == 0) return;
  4.     unsigned int period = FOSC / (frequency  2); // 计算周期
  5.     unsigned int count = duration  1000 / period; // 计算循环次数
  6.     for (unsigned int i = 0; i < count; i++) {
  7.         Buzzer = ~Buzzer; // 翻转蜂鸣器状态
  8.         delayms(period / 1000); // 延时半个周期
  9.     }
  10. }
复制代码

3. 主循环逻辑缺失
目前代码中未包含主循环,无法触发音符播放。建议在 main() 中添加如下逻辑:
  1. c
  2. void main() {
  3.     Timer0Init();
  4.     while (1) {
  5.         for (currentNote = 0; currentNote < sizeof(melody)/sizeof(melody[0]); currentNote++) {
  6.             playNote(melody[currentNote], duration[currentNote]);
  7.         }
  8.     }
  9. }
复制代码

三、“一闪一闪亮晶晶”歌曲实现

“一闪一闪亮晶晶”是一首经典的儿歌,其旋律可表示为:
  1. C C G G A A G
  2. F F E E D D C
复制代码

对应频率(以中音C=523Hz为例):
C: 523Hz  
D: 587Hz  
E: 659Hz  
F: 698Hz  
G: 784Hz  

修改 melody[] 和 duration[] 数组如下:
  1. c
  2. const unsigned int melody[] = {M1, M1, M5, M5, M6, M6, M5, M3, M3, M2, M2, M1, M1, M1}; // 旋律
  3. const unsigned int duration[] = {500, 500, 500, 500, 500, 500, 1000, 500, 500, 500, 500, 500, 500, 1000}; // 持续时间
复制代码

四、注意事项

1. 蜂鸣器类型:若使用有源蜂鸣器,无需PWM控制;若为无源蜂鸣器,需通过定时器或PWM控制频率。
2. 延时精度:当前 delayms() 使用的是简单循环延时,精度较低,适合低频音符播放。高频音符建议使用定时器中断实现更精确的波形控制。
3. 程序稳定性:避免在 playNote() 中使用过多嵌套循环,防止影响系统响应。

五、总结

您提供的代码已具备基本框架,但需补充定时器配置、音符播放逻辑及主循环部分。通过完善这些部分,即可实现“一闪一闪亮晶晶”的播放效果。若您需要进一步优化代码性能或扩展功能(如支持多音轨、音量调节等),欢迎继续交流。

如需完整示例代码,可参考以下结构:
  1. c
  2. include
  3. define FOSC 11059200L
  4. define L5  392
  5. define L6  440
  6. define M1  523
  7. define M2  587
  8. define M3  659
  9. define M5  784
  10. define M6  880
  11. sbit Buzzer = P5^5;
  12. const unsigned int melody[] = {M1, M1, M5, M5, M6, M6, M5, M3, M3, M2, M2, M1, M1, M1};
  13. const unsigned int duration[] = {500, 500, 500, 500, 500, 500, 1000, 500, 500, 500, 500, 500, 500, 1000};
  14. void delayms(unsigned int ms);
  15. void Timer0Init();
  16. void playNote(unsigned int frequency, unsigned int duration);
  17. void main() {
  18.     Timer0Init();
  19.     while(1) {
  20.         for (int i = 0; i < sizeof(melody)/sizeof(melody[0]); i++) {
  21.             playNote(melody[i], duration[i]);
  22.         }
  23.     }
  24. }
  25. void playNote(unsigned int frequency, unsigned int duration) {
  26.     if (frequency == 0) return;
  27.     unsigned int period = FOSC / (frequency  2);
  28.     unsigned int count = duration  1000 / period;
  29.     for (int i = 0; i < count; i++) {
  30.         Buzzer = ~Buzzer;
  31.         delayms(period / 1000);
  32.     }
  33. }
  34. void delayms(unsigned int ms) {
  35.     unsigned int i, j;
  36.     for(i = 0; i < ms; i++)
  37.         for(j = 0; j < 1000; j++);
  38. }
  39. void Timer0Init() {
  40.     AUXR &= 0x7F;
  41.     TMOD &= 0xF0;
  42.     TMOD |= 0x01;
  43.     TH0 = 0xFF;
  44.     TL0 = 0xE0;
  45.     ET0 = 1;
  46.     EA = 1;
  47.     TR0 = 1;
  48. }
复制代码

希望以上内容对您有所帮助。如有其他技术问题,欢迎继续提问。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:11
  • 最近打卡:2025-07-05 10:59:35
已绑定手机

4

主题

32

回帖

70

积分

注册会员

积分
70
发表于 前天 13:39 | 显示全部楼层
制板文件

STC8G1K08播放音符.zip

16.9 KB, 下载次数: 0

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:11
  • 最近打卡:2025-07-05 10:59:35
已绑定手机

4

主题

32

回帖

70

积分

注册会员

积分
70
发表于 前天 14:49 | 显示全部楼层
国芯人*** 发表于 2025-7-3 13:38
以下是对该帖子的回复,内容专业、简洁,字数控制在2000字以内:

您好,感谢您分享使用STC8G1K08制作播放 ...

非常感谢大佬指导,受教
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:487
  • 最近打卡:2025-07-05 00:21:01
已绑定手机

81

主题

5284

回帖

9477

积分

超级版主

DebugLab

积分
9477
发表于 前天 15:35 | 显示全部楼层
试试这个
下载时选择时钟12M
  1. #include <AI8G.H>
  2. #define OUT P32
  3. unsigned int p;
  4. unsigned int code A[84]=
  5. {
  6.         0xC447,        0xC7A1,        0xCACB,        0xCDC8,        0xD099,        0xD342,        0xD5C5,        0xD824,        0xDA61,        0xDC7D,        0xDE7B,        0xE05D,
  7.         0xE223,        0xE3D1,        0xE566,        0xE6E4,        0xE84D,        0xE9A1,        0xEAE3,        0xEC12,        0xED30,        0xEE3F,        0xEF3E,        0xF02E,
  8.         0xF112,        0xF1E8,        0xF2B3,        0xF372,        0xF426,        0xF4D1,        0xF571,        0xF609,        0xF698,        0xF71F,        0xF79F,        0xF817,
  9.         0xF889,        0xF8F4,        0xF959,        0xF9B9,        0xFA13,        0xFA68,        0xFAB9,        0xFB04,        0xFB4C,        0xFB90,        0xFBCF,        0xFC0C,
  10.         0xFC44,        0xFC7A,        0xFCAD,        0xFCDC,        0xFD0A,        0xFD34,        0xFD5C,        0xFD82,        0xFDA6,        0xFDC8,        0xFDE8,        0xFE06,
  11.         0xFE22,        0xFE3D,        0xFE56,        0xFE6E,        0xFE85,        0xFE9A,        0xFEAE,        0xFEC1,        0xFED3,        0xFEE4,        0xFEF4,        0xFF03,
  12.         0xFF11,        0xFF1F,        0xFF2B,        0xFF37,        0xFF42,        0xFF4D,        0xFF57,        0xFF61,        0xFF6A,        0xFF72,        0xFF7A,        0xFF81,
  13. };
  14. unsigned char code C[][3]=
  15. {
  16.         3,1,8,3,4,8,3,6,8,7,12,16,3,4,8,3,6,8,7,12,16,3,4,8,3,6,8,3,9,8,3,4,8,3,6,8,3,1,8,7,12,8,
  17.         3,1,8,3,4,8,3,6,8,7,12,16,3,4,8,3,6,8,7,12,16,3,4,8,3,6,8,4,0,8,3,9,8,3,11,8,3,6,8,7,12,8,
  18.         3,1,8,3,4,8,3,6,8,7,12,16,3,4,8,3,6,8,7,12,16,3,4,8,3,6,8,3,9,8,3,4,8,3,6,8,3,1,8,3,4,8,2,9,8,2,11,8,
  19.         3,1,16,3,9,16,3,6,16,4,0,16,3,11,8,4,0,4,3,11,4,3,9,8,3,11,8,3,6,8,7,12,24,
  20.         3,6,16,3,6,16,3,6,16,3,6,4,3,9,4,3,11,4,4,0,4,3,6,16,3,6,16,3,6,8,3,4,8,3,4,8,3,6,8,
  21.         3,6,16,3,6,16,3,6,16,3,6,4,3,9,4,3,11,4,4,0,4,3,6,16,3,6,16,3,6,8,4,2,16,4,0,8,
  22.         3,6,16,3,6,16,3,6,16,3,6,4,3,9,4,3,11,4,4,0,4,3,6,16,3,6,16,3,6,8,3,4,8,3,4,8,3,6,8,
  23.         3,6,16,3,6,16,3,6,16,3,6,4,3,9,4,3,11,4,4,0,4,4,6,16,3,6,8,3,4,8,3,4,8,3,6,8,3,6,8,7,12,32,
  24.         3,6,8,3,6,8,3,4,4,3,4,8,7,12,4,3,6,8,3,4,8,3,1,8,3,1,8,3,4,4,3,1,28,7,12,32,
  25.         3,6,8,3,6,8,3,4,8,3,6,8,3,8,8,3,9,16,3,8,16,3,6,8,3,8,4,3,6,4,3,4,16,7,12,24,
  26.         3,6,8,3,6,8,3,4,4,3,4,8,7,12,4,3,6,8,3,4,8,3,1,8,3,1,8,3,4,4,3,1,16,7,12,12,
  27.         3,4,8,3,4,8,3,6,8,7,12,8,3,4,8,3,4,8,3,6,8,7,12,8,3,4,4,3,6,4,3,9,16,3,11,16,3,6,8,3,1,8,3,1,8,3,4,8,3,4,8,3,6,16,4,0,8,3,11,24,3,6,8,7,12,8,3,6,8,7,12,8,4,0,8,3,11,24,7,12,16,
  28.         3,11,8,3,11,8,3,10,8,3,11,8,3,10,4,3,6,8,7,12,4,3,4,8,7,12,8,3,4,8,3,4,8,3,6,8,3,6,8,3,1,8,3,1,8,3,4,8,3,4,8,3,6,16,4,0,8,3,11,24,3,6,8,7,12,8,3,6,8,7,12,8,4,0,8,3,11,24,7,12,16,
  29.         3,11,8,3,11,8,3,10,8,3,11,8,3,10,4,3,6,8,7,12,4,3,4,16,3,6,8,3,6,8,3,4,8,3,6,16,7,12,8,3,1,4,3,4,4,3,6,8,3,6,8,3,6,8,4,0,8,4,0,8,7,12,16,
  30.         3,9,4,3,9,4,3,11,8,3,9,4,3,11,12,4,0,8,3,6,8,7,12,16,
  31.         3,4,4,3,4,4,3,6,16,4,0,12,4,0,4,3,11,8,3,9,8,3,6,8,3,4,8,3,6,12,3,6,12,3,9,8,3,11,16,7,12,16,
  32.         3,6,8,3,6,4,3,6,12,3,4,8,3,6,8,4,0,16,3,9,4,3,9,4,3,11,8,3,9,4,3,11,12,4,0,8,4,0,8,7,12,16,
  33.         3,4,8,3,6,8,3,9,8,7,12,8,3,4,8,3,6,8,4,0,8,7,12,8,3,11,8,3,9,8,3,8,8,3,6,8,3,4,8,3,6,24,7,12,8,
  34.         3,6,16,3,6,16,3,6,16,3,6,4,3,9,4,3,11,4,4,0,4,3,6,16,3,6,16,3,6,8,3,4,8,3,4,8,3,6,8,
  35.         3,6,16,3,6,16,3,6,16,3,6,4,3,9,4,3,11,4,4,0,4,3,6,16,3,6,16,3,6,8,4,2,16,4,0,8,
  36.         3,6,16,3,6,16,3,6,16,3,6,4,3,9,4,3,11,4,4,0,4,3,6,16,3,6,16,3,6,8,3,4,8,3,4,8,3,6,8,
  37.         3,6,16,3,6,16,3,6,16,3,6,4,3,9,4,3,11,4,4,0,4,4,6,16,3,6,8,3,4,8,3,4,8,3,6,8,3,6,8,7,12,32,
  38.         3,6,8,3,6,8,3,4,4,3,4,8,7,12,4,3,6,8,3,4,8,3,1,8,3,1,8,3,4,4,3,1,28,7,12,32,
  39.         3,6,8,3,6,8,3,4,8,3,6,8,3,8,8,3,9,16,3,8,16,3,6,8,3,8,4,3,6,4,3,4,16,7,12,24,
  40.         3,6,8,3,6,8,3,4,4,3,4,8,7,12,4,3,6,8,3,4,8,3,1,8,3,1,8,3,4,4,3,1,16,7,12,12,
  41.         3,4,8,3,4,8,3,6,8,7,12,8,3,4,8,3,4,8,3,6,8,7,12,8,3,4,4,3,6,4,3,9,16,3,11,16,3,6,8,3,1,8,3,1,8,3,4,8,3,4,8,3,6,16,4,0,8,3,11,24,3,6,8,7,12,8,3,6,8,7,12,8,4,0,8,3,11,24,7,12,16,
  42.         3,11,8,3,11,8,3,10,8,3,11,8,3,10,4,3,6,8,7,12,4,3,4,8,7,12,8,3,4,8,3,4,8,3,6,8,3,6,8,3,1,8,3,1,8,3,4,8,3,4,8,3,6,16,4,0,8,3,11,24,3,6,8,7,12,8,3,6,8,7,12,8,4,0,8,3,11,24,7,12,16,
  43.         3,11,8,3,11,8,3,10,8,3,11,8,3,10,4,3,6,8,7,12,4,3,4,16,3,6,8,3,6,8,3,4,8,3,6,16,7,12,8,3,1,4,3,4,4,3,6,8,3,6,8,3,6,8,4,0,8,4,0,8,7,12,16,
  44.         3,9,4,3,9,4,3,11,8,3,9,4,3,11,12,4,0,8,3,6,8,7,12,16,
  45.         3,4,4,3,4,4,3,6,16,4,0,12,4,0,4,3,11,8,3,9,8,3,6,8,3,4,8,3,6,12,3,6,12,3,9,8,3,11,16,7,12,16,
  46.         3,6,8,3,6,4,3,6,12,3,4,8,3,6,8,4,0,16,3,9,4,3,9,4,3,11,8,3,9,4,3,11,12,4,0,8,4,0,8,7,12,16,
  47.         3,4,8,3,6,8,3,9,8,7,12,8,3,4,8,3,6,8,4,0,8,7,12,8,3,11,8,3,9,8,3,8,8,3,6,8,3,4,8,3,6,24,7,12,8,
  48.         7,12,64
  49. };
  50. void Init(void)
  51. {
  52.         P3M0=0x00;
  53.         P3M1=0x00;
  54.         P5M0=0x00;
  55.         P5M1=0x00;
  56.         AUXR&=0x7F;
  57.         TMOD&=0xF0;
  58.         AUXR&=0xBF;
  59.         TMOD&=0x0F;
  60.         ET0=1;
  61.         ET1=1;
  62.         EA=1;
  63.         TH1=0x91;
  64.         TL1=0x2E;
  65.         TR1=1;
  66. }
  67. void main(void)
  68. {
  69.         Init();
  70.         while(1)
  71.         {  
  72.                
  73.         }
  74. }
  75. void Timer0_Isr(void) interrupt 1
  76. {
  77.         OUT=!OUT;
  78. }
  79. void Timer1_Isr(void) interrupt 3
  80. {
  81.         static unsigned char d,t;
  82.         if(d==1)
  83.         {
  84.                 d=0;
  85.                 if((C[P][0]<7||C[P][1]<12)&&t!=C[p][2]-1)
  86.                 {
  87.                         TH0=A[C[p][0]*12+C[p][1]]>>8;
  88.                         TL0=A[C[p][0]*12+C[p][1]]&0xFF;
  89.                         TR0=1;
  90.                 }
  91.                 else
  92.                 {
  93.                         TH0=0;
  94.                         TL0=0;
  95.                         TR0=0;
  96.                         OUT=1;
  97.                 }
  98.                 t++;
  99.                 if(t==C[p][2])
  100.                 {
  101.                         t=0;
  102.                         p++;
  103.                         if(P==sizeof(C)/3)
  104.                                 p=0;
  105.                 }
  106.         }
  107.         d++;
  108. }
复制代码


DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:487
  • 最近打卡:2025-07-05 00:21:01
已绑定手机

81

主题

5284

回帖

9477

积分

超级版主

DebugLab

积分
9477
发表于 前天 15:42 | 显示全部楼层
程序文件:
0.hex (6.73 KB, 下载次数: 1)

点评

极乐净土?  详情 回复 发表于 前天 19:11
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:477
  • 最近打卡:2025-07-05 11:06:31
已绑定手机

38

主题

2254

回帖

2822

积分

荣誉版主

积分
2822
发表于 前天 19:11 | 显示全部楼层

极乐净土?

点评

正确  详情 回复 发表于 昨天 09:00
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:487
  • 最近打卡:2025-07-05 00:21:01
已绑定手机

81

主题

5284

回帖

9477

积分

超级版主

DebugLab

积分
9477
发表于 昨天 09:00 | 显示全部楼层

正确
DebugLab
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-7-5 14:37 , Processed in 0.131747 second(s), 105 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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