51单片机的定时/计数器结构(T0和T1)
T0、T1分别由TH0、TL0和TH1、TL1四个8位计数器组成
定时器的区别:
T0可分成2个独立的8位定时器,而定时器1则不能;
T1可作为串口的波特率发生器,而定时器0则不能。
方式3:只能用于定时/计数器T0,T0工作在方式3时,T1不要使用在有中断的场合。通常该种情况下T1用作串口波特率发生器
工作原理:
将T0分成两个独立的8位定时/计数器TL0和TH0。
TL0为正常的8位定时/计数器,计数器溢出后置位TF0,申请中断,之后重装初值。
TH0也是8位定时/计数器,但由于TL0占用了TF0和TR0,因此TH0占用定时器TF1和TR1(所以T1不能用)
只要T0不是工作在方式3,T1在用于波特率发生器是,仍然具有中断功能。
以下代码可以发送数据到串口,同时,也可以让P2.0输出一个脉冲,使与其连接的LED闪烁。
#include <REGX52.H>
//#include "Timer0.h"
//#include "Timer1.h"
#include "Delay.h"
sbit led1=P2^0;
unsigned int num=0;
unsigned char arr[4]={0x22,0x33,0x10,0x01};
void UART_SendByte(unsigned char Byte)
{
SBUF=Byte;
while(TI==0);
TI=0;
}
void UsartInit()
{
SCON=0X50; //ÉèÖÃΪ¹¤×÷·½Ê½1
TH1=0XFD; //9600
TL1=0XFD;
}
void Timer1Init(void)
{
TMOD=0x20;
EA=1;
ET1=1;
TR1=1;
}
void main()
{
Timer1Init();
UsartInit();
led1=0;
while(1)
{
if(num>=9600) //
{
num=0;
led1=~led1;
}
for (i = 0; i < sizeof(arr); i++)
{
UART_SendByte(arr[i]); // ??????????
}
}
}
void T1_time() interrupt 3
{
num++;
}