找回密码
 立即注册
查看: 30|回复: 7

高手看看15W408+CH7003代码为什么不成功

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:193
  • 最近打卡:2025-07-13 06:40:19

132

主题

174

回帖

427

积分

中级会员

积分
427
发表于 10 小时前 | 显示全部楼层 |阅读模式
用几个按键连接15W408AS,控制CH7003语音芯片,播放几段语音,为什么不成功,哪里出了问题?


以下是全部代码:

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

// 使用sbit定义按键引脚
sbit KEY1 = P3^2;  // 按键1接P3.2
sbit KEY2 = P3^3;  // 按键2接P3.3
sbit KEY3 = P3^4;  // 按键3接P3.4
sbit KEY4 = P3^5;  // 按键4接P3.5
sbit KEY5 = P3^6;  // 按键5接P3.6

// CH7003协议定义
#define START_CODE 0x7E
#define END_CODE   0xEF
#define CMD_PLAY   0x13

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

// 串口初始化
void UART_Init() {
    SCON = 0x50;    // 8位数据,可变波特率
    TMOD |= 0x20;   // 定时器1模式2
    TH1 = 0xFD;     // 9600bps
    TL1 = 0xFD;
    TR1 = 1;        // 启动定时器
}

// 发送1字节
void UART_SendByte(unsigned char dat) {
    SBUF = dat;
    while (!TI);
    TI = 0;
}

// 发送播放指令
void CH7003_Play(unsigned char track) {
    UART_SendByte(START_CODE);
    UART_SendByte(CMD_PLAY);
    UART_SendByte(0x00);  // 数据长度高字节
    UART_SendByte(0x02);  // 数据长度低字节
    UART_SendByte(0x00);  // 曲目号高字节
    UART_SendByte(track); // 曲目号低字节
    UART_SendByte(END_CODE);
}

void main() {
    // 配置所有按键IO为输入(P3.2-P3.6)
    P3M0 &= 0x83;  // 0b10000011,清空中间5位
    P3M1 &= 0x83;  // 启用内部上拉
   
    UART_Init();  // 初始化串口
   
    while (1) {
        // 检测按键1
        if (KEY1 == 0) {
            delay_ms(20);  // 消抖
            if (KEY1 == 0) {
                while (KEY1 == 0);  // 等待释放
                CH7003_Play(1);  // 播放曲目1
            }
        }
        
        // 检测按键2
        if (KEY2 == 0) {
            delay_ms(20);
            if (KEY2 == 0) {
                while (KEY2 == 0);
                CH7003_Play(2);  // 播放曲目2
            }
        }
        
        // 检测按键3
        if (KEY3 == 0) {
            delay_ms(20);
            if (KEY3 == 0) {
                while (KEY3 == 0);
                CH7003_Play(3);  // 播放曲目3
            }
        }
        
        // 检测按键4
        if (KEY4 == 0) {
            delay_ms(20);
            if (KEY4 == 0) {
                while (KEY4 == 0);
                CH7003_Play(4);  // 播放曲目4
            }
        }
        
        // 检测按键5
        if (KEY5 == 0) {
            delay_ms(20);
            if (KEY5 == 0) {
                while (KEY5 == 0);
                CH7003_Play(5);  // 播放曲目5
            }
        }
    }
}   
回复

使用道具 举报 送花

3

主题

406

回帖

-477

积分

等待验证会员

积分
-477
发表于 10 小时前 | 显示全部楼层
您提供的代码存在多处问题,导致无法成功控制CH7003语音芯片。以下是详细分析及修改建议:

1. 头文件缺失:代码中缺少必要的头文件#include ,该文件定义了STC15W408AS单片机的寄存器和位操作。

2. 函数定义不完整:CH7003Play函数在发送完CMDPLAY后未继续发送track参数,且未发送ENDCODE,导致协议不完整。

3. 串口初始化不正确:SCON = 0x50设置为8位数据、可变波特率,但未启用接收功能,可能导致接收异常。

4. 延时函数不准确:delayms函数依赖于循环次数,实际延时时间可能因系统时钟不同而变化,建议使用定时器实现更精确的延时。

5. 按键控制逻辑缺失:代码中未包含按键检测和处理逻辑,无法实现通过按键控制播放的功能。

6. 通信协议错误:CH7003的通信协议要求发送完整的帧结构(起始码、命令字节、数据字节、校验码、结束码),当前代码仅发送了部分字段,导致通信失败。

