久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 高手看看15W408單片機+CH7003代碼為什么不成功 [打印本頁]

作者: cjtdz    時間: 2025-7-13 11:44
標題: 高手看看15W408單片機+CH7003代碼為什么不成功
用幾個按鍵連接STC15W408AS,控制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
            }
        }
    }
}   


作者: a399288395    時間: 2025-7-13 14:11
你的程序,EA=1 好像沒有看到, 總中斷沒有打開,串口是不工作的;  一般調試,第一步就是借助串口工具,;  1; 用串口工具驗證你的單片機串口傳的數據是否正確, 2; 用串口工具給語音芯片發數據看看是否受控, 可以驗證語音電路是否工作; 都驗證完了后再聯調;   以后你就會發現, 不管調試什么 串口打印 檢查驗證數據 是個非常方便和必須的方式; 能節省很多很多時間 少走很多彎路。
作者: 單片機重購    時間: 2025-7-13 15:03
你好哦可以回我嘛我是可以給你解答的哦。我可以給你解答的哦。首先你如果是進行串口收發程序的時候時,你是可以使得語音芯片接受到信息的哦,可以使得你接受到的芯片的東西的語音傳達到你的單片機上面的哦。這樣一來你其實就是可以接收到你傳達的芯片的?梢允沟媚惬@得的東西更加的多。
作者: cjtdz    時間: 2025-7-13 17:47
a399288395 發表于 2025-7-13 14:11
你的程序,EA=1 好像沒有看到, 總中斷沒有打開,串口是不工作的;  一般調試,第一步就是借助串口工具,; ...

添加了EA=1;也不行
作者: cjtdz    時間: 2025-7-13 17:48
單片機重購 發表于 2025-7-13 15:03
你好哦可以回我嘛我是可以給你解答的哦。我可以給你解答的哦。首先你如果是進行串口收發程序的時候時,你是 ...

語音芯片用串口調試正常,關鍵是單片機發不出數據
作者: cjtdz    時間: 2025-7-13 19:10
掉進STC15W408AS沒有定時器1這個大坑里了!歐克了
作者: zhuls    時間: 2025-7-13 20:18
串口初始化不行:

先設串口工作模式
再設定時器工作模式,
再設定時器分頻
開串口中斷
開總中斷
開定時器計數

我也不知道你的步驟是不是少了什么?
作者: cjtdz    時間: 2025-7-13 20:41
本帖最后由 cjtdz 于 2025-7-14 09:48 編輯

掉進STC15W408AS沒有定時器1坑里了,把波特率定時器1換成定時器2,OK了。
作者: jintaiyang    時間: 2025-7-13 20:48
串口中斷沒有開,總中斷沒有開。
  1. void Uart1_Isr(void) interrupt 4
  2. {
  3.         if (TI)                                //檢測串口1發送中斷
  4.         {
  5.                 TI = 0;                        //清除串口1發送中斷請求位
  6.         }
  7.         if (RI)                                //檢測串口1接收中斷
  8.         {
  9.                 RI = 0;                        //清除串口1接收中斷請求位
  10.         }
  11. }

  12. void Uart1_Init(void)        //9600bps@11.0592MHz
  13. {
  14.         SCON = 0x50;                //8位數據,可變波特率
  15.         AUXR &= 0xBF;                //定時器時鐘12T模式
  16.         AUXR &= 0xFE;                //串口1選擇定時器1為波特率發生器
  17.         TMOD &= 0x0F;                //設置定時器模式
  18.         TL1 = 0xE8;                        //設置定時初始值
  19.         TH1 = 0xFF;                        //設置定時初始值
  20.         ET1 = 0;                        //禁止定時器中斷
  21.         TR1 = 1;                        //定時器1開始計時
  22.         ES = 1;                                //使能串口1中斷
  23. }
復制代碼

作者: cjtdz    時間: 2025-7-13 21:29
jintaiyang 發表于 2025-7-13 20:48
串口中斷沒有開,總中斷沒有開。

不需要的,只要把定時器1換成定時器2就可以了。因為STC15W408AS沒有定時器1.
作者: vscos    時間: 2025-7-13 21:47
你好像沒將ES置1,ES是串口中斷,你只將EA置1不行的,EA是總中斷,ES是串口中斷,你得將EA同ES同時置1
作者: vscos    時間: 2025-7-13 21:49
a399288395 發表于 2025-7-13 14:11
你的程序,EA=1 好像沒有看到, 總中斷沒有打開,串口是不工作的;  一般調試,第一步就是借助串口工具,; ...

他好像沒打開串口中斷,就是那個ES沒有置1
作者: cjtdz    時間: 2025-7-24 22:15
vscos 發表于 2025-7-13 21:47
你好像沒將ES置1,ES是串口中斷,你只將EA置1不行的,EA是總中斷,ES是串口中斷,你得將EA同ES同時置1

是STC15W408AS單片機,一個大坑:沒有定時器1的問題,把代碼中的定時器1改成定時器2就OK了。




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产精品一区在线播放 | 五月婷婷丁香花 | www.一区二区 | 国产一区一区 | 成人精品视频 | 一区在线观看 | 免费在线播放av | 亚洲精品免费视频 | 国产永久在线 | 久久96 | 久久日韩精品 | 亚洲一级黄色 | 亚洲欧美天堂 | 国产精品国产三级国产 | 神马午夜视频 | 欧美a级黄色片 | 久久久成人免费视频 | www一级片 | 精品视频国产 | www.成人网 | 波多野结衣之双调教hd | 天天色影院 | 日韩亚洲一区二区 | 国产免费自拍视频 | 91精品久久久久久久久 | 欧美日韩国产成人 | 久久最新网址 | 欧美午夜精品久久久久免费视 | 欧美日韩在线免费观看 | 亚洲欧美天堂 | 狠狠躁夜夜躁人爽 | 五月天一区二区三区 | 国产欧美精品一区 | 日韩大片在线观看 | 国产精品麻豆视频 | www.麻豆av| h片在线观看免费 | 午夜精品久久 | 精品一区二区三区在线观看 | 久久久精品 | 免费看黄色网址 |