基于pic 18f4550的比特值发音

更新2

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

我需要检索.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; } 

对原始问题的回答:你要求的“红色频率,以比特表示”是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位DAC设计?如果是这样的话? ,这里有进一步的说明,但这是非常雄心勃勃的)。

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

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

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

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

根据您在评论中所说的内容,听起来您希望从像"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在他的回答中所说,这与实际生成口语单词的音频波形无关。