51单片机(二十一)—— 定时器计数功能

        在本文,我们对51单片机定时器的计数功能进行测试,采用定时器0通过方式2产生10KHz的方波,并通过单片机的P1.0口输出。定时器1采用方式1的计数功能,即对外部输入的脉冲进行计数。T1与P3.5引脚复用。实验时,需要用杜邦线将单片机的P1.0引脚,与P3.5引脚连接在一起。T0输出的脉冲又通过P3.5引脚输入给定时器1的计数器。定时器1对脉冲进行计数,设置为5000个脉冲溢出一次。脉冲的周期为0.1ms,即定时器1的溢出周期为500ms,所以LED1以1秒一次的频率闪烁。

        定时器0和定时器1的初始化代码如下所示

void init_T0_T1(void)
{
	TMOD= 0x52;	      //定时器0使用方式2,8位自动重装载定时器	
	                  //定时器1使用方式1, 16位计数器,计数功能     
	TH0=256-50;	      //给TH0和TL0赋初值,计数周期为50个机器周期
	TL0=256-50;       //采用12MHz的晶振,计时时长为50us
	TH1=(65536-5000)/256;   //给TH1和TL1赋初值,计数周期为5000个外部输入脉冲	
        TL1=(65536-5000)%256; 

	EA=1;            //总中断打开
	ET0=1;           //定时器0中断打开
	TR0=1;           //定时器0开关打开
	ET1=1;           //定时器1中断打开
	TR1=1;           //定时器1开关打开
}

T0的中断处理函数如下所示。

void T0_ISR(void) interrupt 1
{
	PULSE=~PULSE;        //输出的值取反
}

T1的中断处理函数如下所示

void T1_ISR(void) interrupt 3
{
	TH1=(65536-5000)/256;   //给TH1和TL1赋初值,计数周期为5000个外部输入脉冲	
    TL1=(65536-5000)%256; 
	LED=~LED;               //灯的状态取反
}

将单片机的P1.0引脚与P3.5引脚用杜邦线连接在一起,将程序烧写到单片机中,则LED每秒闪一次。

发布了97 篇原创文章 · 获赞 7 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/bhniunan/article/details/104415783