1Hz:1秒内电流往返一次
晶振:11.0592 MHz =11059200 Hz
时钟周期: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才溢出)
例如:
需要定时 20ms=0.02s
N = 0.02/(12/11059200) = 18432
初值y=65536-18432=47104=0XB800
下面我们用一个简单的例子实现跑马灯实验,间隔为1 s!
# include <8052.h>
# define ADDR0 P1_0
# define ADDR1 P1_1
# define ADDR2 P1_2
# define ADDR3 P1_3
# define ENLED P1_4
void main() {
unsigned char cnt = 0; //定义一个计数变量,记录T0溢出次数
unsigned char i = 0;
ENLED = 0; //使能U3,选择独立LED
ADDR3 = 1;
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 0;
TMOD = 0x01; //设置T0为模式1,对照表格即为定时器/计数器的4种模式中的16位定时器/计数器模式
TH0 = 0xB8; //为T0赋初值0xB800
TL0 = 0x00;
TR0 = 1;
while(1) {
if (TF0 ==1 ) { //判断T0是否溢出
TF0 = 0; //T0溢出后,清零中断标志
TH0 = 0xB8; //并重新赋初值
TL0 = 0x00;
cnt ++; //计数值自加1
if (cnt >= 50) { //判断T0溢出是否达到50次
cnt = 0; //达到50次后计数值清零
P0 = ~(0x01<<i);//下面是跑马灯
i++;
if (i >= 8) {
i = 0;
}
}
}
}
}