找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2519|回复: 5
打印 上一主题 下一主题
收起左侧

给大家提供一个产生38k信号的程序,问一下其中的原理

[复制链接]
跳转到指定楼层
楼主
ID:647989 发表于 2020-4-16 19:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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,有没有懂软件延时的大佬看一下我说的对不对?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:235200 发表于 2020-4-16 21:13 | 只看该作者
不一定是这样,C语言通过编译转换成汇编语言的语句不是固定的
回复

使用道具 举报

板凳
ID:311846 发表于 2020-4-17 09:28 | 只看该作者
38KHz为1/38K约26us一个周期,占空比5:26则 5/(26+5)*26约为4us,根据你的程序大概就是IR=0的时间为4us,IR=1的时间为22us,这个程序没啥实际应用价值,一般用定时器做,不过对于stc89c51单片机要使用定时器估计速度跟不上。
回复

使用道具 举报

地板
ID:213173 发表于 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_ ();
        }
回复

使用道具 举报

5#
ID:97249 发表于 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

回复

使用道具 举报

6#
ID:97249 发表于 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清零
这样才行吧!兄弟
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表