更新2
我想制作一个可以在我的图片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;
}
最佳答案
原始问题的答案: 你要求的“红色频率,以位表示”是480到405太赫兹,所以以位为单位是111100000到110010101。但你也说“它以纳米定义”,所以这是630到740nm,即1001110110到1011100100以二进制形式。如果您想用波形驱动扬声器,您需要样本音频波形或语音合成芯片。无论哪种情况,我给你的二进制值都与“红色”一词的声音无关,这需要更多的位来表示任何可听声音(例如,16 kbps PCM 下至少 0.5 秒将是 8 kbp = 1 KB)。
另一种用二进制表示颜色的方法是 RGB 系统,其中红色为 0xFF0000,二进制表示为 111111110000000000000000。
回答有关如何获取 wav 文件中的位的问题 首先我们必须确定 wav 文件的存储位置。它可以作为 const 数组存储在 PIC 中,或者存储在外部存储设备中,您必须通过某种串行或并行总线读取它。由于 PIC18F4550 有 32k 字节的闪存,如果您的程序相当小,则可能有足够的空间容纳 3 个 wav 文件。
然后我们必须确定硬件将如何播放声音。您似乎试图通过移位将字节值从位端口发送出去。但为了做到这一点,我们需要更多地了解硬件,因为您无法将扬声器连接到位端口并期望发出声音(无论如何都不能不进一步处理 PCM 信号 - 您是否正在尝试 1 bit DAC 设计?如果是这样,有 further notes here 但这是相当雄心勃勃的)。
除此之外,wav 文件中的位值可以通过获取文件中的每个样本(8 位?)并使用按位 AND 运算将掩码值 0x01 进行移位来确定设置了哪些位。
关于c - 根据图片 18f4550 的位值发音颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5859877/