16位寄存器分为高八位(TH0)和低八位(TLO),取值范围0-65535
也就是低八位255,高八位255(255*255=65535)
问题:89C52开发板 晶振11.0592MHZ 用定时器封装一个1ms的函数?
#include<reg52.h>
sbit LED = P1^0;
void delay(void)
{
TMOD = 0x01; //设置定时器工作模式为高低八位合并为一个16位寄存器
TH0 = 0xfc;
TL0 = 0x63;
TR0 = 1;
while(1)
{
if(TF0==1) //检测定时器0是否溢出
{
TF0 = 0; //若溢出,则重置检测位TF0
break;
}
}
}
void main()
{
LED = 0;
while(1)
{
delay();
LED = ~LED;
}
}
解:89C52采用的是12分频,机器周期为12/11.0592=1.085us
设1ms经过x个机器周期,那么x=1*10^-3s/(12/11.0592*10^6hz)=921.6
取整数 x=921
那么需要(255-TL0)+255*(255-TH0)=921(这个公式很容易就想明白)
解得TH0=0XFC,TL0=0X63
这样TF0==1(溢出),过了920个机器周期,打一下示波器看看输出波形,定时器周期在1.02ms附近
那么封装一个1s的定时器呢?
#include<reg52.h>
sbit LED = P1^0;
void delay(unsigned int ms)
{
unsigned int cycle = 0;
TMOD = 0x01; //设置定时器工作模式为高低八位合并为一个16位寄存器
TH0 = 0xfc;
TL0 = 0x63;
TR0 = 1;
while(1)
{
if(TF0==1) //检测定时器0是否溢出
{
TF0 = 0; //若溢出,则重置检测位TF0
TH0 = 0xfc;
TL0 = 0x63;
cycle++;
if(cycle==ms)
break;
}
}
}
void main()
{
LED = 0;
while(1)
{
delay(1000);
LED = ~LED;
}
}
波形可看出周期是1s
参考以下博主