标题: 给大家提供一个产生38k信号的程序,问一下其中的原理 [打印本页]

作者: hackerbc    时间: 2020-4-16 19:11
标题: 给大家提供一个产生38k信号的程序,问一下其中的原理
while(1)                            //38KHz脉冲,占空比5:26
         {
                  IR = 0;
                  if(TF0)break;
              if(TF0)break;
                  IR = 1;
                if(TF0)break;
                 if(TF0)break;
                 if(TF0)break;
                  if(TF0)break;
                 if(TF0)break;
                 if(TF0)break;
                 if(TF0)break;
                 if(TF0)break;
                 if(TF0)break;
                  if(TF0)break;
                 }
程序环境是stc89c51单片机,频率12M,对于这个程序我的推测是,IR=0这样的赋值语句用时1us,if(TF0)break这样的语句用时2us,然后while语句跳转到开头用时2us,有没有懂软件延时的大佬看一下我说的对不对?

作者: csmyldl    时间: 2020-4-16 21:13
不一定是这样,C语言通过编译转换成汇编语言的语句不是固定的
作者: 权威人物    时间: 2020-4-17 09:28
38KHz为1/38K约26us一个周期,占空比5:26则 5/(26+5)*26约为4us,根据你的程序大概就是IR=0的时间为4us,IR=1的时间为22us,这个程序没啥实际应用价值,一般用定时器做,不过对于stc89c51单片机要使用定时器估计速度跟不上。
作者: wulin    时间: 2020-4-17 09:54
与这样写等效
        while(1)
        {
                IR = 0;
                _nop_ ();
                _nop_ ();
                _nop_ ();
                _nop_ ();
                IR = 1;
                _nop_ ();
                _nop_ ();
                _nop_ ();
                _nop_ ();
                _nop_ ();
                _nop_ ();
                _nop_ ();
                _nop_ ();
                _nop_ ();
                _nop_ ();
                _nop_ ();
                _nop_ ();
                _nop_ ();
                _nop_ ();
                _nop_ ();
                _nop_ ();
                _nop_ ();
                _nop_ ();
                _nop_ ();
                _nop_ ();
                _nop_ ();
                _nop_ ();
                _nop_ ();
        }
作者: 红尘有你    时间: 2020-4-17 10:51
while(1)                            //38KHz脉冲,占空比5:26
         {
                  IR = 0;
                  if(TF0)break;
              if(TF0)break;
                  IR = 1;
                if(TF0)break;
                 if(TF0)break;
                 if(TF0)break;
                  if(TF0)break;
                 if(TF0)break;
                 if(TF0)break;
                 if(TF0)break;
                 if(TF0)break;
                 if(TF0)break;
                  if(TF0)break;
                 }
这个程序  if(TF0)break;重复毫无意义。TF0是定时器0的标志位,当产生溢出时,硬件自动置1,要软件清零的。深度怀疑这个可以产生38KHZ


作者: 红尘有你    时间: 2020-4-17 10:55
while(1)                            //38KHz脉冲,占空比5:26
         {
             if(TF0)break;     //定时器0  5
                IR = 0;  
              if(TF1)break;  //定时器1  26
                  IR = 1         
      }//中断程序里TF0,tf1清零
这样才行吧!兄弟
作者: kzzk    时间: 2025-4-20 19:03
程序放到stc单片上逻辑仪显示是20k
作者: a399288395    时间: 2025-4-20 21:02
想用软件模拟产生38KHZ 发射红外信号对吧, 可以去B站 搜一下金善愚老师的视频; 红外遥控那一篇  值得学习。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1