论坛风格切换切换到宽版
  • 2278阅读
  • 5回复

用89s51做了个音频振荡器,遇到一个奇怪的现象 [复制链接]

上一主题 下一主题
离线bd9cr
 
发帖
1202
只看楼主 倒序阅读 0楼 发表于: 2007-07-16
初学51遇到不能解释的问题,求教大家.
无意中试下面程序:
#include<at89x51.h>
void main(void)
        {
        p1_4=!p1_4;
        }


p14居然输出声音不错的音频来.我试了好久在主程序加上延时音频变低.但是频率最高不能高过上述没有延时的频率.
主程序没有循环啊,为什么会有音频.
我只能找个说服自己的理由:是不是为了方便c语言默认取反,就输出一个稳定的音频,作为提示.

还是按照自己的想法变了一个,也能正常输出音频,频率可以正常改变.
#include<at89x51.h>
void delay(unsigned int m)//延时
  {
      unsigned int k=5*m;
  while(--k);
      }
void main(void)//主程序
  {
            unsigned char i=8;
        p2=0xff;
              while(1)
            {
            if(p2_0==0)//p20加频率
            {i--;delay(1000);p3_7=!p3_7;}
            else if(p2_1==0)//p21减少频率
            {i++;delay(1000);p3_7=!p3_7;}
            delay(i);
        p1_4=!p1_4;
            }
            }
离线BG7TBL
发帖
2965
只看该作者 1楼 发表于: 2007-07-16
主程序可能从0k一直运行到64k,然后返回,所以有声音了!
离线bd1es
发帖
2096
只看该作者 2楼 发表于: 2007-07-16
对!是程序跑飞了。在主函数最后加一行“while(1);”就没事了。
离线bd9cr
发帖
1202
只看该作者 3楼 发表于: 2007-07-17
主程序不循环,执行完取反指令,后面没有指令.应该停住才对吗?
难道单片机,不能停下来吗?要么跑飞,要么无限循环.要么原地踏步走.
有点不可以理解
离线bd9cr
发帖
1202
只看该作者 4楼 发表于: 2007-07-17
'
主程序可能从0k一直运行到64k,然后返回,所以有声音了!
'
s51 的rom 是4k,ram 128b
如果跑一圈因该4k对吗?
离线FMer
发帖
2549
只看该作者 5楼 发表于: 2007-07-17
p1_4=!p1_4;
改为
p1_4~=p1_4;
较好

简单输出可以象这样:
main()
{
  for(;;)
  {
    p1_4~=p1_4;
    //此处加入需要的延时程序
  }
}