C 8051上的声音持续时间

C 8051上的声音持续时间,c,frequency,8051,C,Frequency,8051,我正在尝试用8051上的定时器制作一首短曲。我试图发送一个指定频率的方波来创建音符。 然而,在我当前的代码中,我得到的只是一个无限音符,它从未停止播放。如果您能帮助您确定如何停止便笺并创建持续时间函数,我们将不胜感激 #include<reg932.h> sbit speaker=P1^7; void tone(unsigned char, unsigned char); void main() { P1M1 = 0; P1M2 = 0; tone(0xC8,

我正在尝试用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;
}
#包括
sbit扬声器=P1^7;
无效音调(无符号字符、无符号字符);
void main()
{
P1M1=0;
P1M2=0;
音调(0xC8,0xF3);
}
无效音调(无符号字符高值,无符号字符低值)
{
TMOD=0x01;
TL0=低值;
TH0=高值;
TR0=1;
而(TF0==0);
扬声器=0;
TR0=0;
TF0=0;
}

我已经很久没有为8051的设备编程了,但我要做的是:

1.a。找出是不是tone()永远不存在

1.b。如果是,我将确保while循环确实在那里(请参阅tone()的反汇编),如果不是,编译器将优化签出并需要修复(例如,将TF0声明为volatile)

1.c。查看检查是否正确(正确寄存器中的正确位等)

  • 编写一个汇编例程以浪费N个CPU时钟,在循环中使用最慢的指令(MUL或DIV是最慢的吗?),或者简单地重复M次,以便获得10毫秒的延迟或类似的结果,编写一个C函数以根据需要多次调用该例程(例如,100次,1秒)。(您可以在此处使用计时器,但这可能是最简单的)

  • 你想产生多少赫兹的频率,P1M1和P1M2是什么?我可以知道吗?在主循环中尝试while(1){speaker=~speaker;tone(0xC8,0xF3);}从main中删除其他内容为什么
    main()
    不包含
    while(1)
    loop(无限循环)??你认为当执行到主程序的末尾时会发生什么??您不认为
    tone()
    只执行一次,要生成正确的音调,您需要打开和关闭蜂鸣器/扬声器??为什么要为定时器中断编写轮询软件例程,而不编写中断子程序???为了找到上述问题的答案,您最终将成为一名更好的8051程序员