- 16位定时计数(工作方式1)
- 初始化函数
void timer_init()
{
TMOD |= 0x01;
TH0 = 0x4C;
TL0 = 0x00;
EA = 1;
ET0 = 1;
TR0 = 1;//初始化定时器运行
}
- 初值计算
- 假设每次中断延时delay =50ms
- 时钟频率(时钟周期)OSC=11.0592MHZ
- 机器频率(机器周期) =11.0592MHZ/12(即一个机器周期等于12倍时钟周期)
- 即1秒钟定时器计数次数为 =11.0592MHZ/12
- 50ms,需要的定时器计数数目为=11.0592MHZ/12/20=46080
- 16位寄存器(TH和TL),需要预填充数目=65536-46080=19456
- TH= (u8)(19456 / 256)=0X4C;
TL= (u8)(19456% 256)=0X00; - 即16进制,0X4C00,即TH存0X4C,TL存0X00
- 8位自动重装载(工作方式2)
- 初始化函数
void init_serial()
{
// TH1= -(FOSC/12/32/BAUD); //Set auto-reload vaule
// TL1= -(FOSC/12/32/BAUD); //Set auto-reload vaule
SCON=0x50;
TMOD=0x20;
TH1=0XFD;
TL1=0XFD;
TR1=1;
ES=1;
EA=1;
RS485_RW=0;
}
- 初值计算,假设波特率9600
- BAUD = (Timer 1溢出率)*(2SMOD/32)=(OSC/((256-TH1)*12))*(2SMOD/32)=OSC/(256-TH1)*12)*(2SMOD/32)
- SMOD=1时波特率加倍: = 11059200 / 12 /16 / (256-TH或TL)
- SMOD=0时波特率不加倍: = 11059200 / 12 /32 / (256-TH或TL)
- 假设晶振频率为11.0592MHz,波特率为9600,SMOD=0(不加倍),TH1初值应该为多少呢?
- TH1=TL1=256-(2SMOD*OSC)/(BAUD*32*12)
- TH1=TL1=256-11059200/(9600*32*12)=0xFD 【253即0xFD】
- 即:9600 = 11059200 / 12 /16 / (256-253)