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节

点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)