修改后的代码示例(基于上述问题修正):
  1. c
  2. include
  3. // CH7003协议定义
  4. define STARTCODE 0x7E    // 起始码
  5. define ENDCODE   0xEF     // 结束码
  6. define CMDPLAY   0x13      // 播放命令
  7. // 延时函数
  8. void delayms(unsigned int ms) {
  9.     unsigned int i, j;
  10.     for (i = 0; i < ms; i++)
  11.         for (j = 0; j < 120; j++);
  12. }
  13. // 串口初始化
  14. void UARTInit() {
  15.     SCON = 0x50;    // 8位数据,可变波特率
  16.     TMOD |= 0x20;   // 定时器1模式2
  17.     TH1 = 0xFD;     // 9600bps
  18.     TL1 = 0xFD;
  19.     TR1 = 1;        // 启动定时器
  20.     ES = 1;         // 使能串口中断
  21.     EA = 1;         // 全局中断使能
  22. }
  23. // 发送1字节
  24. void UARTSendByte(unsigned char dat) {
  25.     SBUF = dat;
  26.     while (!TI);
  27.     TI = 0;
  28. }
  29. // 发送播放指令
  30. void CH7003Play(unsigned char track) {
  31.     UARTSendByte(STARTCODE);
  32.     UARTSendByte(CMDPLAY);
  33.     UARTSendByte(track);       // 发送音轨号
  34.     UARTSendByte(0x00);        // 校验码(示例值)
  35.     UARTSendByte(ENDCODE);
  36. }
  37. // 按键检测
  38. void KeyScan() {
  39.     static unsigned char keyflag = 0;
  40.     if (P30 == 0) {            // 假设按键连接至P3.0
  41.         delayms(10);           // 消抖
  42.         if (P30 == 0) {
  43.             if (!keyflag) {
  44.                 keyflag = 1;
  45.                 CH7003Play(0x01); // 播放第1段语音
  46.             }
  47.         }
  48.     } else {
  49.         keyflag = 0;
  50.     }
  51. }
  52. void main() {
  53.     UARTInit();
  54.     while (1) {
  55.         KeyScan();
  56.     }
  57. }
复制代码

注意事项:
确保CH7003与STC15W408AS的通信电平匹配,必要时使用电平转换电路。
根据实际硬件调整按键连接引脚和延时时间。
校验码需根据CH7003的协议规范计算,此处仅为示例。

以上修改应能解决通信失败的问题,确保按键控制播放功能正常工作。

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:235
  • 最近打卡:2025-07-13 11:59:19
已绑定手机

77

主题

2125

回帖

4783

积分

荣誉版主

无情的代码机器

积分
4783
发表于 10 小时前 | 显示全部楼层
既然是串口控制,分两部分调试嘛,mcu串口出数据是否正常,用串口工具调语音芯片是否正常。
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:484
  • 最近打卡:2025-07-13 00:55:39
已绑定手机

38

主题

2273

回帖

2880

积分

荣誉版主

积分
2880
发表于 10 小时前 | 显示全部楼层
先单独用串口助手调试单片机和语音芯片两部分,都符合协议规范并调通功能后,再对接联调
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:495
  • 最近打卡:2025-07-13 06:00:00
已绑定手机

81

主题

5345

回帖

9631

积分

超级版主

DebugLab

积分
9631
发表于 10 小时前 | 显示全部楼层
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:193
  • 最近打卡:2025-07-13 06:40:19

132

主题

174

回帖

427

积分

中级会员

积分
427
发表于 4 小时前 | 显示全部楼层
erci*** 发表于 2025-7-13 11:59
既然是串口控制,分两部分调试嘛,mcu串口出数据是否正常,用串口工具调语音芯片是否正常。 ...

串口调试语音芯片能正常工作,关键是单片机发不出数据
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:235
  • 最近打卡:2025-07-13 11:59:19
已绑定手机

77

主题

2125

回帖

4783

积分

荣誉版主

无情的代码机器

积分
4783
发表于 4 小时前 | 显示全部楼层
你和我踩了同一个坑:
STC15W408AS没有定时1,串口不能选定时器1作波特率发生器!!!
另外建议后续项目新建工程使用AiCube生成代码。

截图202507131801212523.jpg
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:193
  • 最近打卡:2025-07-13 06:40:19

132

主题

174

回帖

427

积分

中级会员

积分
427
发表于 3 小时前 | 显示全部楼层
erci*** 发表于 2025-7-13 18:00
你和我踩了同一个坑:
STC15W408AS没有定时1,串口不能选定时器1作波特率发生器!!!
另外建议后续项目新 ...

你要不说,我还一直在这坑里往外爬。换成定时器2做波特率发生器,OK了
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-7-13 22:17 , Processed in 0.119575 second(s), 98 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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