定时器/计数器 0和1
N76E003系列定时器/计数器 0和1是2个16位定时器/计数器。每个都是由两个8位的寄存器组成的16位计数寄存器。
对于定时器/计数器0,高8位寄存器是TH0、 低8位寄存器是TL0。
同样定时器/计数器1也有两个8位寄存器, TH1 和TL1。
TCON 和 TMOD 可以配置定时器/计数器0和1的工作模式。
通过TMOD中的 位来选择定时器或计数器功能。
每个定时器/计数器都有选择位,TMOD的第2位选择定时器/计数器0功能,TMOD的第6位选择定时器/计数器1功能。
将它们设置为定时器后,定时器将对系统时钟周期计数。
定时器0通过设置T0M(CKCON.3)位,定时器1通过设置T1M(CKCON.4)位,来选择定时器时钟是系统时钟(FSYS)的12分频或直接是系统时钟。
在计数器模式下,每当检测到外部输入脚T0上的下降沿,计数寄存器的内容就会加一。如果在一个时钟周期采样到高电平,在下一个时钟周期采样到低电平,那么T0或T1引脚就会确认为一个由高到低的跳变。
当有定时器溢出发生,定时器0和1能配置引脚T0/T1自动翻转输出。
这个功能通过设P2S寄存器的T0OE和T1OE来设置,分别对应于定时器0和定时器1。当打开这个功能,输出端口在第一个定时溢出之前输出逻辑1。为确保此模式功能, 位应该被清除并且选择系统时钟作为定时器的时钟源。
注意:TH0(TH1)和TL0(TL1)是独立分开访问。需要特别注意,在模式0或模式1下时,当读/写TH0(TH1)和TL0(TL1)之前,必须清除TR0(TR1)来停止计时。否则将产生不可预料的结果。
模式0(13位定时器)
在模式 0, 定时器/计数器是13位的计数器。13位的计数器由TH0 (TH1) 和TL0 (TL1)的低五位组成。TL0 (TL1)的高三位被忽略。当TR0 (TR1)置位且GATE是0或 是1时,定时器/计数器使能。GATE设置为1可以通过定时器来计算外部输入引脚
上输入脉冲的宽度。当13位的定时器计数值从1FFFH变为0000H后,定时器溢出标志TF0 (TF1) 置位,如果中断打开,此时会产生一个定时器中断。
#define TH0_INIT 0xFC #define TL0_INIT 0x0F #define TH1_INIT 0xE0 #define TL1_INIT 0x00
TMOD = 0XFF; Set_All_GPIO_Quasi_Mode; TIMER0_MODE0_ENABLE; //Timer 0 and Timer 1 mode configuration TIMER1_MODE0_ENABLE; clr_T0M; clr_T1M; TH0 = TH0_INIT; TL0 = TL0_INIT; TH1 = TH1_INIT; TL1 = TL1_INIT; set_ET0; //enable Timer0 interrupt set_ET1; //enable Timer1 interrupt set_EA; //enable interrupts set_TR0; //Timer0 run // set_TR1; //Timer1 run
TMOD = 0XFF;
Set_All_GPIO_Quasi_Mode; 设置引脚模式
#define P14_OpenDrain_Mode P1M1|=SET_BIT4;P1M2|=SET_BIT4
TIMER0_MODE0_ENABLE; //Timer 0 and Timer 1 mode configuration
#define TIMER0_MODE0_ENABLE TMOD&=0xF0
//-------------------- Timer1 function define -------------------- #define TIMER0_MODE0_ENABLE TMOD&=0xF0 #define TIMER0_MODE1_ENABLE TMOD&=0xF0;TMOD|=0x01 #define TIMER0_MODE2_ENABLE TMOD&=0xF0;TMOD|=0x02 #define TIMER0_MODE3_ENABLE TMOD&=0xF0;TMOD|=0xF3
clr_T0M;
clr_T1M;
#define clr_PWMCKS CKCON &= ~SET_BIT6 #define clr_T1M CKCON &= ~SET_BIT4 #define clr_T0M CKCON &= ~SET_BIT3 #define clr_CLOEN CKCON &= ~SET_BIT1
TH0 = TH0_INIT; TL0 = TL0_INIT; TH1 = TH1_INIT; TL1 = TL1_INIT;
#define TH0_INIT 0xFC // #define TL0_INIT 0x0F #define TH1_INIT 0xE0 // #define TL1_INIT 0x00
set_TR0; //Timer0 run
由于定时器方式0位13为计数器,即最多能装载2的13次方个(8192),当TH0与TL0初始值为零时最多经过8192个机器周期该计数器就会溢出一次,,向CPU申请中断。
时钟周期
时钟周期也称为振荡周期,定义为时钟脉冲的倒数(可以这样来理解,时钟周期就是单片机外接晶振的倒数,例如12M的晶振,它的时间周期就是1/12 us),是计算机中最基本的、最小的时间单位。
在一个时钟周期内,CPU仅完成一个最基本的动作。对于某种单片机,若采用了1MHZ的时钟频率,则时钟周期为1us;若采用4MHZ的时钟频率,则时钟周期为250us。由于时钟脉冲是计算机的基本工作脉冲,它控制着计算机的工作节奏(使计算机的每一步都统一到它的步调上来)。显然,对同一种机型的计算机,时钟频率越高,计算机的工作速度就越快。但是,由于不同的计算机硬件电路和器件的不完全相同,所以其所需要的时钟周频率范围也不一定相同。我们学习的8051单片机的时钟范围是1.2MHz-12MHz。
在