我正在尝试使用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;
}

最佳答案

我已经很长时间没有编程8051的设备了,但是我要做的是:

1.a.弄清楚是否不会退出的tone()

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

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


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

关于c - 8051上声音的持续时间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34113435/

10-09 19:54