2011-05-02 53 views
-6

更新2

我想打一個程序,可以播放聲音(可以說紅色,綠色和藍色)在我的PIC 18F4550值有連接的揚聲器到picdem,那部分工作正常,我用C編譯器編寫了帶有微芯片版本6.83的以下程序。發音基於位色彩與PIC 18F4550

我需要檢索.wav文件的比特值,當我說紅(這有一個位模式)。 我的權利問題,如何獲得我的.wav文件的位值。

void main (void) 
{ 

    TRISD = 0x00;    // PORTD als uitgang 
    TRISB = 0b00110000;   // RB4 en RB5 als ingang 
    TRISA = 0x00;    // RA output 

    RCONbits.IPEN = 0; // interrupts 
    INTCONbits.GIE = 1; 
    INTCONbits.RBIE = 1; 

    while(1) 
    { 
     _asm sleep _endasm 
    } 
} 

#pragma interrupt ISR 
void ISR (void) 
{ 
    int red[] = {bit values off sound red???}; 
    int blue[] = {bit values off sound green???}; 
    int green[] = {bit values off sound blue???}; 


    if (INTCONbits.RBIF==1) 
    { 
     if(PORTBbits.RB5==0)  // S3 pressed? 
     { 
      int i = 0; 
      int b; 
      do { 
       LATAbits.LATA2 = rood[i]; 
       LATDbits.LATD1 ^= 1; 
       b = 0; 

       //do-while voor de frequentie (1500 is de freq) 
       do { 
        b++; 
       }while(b <= 2000); 

       i++; 
      }while(rood[i] <= 50); 

      //LATDbits.LATD1 ^= 1;  // D2 togglen 

     } 

    } 
    INTCONbits.RBIF = 0; 
} 
+0

不,你的問題並不十分清楚。所以你想播放預先錄製的單詞?您需要找到一些方法來存儲波形數據。 – 2011-05-02 16:52:08

+0

不,我只想發音紅色,綠色或藍色。但紅色必須是位值,其他兩種顏色相同。 – projecten1 2011-05-02 16:53:19

+0

@user:是的,所以最大的問題是:你如何獲得PIC來播放預先錄製的音頻波形? – 2011-05-02 16:54:40

回答

1

根據你已經在你的評論說,這聽起來像你想從像"red"字符串的ASCII表示獲得比特流。你可以通過遍歷字符串的每一個字符,然後在每個位位置循環:

const char *str = "I hate programming"; 

// Loop over each character 
for (i = 0; i < strlen(str); i++) 
{ 
    // Loop over each bit 
    for (j = 0; j < 8; j++) 
    { 
     // Extract bit #j of character i, using bit-shift and mask 
     bit = (str[i] >> j) & 1; 

     // bit will be 0 or 1, so do something with it here 
    } 
} 

如果你想在相反的順序每個字符位數,那麼就顛倒內的順序( j)循環。

請注意,由於@unwind在他的回答中表示,這與實際生成無關,用於說出單詞的音頻波形。

+0

我更新了我的問題。希望現在更清楚! – projecten1 2011-05-02 18:07:00

+0

讓我的解釋完全錯誤。抱歉給你帶來不便! – projecten1 2011-05-04 13:37:50

1

有二進制值組成的編碼爲英語的一些字母和PCM值,將彌補一個人的聲音的採樣版本稱編碼字之間絕對沒有任何關係。

如果要播放一個人的聲音說:「紅」,你首先要品嚐它和地方存儲所產生的比特,然後在相應的比特率餵它們到您的輸出。採樣聲音可能比「紅色」(24位)的ASCII表示大得多。

存在包含這樣的樣品並且實際上可以給出的ASCII編碼的字,一個例子是this one產生聲音集成芯片。除非你有這樣的芯片連接到你的MCU,否則你的問題沒有多大意義。

+0

我更新了我的問題。希望現在更清楚! – projecten1 2011-05-02 18:13:57

+0

讓我的解釋完全錯誤。抱歉給你帶來不便。 – projecten1 2011-05-04 13:37:41

2

回答到原來的問題: 的「紅頻率,代表比特」你問的是480到405赫茲,所以在位是111100000到110010101.但你也說:「它在納米定義」 ,所以630到740nm是二進制的1001110110到1011100100。如果您想用波形驅動揚聲器,則需要採樣音頻波形或語音合成芯片。在任何一種情況下,我給出的二進制值與「紅色」這個詞的聲音無關,這需要更多的位來表示任何可聽見的聲音(例如16kbps時最小0.5秒PCM將是8kbp = 1千字節)。

表示二進制顏色的另一種方法是RGB系統,其中,紅色會爲0xFF0000,這在二進制111111110000000000000000。

回答關於如何獲取wav文件中的位的問題 首先,我們必須確定wav文件的存儲位置。它可以作爲一個常量數組存儲在PIC中,也可以存儲在一個外部存儲設備中,在那裏你必須通過某種串行或並行總線讀取它。由於PIC18F4550具有32k字節的閃存,如果程序非常小,則可能有足夠的空間存放3個wav文件。

接着我們來確定硬件將如何播放聲音。您似乎試圖通過移位來從位端口發送一個字節值。但爲了正確使用,我們需要了解更多關於硬件的信息,因爲您無法將揚聲器連接到某個位端口並期望聲音輸出(無論如何,無論如何不會進一步處理PCM信號 - 您是否嘗試設計一個1 bit DAC?如果是這樣,那麼是further notes here,但這是相當雄心勃勃的)。

除此之外,wav文件中的位值將通過獲取文件中的每個採樣(8位?)並通過按位與運算將掩碼值0x01移位來確定哪些位已設置。

+0

好吧,我更新我的問題。我的解釋完全錯了。抱歉給你帶來不便! – projecten1 2011-05-04 13:37:17

+0

我是否真的在pic18f4550中加載.wav文件?我只想要紅色的位模式。有沒有辦法檢索這個,而不需要在picdem中加載wave文件? – projecten1 2011-05-04 14:58:55

+0

@ user718910從哪裏檢索它?你的電腦?你的電腦的硬盤?存儲卡? – Martin 2011-05-04 15:35:05