【问题标题】:pronounce a color based on the bits values with the pic 18f4550 [closed]使用 pic 18f4550 根据位值发音颜色 [关闭]
【发布时间】:2011-05-02 16:46:40
【问题描述】:

更新 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;
}

【问题讨论】:

  • 不,你的问题一点都不清楚。所以你想播放预先录制的单词?您需要找到一些方法来存储波形数据。
  • 不,我只想发音为红色、绿色或蓝色。但红色必须是位值,其他两种颜色相同。
  • @user:是的,所以最大的问题是:如何让 PIC 播放预先录制的音频波形?
  • 在这个链接上查看这个程序。这会将“文本”转换为他相等的位值。但我必须在他的相等位值中有'color => red'。 nickciske.com/tools/binary.php
  • @user:我真的不明白你要解释什么。你是说你想得到一个由 1 和 0 组成的数组,它们代表 ASCII 中的位,例如“红色”?

标签: c microcontroller pic microchip


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 好的,我更新我的问题。把我的解释完全错了。给您带来的不便深表歉意!
  • 我真的在 pic18f4550 中加载了 .wav 文件吗?我只想要红色的位模式。有没有办法在不加载 picdem 中的波形文件的情况下检索它?
  • @user718910 从哪里检索它?你的电脑?你电脑的硬盘?存储卡?
  • @Martin 和其他人。试着从字面上理解我的解释。 1) 我在 Windows 的“录音机”中说话,我说红色。 2) 将其转换为 .wav 文件(此步骤也可以是多余的)。 3) 从这个 .wav 文件中检索位值。 4) 在我的 C 程序中过去这些位。如果不读取 picdem 中的 .wav 文件或没有 PWM 信号,我不知道如何执行第 3 步。我的问题是,是否有反汇编 .wav 文件的程序?或者是给我声音红色位表示的工具?
  • @user718910 这是a program that does what you want,我在electronics.stackexchange.com上浏览this question时发现它。
【解决方案2】:

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

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

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

【讨论】:

  • 我的解释完全错了。很抱歉给您带来不便。
【解决方案3】:

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

【讨论】:

  • 我的解释完全错了。给您带来的不便深表歉意!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-01
  • 1970-01-01
  • 2021-07-18
  • 1970-01-01
  • 2013-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多