Dotcpp  >  编程教程  >  定时器  >  输入捕获

输入捕获

点击打开在线编译器,边学边练

1.捕获高电平时间

我们利用定时器0的计数功能实现捕获外部引脚的高电平时间。定时器在不同用法里有不同称呼,比如我们这次是想得知某段过程持续了多长时间,用定时器的计数方式的话就叫做计数器。

我们这次选用的外部引脚还是P1.6,初始时先让该引脚输出低电平。

我们之前没有说过当TMOD低四位里的第三位GATE为1时是什么作用,这里说明一下,当这个位被置1的话,如果此时有“TR0=1;”,且P3.2必须为高电平的时候,才会触发定时器0的计数(P3.2为低电平时不会触发),也就是TL0每隔(12/11059200)秒就会加1,加到256变为0之后TH0就加1。一直加到65535就会有“TL0=255;”和“TH0=255;”,再加1就会全部变为0,这里复习以前讲过的知识。

所以我们把P1.6和P3.2连接起来,在 TR0置1时,只要P1.6输出高电平就会开启计数功能,P1.6输出低电平时就会停止计数功能。我们再用左边三个数码管显示TH0的数,右边三个显示TL0的数。

所以我们打算这样做

P1.6=0;

TR0=1;

P1.6=1;            //开始计数

delay_ms(30);  //延时一段时间

P1.6=0;            //停止计数

代码先用软件测试一下“delay_ms(30);”到底真正花费多少时间。

定时器14

所以P1.6保持了41.784ms的高电平时间。

用杜邦线把P1.6和P3.2连接起来之后,注意我们的延时时间不要超过71ms,也就是高电平持续的时间不能超过71ms,这跟定时时间一次定不了71ms一样。因为计数最高只能到65535。


2.代码

把代码下载进去,观察数码管显示的数值。

#include <reg52.h> 
#include <function.h> //详见第六章第8讲
 
//请用杜邦线把P1.6和P3.2连接起来
void main()
{     
    LED_Init(); //初始化LED硬件模块
    TMOD=0x09;  //低四位 1001 
  
    BEEP=0;     //先让P1.6输出低电平
    TR0=1;
    BEEP=1;     //开始计数  
    delay_ms(30);
    BEEP=0;     //停止计数  
  
    LedBuff[0]=LedChar[TL0%10];
    LedBuff[1]=LedChar[(TL0/10)%10];
    LedBuff[2]=LedChar[(TL0/100)%10]; 
  
    LedBuff[3]=0x7F&LedChar[TH0%10];//加上小数点好区分
    LedBuff[4]=LedChar[(TH0/10)%10];
    LedBuff[5]=LedChar[(TH0/100)%10];

    while(1)
    {     
        SEG_Scan();//读取TH0和TL0的值  
    }   
}

数码管显示150.109,所以

(150*256+109)*(12/11059200)= 0.0417849s

捕获到的高电平时间为41.7849ms,可以说精度相当高。

这里大家忘记为什么“150*256”的话,请回去复习本章之前的内容。

还有TMOD的第七位GATE的功能与第三位的GATE的功能一样,只不过用的是定时器1来计数,触发开启计数的引脚为P3.3而已。详细请参考《手把手教你学51单片机》文档5.2.2节


本文固定URL:https://www.dotcpp.com/course/424

单片机教程
第一章 单片机入门
第二章 LED及入门
第三章 蜂鸣器
第四章 数码管
第五章 独立按键
第六章 多文件编程
第七章 外部中断
第八章 定时器
第九章 舵机与超声波模块
第十章 串口通信
第十一章 1602液晶屏
第十二章 IIC通信
第十三章 红外遥控与温度传感器
第十四章 AD与DA
第十五章 混合例程
第十六章 完结
Dotcpp在线编译      (登录可减少运行等待时间)