2015-12-06 2 views
0

Я пытаюсь создать короткую мелодию с использованием таймеров на 8051. Я пытаюсь отправить прямоугольную волну с заданной частотой для создания заметок. Однако, с моим текущим кодом, все, что я получаю, - это одна бесконечная нота, которая никогда не перестает играть. Любая помощь в выяснении того, как остановить заметку и создать функцию продолжительности, будет с благодарностью оценена.Продолжительность звука на 8051

#include<reg932.h> 
sbit speaker=P1^7; 
void tone(unsigned char, unsigned char); 
void main() 
{ 
    P1M1 = 0; 
    P1M2 = 0; 
    tone(0xC8, 0xF3); 
} 

void tone(unsigned char highval, unsigned char lowval) 
{ 
    TMOD=0x01; 
    TL0=lowval; 
    TH0=highval; 
    TR0=1; 
    while(TF0==0); 
    speaker=0; 
    TR0=0; 
    TF0=0; 
} 
+0

сколько Гц частоты вы пытаетесь сгенерировать и что такое P1M1 и P1M2? Могу я это узнать? –

+0

В основном цикле попробуйте (1) {speaker = ~ speaker; тон (0xC8, 0xF3); } удалить другие вещи из основного –

+0

Почему 'main()' не содержит 'while (1)' loop (бесконечный цикл) ?? что, по-вашему, происходит, когда выполнение достигает конца основного? Разве вы не думаете, что 'tone()' будет выполняться только один раз и для генерации правильного тона, вам потребуется включить и выключить звуковой сигнал/динамик? Зачем писать процедуру опроса программного обеспечения для прерывания таймера и предпочитают не писать подпрограмму прерывания ??? _в преследовании, чтобы найти ответы на вышеуказанные вопросы, вы закончите как лучший программист 8051_ – madD7

ответ

0

Я не запрограммированы устройства 8051 в течение длительного времени, но вот что я хотел бы сделать:

1.a. выясните, является ли это тон(), который никогда не выходит

1.b. если это так, я бы удостоверился, что цикл while действительно там (см. разборку tone()), если это не так, компилятор оптимизирует проверку и нуждается в исправлении (например, объявляя TF0 как энергозависимый)

1.c. проверьте правильность проверки (правый бит в правом регистре и т. д.)

  1. написать процедуру сборки для отходов N часов процессора, использовать самую медленную инструкцию (был MUL или DIV медленнее?) в цикле или просто повторяется M раз, поэтому вы получаете как задержка 10 мс или что-то еще, напишите функцию C, чтобы вызывать эту процедуру столько раз, сколько необходимо (например, 100 раз в течение 1 секунды). (Здесь вы можете использовать таймер, но это может быть самым простым)
Смежные вопросы