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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 298|回復: 12
打印 上一主題 下一主題
收起左側

高手看看15W408單片機+CH7003代碼為什么不成功

[復制鏈接]
跳轉到指定樓層
樓主
ID:33548 發表于 2025-7-13 11:44 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
用幾個按鍵連接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
            }
        }
    }
}   

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:230500 發表于 2025-7-13 14:11 | 只看該作者
你的程序,EA=1 好像沒有看到, 總中斷沒有打開,串口是不工作的;  一般調試,第一步就是借助串口工具,;  1; 用串口工具驗證你的單片機串口傳的數據是否正確, 2; 用串口工具給語音芯片發數據看看是否受控, 可以驗證語音電路是否工作; 都驗證完了后再聯調;   以后你就會發現, 不管調試什么 串口打印 檢查驗證數據 是個非常方便和必須的方式; 能節省很多很多時間 少走很多彎路。
回復

使用道具 舉報

板凳
ID:1152291 發表于 2025-7-13 15:03 | 只看該作者
你好哦可以回我嘛我是可以給你解答的哦。我可以給你解答的哦。首先你如果是進行串口收發程序的時候時,你是可以使得語音芯片接受到信息的哦,可以使得你接受到的芯片的東西的語音傳達到你的單片機上面的哦。這樣一來你其實就是可以接收到你傳達的芯片的。可以使得你獲得的東西更加的多。
回復

使用道具 舉報

地板
ID:33548 發表于 2025-7-13 17:47 | 只看該作者
a399288395 發表于 2025-7-13 14:11
你的程序,EA=1 好像沒有看到, 總中斷沒有打開,串口是不工作的;  一般調試,第一步就是借助串口工具,; ...

添加了EA=1;也不行
回復

使用道具 舉報

5#
ID:33548 發表于 2025-7-13 17:48 | 只看該作者
單片機重購 發表于 2025-7-13 15:03
你好哦可以回我嘛我是可以給你解答的哦。我可以給你解答的哦。首先你如果是進行串口收發程序的時候時,你是 ...

語音芯片用串口調試正常,關鍵是單片機發不出數據
回復

使用道具 舉報

6#
ID:33548 發表于 2025-7-13 19:10 | 只看該作者
掉進STC15W408AS沒有定時器1這個大坑里了!歐克了
回復

使用道具 舉報

7#
ID:69038 發表于 2025-7-13 20:18 | 只看該作者
串口初始化不行:

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

我也不知道你的步驟是不是少了什么?
回復

使用道具 舉報

8#
ID:33548 發表于 2025-7-13 20:41 | 只看該作者
本帖最后由 cjtdz 于 2025-7-14 09:48 編輯

掉進STC15W408AS沒有定時器1坑里了,把波特率定時器1換成定時器2,OK了。
回復

使用道具 舉報

9#
ID:774370 發表于 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. }
復制代碼
回復

使用道具 舉報

10#
ID:33548 發表于 2025-7-13 21:29 | 只看該作者
jintaiyang 發表于 2025-7-13 20:48
串口中斷沒有開,總中斷沒有開。

不需要的,只要把定時器1換成定時器2就可以了。因為STC15W408AS沒有定時器1.
回復

使用道具 舉報

11#
ID:654797 發表于 2025-7-13 21:47 | 只看該作者
你好像沒將ES置1,ES是串口中斷,你只將EA置1不行的,EA是總中斷,ES是串口中斷,你得將EA同ES同時置1
回復

使用道具 舉報

12#
ID:654797 發表于 2025-7-13 21:49 | 只看該作者
a399288395 發表于 2025-7-13 14:11
你的程序,EA=1 好像沒有看到, 總中斷沒有打開,串口是不工作的;  一般調試,第一步就是借助串口工具,; ...

他好像沒打開串口中斷,就是那個ES沒有置1
回復

使用道具 舉報

13#
ID:33548 發表于 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了。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本少妇做爰全过程毛片 | 亚洲精品一区二三区不卡 | 在线午夜视频 | 成人网页| 午夜免费av | 91精品免费 | 欧美成人三级 | 这里只有精品视频在线观看 | 日韩精品免费视频 | 国产调教视频 | 可以看av的网站 | 成人三级小说 | 影音先锋中文字幕在线 | 日本亚洲精品 | 青青操影院| 超碰成人网 | 亚洲一区在线看 | 视频一区中文字幕 | 成人激情片 | 欧美黄色片 | 四虎影院网站 | 久久久精品一区二区三区 | 国产激情在线观看 | 国产黄a三级 | 成人免费视频观看 | av日韩在线播放 | 在线看黄色片 | av黄色片 | 天堂网中文 | 国产午夜精品福利 | 中文字幕免费在线看线人动作大片 | 一级黄片毛片 | 国产美女视频网站 | 亚洲综合三区 | 成人在线免费观看网站 | 欧美理论片在线观看 | 国产一区二区在线观看视频 | 这里都是精品 | 日韩在线精品视频 | 中文毛片| 国产成年妇视频 |