c - 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, 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() 的反汇编),如果不是,编译器会优化 check out ,并且需要修复(例如将 TF0 声明为 volatile )

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

  • 编写一个汇编例程来浪费 N 个 CPU 时钟,在循环中使用最慢的指令(MUL 或 DIV 是最慢的吗?)或简单地重复 M 次,这样你就会得到 10 毫秒的延迟或类似的东西,编写一个 C 函数根据需要多次调用该例程(例如 1 秒 100 次)。 (您可以在这里使用计时器,但这可能是最简单的)
  • 关于c - 8051 上的声音持续时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34113435/

    相关文章:

    c - if 语句中的自增运算符

    R - 将空间频率数据绘制为矩阵

    c - 在 C 中将字符串从代码存储器存储到 IDATA 存储器 (8051)

    c++ - 编译时数据段太大

    c - Nuvoton N76E003 上的 I2C 实现

    c - lua中的动态ffi函数调用

    c - 如何确保第二个 fork 在失败、管道和 dup2 后不会继续

    c - 如何在不使用文本框的情况下在 gtk 小部件中显示文本?

    android - 将实时音频与Android中录制的音频进行比较

    JavaScript 数组频率测量对象属性