参考内容:不记得原作地址了,很尴尬啊,
1.确定时钟周期、机器周期。
时钟周期由单片机的晶振频率Fclk决定。那么时钟周期就是1/Fclk(比如:11.0592MHz)。确定单片机的机器周期是n个时钟周期(n在51单片机下一般是12)。
2.确定需要单次定时器最大的计时时间长度
如果是16位的计数器,16位最大值是65535,共可计数65536次。如果是8位最大值是255,共可计数256次,12 * 65536/11059200 = 0.0711s,也就是说单次定时时间不超过71 ms
3.确定计数器初始值
先确定每一次要定时的时间长度,比如xms (注意不要超过步骤2的单次定时最长时间), 那么计数器的初始值如下:
TH0=(65536-Fclk/1000/nx)/256; //注意:这里的除以1000是认为Fclk的单位是MHz
TL0=(65536-Fclk/1000/nx)%256;
1Hz:1秒内电流往返一次
晶振 11.0592MHz =11059200Hz
时钟周期 1/11059200 s(晶振的倒数)
机器周期是 12/11059200 s (标准框架下51单片机一个机器是12个时钟周期)
因为定时器是每个机器周期加1所以: 定时时间为 N时钟机器周期时间=所定时间T
所以要经过的机器周期是N(12/11059200 s)=T
N=t/(12/11059200)
初值等于 65536-N(因为16位的定时器65535再加1才溢出)
如果是16位的计数器,16位最大值是65535,共可计数65536次。如果是8位最大值是255,共可计数256次,
例如:
需要定时50ms=0.05s
0.05/(12/11059200)=0.05(11059200/12)=0.05921600=46080
快速计算只需更改这个 ↑
初值y=65536-46080=19456=0X4C00
#include "REG52.H"
#include "INTRINS.H"
void timer0_delay_10ms(unsigned int t);
void main()
{
while (1)
{
timer0_delay_10ms(100);
P2 = ~P2;
}
}
/***
*
1.确定时钟周期、机器周期。
时钟周期由单片机的晶振频率Fclk决定。那么时钟周期就是1/Fclk(比如:11.0592MHz)。确定单片机的机器周期是n个时钟周期(n在51单片机下一般是12)。
2.确定需要单次定时器最大的计时时间长度
如果是16位的计数器,16位最大值是65535,共可计数65536次。如果是8位最大值是255,共可计数256次,12 * 65536/11059200 = 0.0711s,也就是说单次定时时间不超过71 ms
3.确定计数器初始值
先确定每一次要定时的时间长度,比如xms (注意不要超过步骤2的单次定时最长时间), 那么计数器的初始值如下:
TH0=(65536-Fclk/1000/n*x)/256; //注意:这里的除以1000是认为Fclk的单位是MHz
TL0=(65536-Fclk/1000/n*x)%256;
*********************************************************
*********************************************************
1Hz:1秒内电流往返一次
晶振 11.0592MHz =11059200Hz
时钟周期 1/11059200 s(晶振的倒数)
机器周期是 12/11059200 s (标准框架下51单片机一个机器是12个时钟周期)
因为定时器是每个机器周期加1所以: 定时时间为 N*时钟机器周期时间=所定时间T
所以要经过的机器周期是N*(12/11059200 s)=T
N=t/(12/11059200)
初值等于 65536-N(因为16位的定时器65535再加1才溢出)
如果是16位的计数器,16位最大值是65535,共可计数65536次。如果是8位最大值是255,共可计数256次,
例如:
需要定时50ms=0.05s
0.05/(12/11059200)=0.05*(11059200/12)=0.05*921600=46080
快速计算只需更改这个 ↑
初值y=65536-46080=19456=0X4C00
*/
void timer0_delay_10ms(unsigned int t)
{
unsigned int fclk = 11059200UL;
unsigned char ms = 10;// 10ms
unsigned int temp = 0;
// 这个th tl不能动态计算,动态计算就不行,为什么
// 我觉得 它是寄存器,寄存器只能配置,不能计算
// unsigned char th = (65536 - fclk / 1000 / 12 * ms) / 256;
// unsigned char tl = (65536 - fclk / 1000 / 12 * ms) % 256;
unsigned char th = 220;//(65536 - fclk / 1000 / 12 * ms) / 256;
unsigned char tl = 0;//(65536 - fclk / 1000 / 12 * ms) % 256;
TMOD |= 0x1;
// TH0 = ((65535 + 1) - (ms / 1000 / (12 / fclk))) / 256;
// TL0 = ((65535 + 1) - (ms / 1000 / (12 / fclk))) % 256;
// TH0 = (65536 - fclk / 1000 / 12 * ms) / 256;
// TL0 = (65536 - fclk / 1000 / 12 * ms) % 256;
TH0 = th;
TL0 = tl;
ET0 = 1;
TR0 = 1;
while (temp != t)
{
while (TF0)
{
TF0 = 0;
TH0 = th;
TL0 = tl;
temp++;
}
}
TR0 = 0;
}