在本文,我们对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每秒闪一次。