找回密码
 立即注册

QQ登录

只需一步,快速开始

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

可以使用计数器计数的方法,获取外部输入信号的高电平持续时间?

[复制链接]
跳转到指定楼层
楼主
ID:37685 发表于 2015-4-2 11:40 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
你好,请问我可以使用计数器计数的方法,获取外部输入信号的高电平持续时间?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:27916 发表于 2015-4-2 12:42 | 只看该作者
可以的,你可以在检测到上升沿或高电平后开始定时,等到低电平或是下降沿后停下来,看 看时间是多少

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:1 发表于 2015-4-2 12:58 来自手机 | 只看该作者
楼上说得对,可以反相以后,利用中断来启动检测。然后循环检测来判断时间。或者直接采用循环判断也行。
回复

使用道具 举报

地板
ID:73833 发表于 2015-4-2 17:44 | 只看该作者
我送个程序你看看
定时器T0的模式2测量正脉冲宽度
#include<reg51.h>   //包含51单片机寄存器定义的头文件
sbit ui=P3^2;  //将ui位定义为P3.2(INT0)引脚,探测输入电压
/*******************************************
函数功能:主函数
******************************************/       
void main(void)
  {
    TMOD=0x0a;   // TMOD=0000 1010B,使用定时器T0的模式2,GATE置1
    EA=1;         //开总中断
    ET0=0;        //禁止定时器T0中断     
   TH0=0;        //计数器T0高8位赋初值
   TL0=0;        //计数器T0低8位赋初值
   TR0=1;        //启动T0
         while(1)      
     {
            while(ui==0) ;  //INT0为低电平,T0不启动
                  
           TL0=0;   //INT0为高电平, T0启动, TL0清0做准备
               
           while(ui==1) ; //在INT0高电平期间等待,计时结果送TH0\TL0       
       
          P1=TL0;    //INT0一旦为低电平就将计时结果送P1口(或其他变量存储),根据机器周期可以计              

                          算出INT0上高电平存续的宽度,当然如果高电平时间太长,也可以算上TH1。
                          
        //While(1);
}
}

评分

参与人数 1黑币 +35 收起 理由
admin + 35 很给力!

查看全部评分

回复

使用道具 举报

5#
ID:73833 发表于 2015-4-2 17:54 | 只看该作者
定时器T0的模式2测量正脉冲宽度
#include<reg51.h>   //包含51单片机寄存器定义的头文件
sbit ui=P3^2;  //将ui位定义为P3.2(INT0)引脚,表示输入电压
/*******************************************
函数功能:主函数
******************************************/       
void main(void)
  {
    TMOD=0x0a;   // TMOD=0000 1010B,使用定时器T0的模式2,//GATE置1
    EA=1;         //开总中断
         ET0=0;        //禁止定时器T0中断     
         TH0=0;        //计数器T0高8位赋初值
         TL0=0;        //计数器T0低8位赋初值
TR0=1;        //启动T0
         while(1)       //无限循环,不停地将TL0计数结果送P1口
     {
            while(ui==0) ;  //INT0为低电平,T0不能启动
                  
                 TL0=0;   //INT0为高电平, T0已启动, TL0清0做准备
               
while(ui==1) ; //在INT0高电平期间等待,计时结果送
//TH0\TL0               
P1=TL0;    //INT0一旦为低电平就将计时结果送P1口或其他变量//存储,根据机器周期可以计算出高电平存续的时间当//然如果高电平时间太长,也可以算上TH0。
        //While(1);
}
}
定时器/计数器是一家人,单凭这家人是完不成任务的,还得去求人家INT0

评分

参与人数 1威望 +50 黑币 +50 收起 理由
admin + 50 + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

6#
ID:37685 发表于 2015-4-3 13:52 来自手机 | 只看该作者
dingmingzhou 发表于 2015-4-2 17:54
定时器T0的模式2测量正脉冲宽度
#include   //包含51单片机寄存器定义的头文件
sbit ui=P3^2;  //将ui位 ...

太感谢了,程序条理清晰,注释的非常详细,很容易让人理解。真是帮了我的大忙,再次表示感谢,祝您身体健康万事顺利。晚上我在烧录到单片机里面去,测试一下。
回复

使用道具 举报

7#
ID:75077 发表于 2015-4-3 23:45 来自手机 | 只看该作者
我不是以前就上传过答案么

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

8#
ID:73833 发表于 2015-4-5 09:38 | 只看该作者
/**********************************************************************
//楼主:也不知你实验的怎样了。不过别高兴太早,这个程序是我粘来的,近日细琢磨一下,认为它还有些问题:
//1、既不查询中断标志,也不用中断服务,更甚者没开任何中断源!而开个总中断干什么呢?
//2、程序使用的是T0的工作方式2,它是自动重装的8位计数器。所以注释中说"可以算上TH0"以及存入"TH0"之类的注释,是何意?   哎,什么人弄得!
//我把它改吧改吧,你试验一下行不?愿讨论。
/*************************************************************************/
#include<reg51.h>   //包含51单片机寄存器定义的头文件
sbit  ui = P3^2;  //将ui位定义为P3.2(INT0)引脚,探测输入电压  
void main(void)
  {       
   TMOD=0x09;   // 使用定时器T0的模式1,GATE置1。定时模式。  
while(1)      
     {  
          TL0=0;           //定时器低8位清零       
          TH0=0;     //定时器高8位清零          
           while(ui);          //为了完整测量一个高电平,必须准确寻找一个完整的高电平。
                        //因此,如果此时P3.2脚上的电平为高,由于此时的TR0=0,
                        //定时器T0不能启动。从下一个高电平开始。
            TR0=1;        //        在P3.2脚 为低电平时        ,让TR0=1,做准备。
       while(!ui) ;        //         在P3.2脚低电平期间,等待。       
           while(ui) ;  //  程序到这一步时,P3.2脚已为高电平,同时启动T0定时,并等待 P3.2脚变低。
                    TR0=0;    //  P3.2脚变低时,关闭定时器T0.
          P1=TL0;  
          P2=TH0;           //显示 。TH0\TL0两个寄存器可以存储最大65536个数。
       
         }
   }

评分

参与人数 1黑币 +35 收起 理由
admin + 35 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

9#
ID:88353 发表于 2015-8-14 23:56 | 只看该作者
dingmingzhou 发表于 2015-4-5 09:38
/**********************************************************************
//楼主:也不知你实验的怎样 ...

正在做电赛的东西,抱走了哈~~~
回复

使用道具 举报

10#
ID:88483 发表于 2015-8-17 17:57 | 只看该作者
我觉得可以,利用输入捕捉,前提是你要知道你计数是上升沿触发还是下降沿触发和上升沿都触发。
回复

使用道具 举报

11#
ID:88776 发表于 2015-8-23 23:14 | 只看该作者
太好了。。。多谢楼主。。楼主好人。
回复

使用道具 举报

12#
ID:489281 发表于 2019-5-9 09:28 | 只看该作者
感谢楼下大佬
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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