找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 13097|回复: 6
收起左侧

怎么用单片机的普通I/O口测脉冲宽度(100ms左右)

[复制链接]
ID:51443 发表于 2013-7-2 22:05 | 显示全部楼层 |阅读模式
如题,怎么用单片机的普通I/O口测量脉冲宽度(100ms左右)?比如把脉冲加到STC89C52RC的P1.6口进行测量。
回复

使用道具 举报

ID:7485 发表于 2013-7-3 08:17 | 显示全部楼层
可以使用查询方式。
回复

使用道具 举报

ID:51443 发表于 2013-7-3 09:40 | 显示全部楼层

本帖最后由 职教电子 于 2013-7-3 09:48 编辑
ahshmj 发表于 2013-7-3 08:17
可以使用查询方式。


能说具体点吗?我刚学,看了很多例程,都是把脉冲加到中断口才行,我试着用了查询方式,但没有成功。我就是想用一个普通I/O口来识别四个不同宽度的正脉冲,即:我把100ms的正脉冲加到P1.6口,让单片机干第一件事情;当我把200ms的正脉冲加到P1.6口,让单片机干第二件事情......(每种脉冲都是连续发送)
回复

使用道具 举报

ID:7485 发表于 2013-7-3 11:45 | 显示全部楼层
使用循环,一直查询该脚是否变成高电平。如果是,就启动定时器开始计时。然后继续查询,该脚是否变成低电平,若是,则停止定时器计时,然后读出计时值即可计算脉冲宽度。
回复

使用道具 举报

ID:51443 发表于 2013-7-3 12:31 | 显示全部楼层
ahshmj 发表于 2013-7-3 11:45
使用循环,一直查询该脚是否变成高电平。如果是,就启动定时器开始计时。然后继续查询,该脚是否变成低电平 ...

定时器最多只能有几十毫秒的定时时间吧,我需要上百毫秒。我是这样做的:
void keyscan() //
  {
    //uint ci=0;前面已定义成全局变量
    TMOD=0x02; //T0模式2
      TH0=0; //赋初值
     TL0=0;
       EA=1; //开总中断
     ET0=1;//开定时器中断

    if(key==1)   //key=P1^6
      {
        TR0=1;   //启动定时器
        while(!key) //等待低电平到来
        if(key==0)
        {
          TR0=0; //关闭定时器
      if((ci>200) && (ci<300)) //若200<ci<300
            num=0;
      }
      }

    }
void T0_time() interrupt 1   //T0中断
{
  ci++;
  }
l哪错了?
回复

使用道具 举报

ID:7485 发表于 2013-7-3 17:37 | 显示全部楼层
如果使用6.0000m晶振可以在一次中断内做到65535*2微秒(130ms多)。

如果在要再长时间,可以像时钟程序一样另外设一个计数器,记录中断次数。
回复

使用道具 举报

ID:51443 发表于 2013-7-3 20:36 | 显示全部楼层
ahshmj 发表于 2013-7-3 17:37
如果使用6.0000m晶振可以在一次中断内做到65535*2微秒(130ms多)。

如果在要再长时间,可以像时钟程序 ...

谢谢版主的回复,我用全局变量记录溢出次数为什么不行呢?我只需要把40ms-----300ms的不同脉宽区分开就行。不需要准确的数值。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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