T0用作频率发生器;T1采样外部脉冲

当定时器/计数器工作在计数器模式时,输入信号产生由1–>0的下降沿跳变时,计数器的值加1;计数的脉冲来源于I/O的对应关系:

名称 I/O
T0 P3.4
T1 P3.5
T2 P1.0
  • 由于确认一次负跳变需要2个机器周期,即24个振荡周期,因此外部输入计数脉冲的最高频率为振荡器周期的1/24。采用12MHz的晶振,则最大频率为500kHz;(50KHz就不要再升了)

程序

  • 程序现象:定时器T0用作频率发生器,输出2.5KHz(周期400us , 200us 中断)、50%占空比的频率;定时器T1采样外部脉冲,计数到2500个脉冲则使LED灯取反。
  • 程序说明:LED连接在P2^0; PWM脉冲连接在 P1^7口;计数器T1采样端口P3.5;

#include "reg52.h"

sbit Led0 = P2^0; //LED口
sbit PWM = P1^7;  //PWM口

void Init()
{
    TMOD = 0x52;    // T1为16位计数器 T0为8位自动重装载定时器
    
    TH1 = (65536 - 2500)/256;
    TL1 = (65536 - 2500)%256;     // 计数2500个跳变沿,即1S
    TH0 = (256 - 200);
    TL0 = (256 - 200);     // 12M晶振,定时200us
    
    EA = 1;
    ET0 = 1;  //允许T0、T1中断
    
    ET1 = 1;
    TR0 = 1;    //开启定时器、计数器
    TR1 = 1;
    
    PWM = 1;  //初始置高
}

void main()
{
    Init(); //初始化
    
    while(1);
}

void Timer0() interrupt 1
{
    PWM = ~PWM;     // 即周期400us,频率2.5KHz,占空比50%
}

void Timer1() interrupt 3
{
    TH1 = (65536 - 2500)/256;
    TL1 = (65536 - 2500)%256;     // 计数2500个跳变沿,即1S
    Led0 = ~Led0;     // 
}

你可能感兴趣的:(51单片机)