51内部有两个定时器,两个定时器的本质还是加一计数器,只不过作为定时器是计数内部脉冲,而作为计数器时是对外部脉冲计数,在计数模式下,P3.4端口是T0计数器的外部脉冲输入口,P3.5端口是T1计数器的外部脉冲输入口。
例:用51的T0定时,隔一秒输出一个方波,然后用T1计数这个方波的个数,计满20个方波然后让LED1亮一下。
#include <reg52.h>
sbit Fware_OUT=P0^5;//方波产生口
sbit LED=P0^6;
//初始化
void start()
{
TMOD=0X62;// 0110 0010
TH1=236;
TL1=236;
TH0=0x47;//定时0.2ms
TL0=0X47;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=0;
}
//T0产生方波
void timer0() interrupt 1
{
static int count;
count++;
if(count==5000)//1s
{
count=0;
Fware_OUT=~Fware_OUT;
}
}
//T1计数20个上升沿后产生溢出中断
void counter1() interrupt 3
{
LED=~LED;
}
void main()
{
start();
while(1);
}
当然也可以不用中断做
#include <reg52.h>
sbit Fware_OUT=P0^5;//方波发生口
sbit LED=P0^6;
//初始化
void start()
{
TMOD=0X62;// 0110 0010
TH1=0;
TL1=0;
TH0=0x47;//0.2ms
TL0=0X47;
EA=1;
ET0=1;
TR0=1;
temp=TH1;
}
//T0产生方波
void timer0() interrupt 1
{
static int count;
count++;
if(count==5000)//1s
{
count=0;
Fware_OUT=~Fware_OUT;
}
}
void main()
{
start();
while(1)
{
if(temp==20)
{
LED=~LED;
TH1=0;
TL1=0;
}
}
}
这种方法叫做查询方法,在while(1)中不断用temp反复查询TH1到20了没有,效率有点低。