基于pic 18f4550的比特值发音

时间:2011-05-02 16:46:41

标签: c microcontroller pic microchip

更新2

我想在我的pic 18f4550上制作一个可以播放声音(可以说是红色,绿色和蓝色)的程序,有一个扬声器连接到picdem,该部分工作正常,我用微芯片版本6.83编写了以下程序使用C编译器。

当我说红色时(我有一个位模式),我需要检索.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;
}

3 个答案:

答案 0 :(得分:2)

回答原始问题: 您要求的“红色频率,以比特为单位”为480到405 THz,因此位数为111100000到110010101.但您也说“其定义为纳米”,因此为630到740nm,即1001110110到1011100100在二进制。如果您想使用波形驱动扬声器,则需要采样音频波形或语音合成芯片。在任何一种情况下,我给你的二进制值与“红色”这个词的声音无关,这个词需要更多的比特来表示任何可听见的声音(例如,在16 kbps PCM时最小0.5秒将是8 kbp = 1千字节。

另一种表示二进制颜色的方法是RGB系统,其中红色为0xFF0000,二进制为111111110000000000000000。

回答有关如何获取wav文件中的位的问题 首先,我们必须确定wav文件的存储位置。它可以作为const数组存储在PIC中,也可以存储在外部存储器中,您必须通过某种串行或并行总线读取它。由于PIC18F4550具有32k字节的闪存,如果你的程序相当小,那么3个wav文件可能还有足够的空间。

然后我们必须确定硬件将如何播放声音。您似乎试图通过移位来从位端口发送字节值。但为了实现这一目标,我们需要更多地了解硬件,因为您无法将扬声器连接到位端口并期望声音输出(无论如何还没有进一步处理PCM信号 - 您是否正在尝试1 bit DAC设计?如果是这样,有further notes here,但这是非常雄心勃勃的。)

除此之外,wav文件中的位值将通过获取文件中的每个样本(8位?)并通过按位AND操作移位掩码值0x01来获得,以确定设置了哪些位。 / p>

答案 1 :(得分: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在他的回答中所说,这与实际生成口语单词的音频波形无关。

答案 2 :(得分:1)

构成某些英文字母编码的二进制值与构成某人说出编码字的声音的采样版本的PCM值之间绝对没有相关性。

如果您想播放某人说“红色”的声音,您首先必须对其进行采样并将结果位存储在某处,然后以适当的比特率将它们输出到您的输出。采样的声音可能比“红色”的ASCII表示(24位)大得多。

有集成芯片包含这样的样本,并且实际上可以在给定ASCII编码字的情况下生成声音,例如this one。除非您将这样的芯片连接到MCU,否则您的问题没有多大意义。