51定时器
TL0(TL1)与TH0(TH1),因为是16位定时器/计数器,所以有两组专用的8位寄存器负责定时/计数的工作。 这两组特殊功能寄存器与普通的无符号字符型变量,功能几乎一样。唯一的区别在于,这两组特殊功能寄存器是定时器/计数器专用的,当定时开启后,TL0(TL1)自动跟随机器周期加一。当TL0(TL1)满了后,自动清零同时向TH0(TH1)进一位,不需要手动操作。 而当TL0(TL1)和TH0(TH1)都满了以后,此时如果定时中断和总中断都已经打开,那么就会发生溢出中断,同时这两个寄存器清零。
/**********************51单片机学习例程************************ * 平台:Keil U4 + STC89C52 * 名称:P1口控制流水灯闪烁 * 编写:Tony * 日期:2022-1-23 * QQ : 674749794 * 晶体:12MHZ * 变更记录:无 ******************************************************************/ #include <reg52.h> unsigned char cnt_60ms; //定义该变量为计数用变量,每隔60ms,该变量加一 sbit led= P1^0; void Timer0_Init(); /******************************************** 定时器0初始化函数,16位定时器,60ms溢出一次,开启中断 ********************************************/ void Timer0_Init(){ TMOD=0x01; //模式设置,0b0000 0001,定时器0,工作模式1,16位定时器 (M1=0,M0=1) ET0=1; //开启定时器0中断 TH0=0x15; //60ms溢出 TL0=0xA0; // TR0=1; //使能定时器0 } void main(){ led=0; Timer0_Init(); EA=1; //开总中断 while(1){ if(cnt_60ms==15){ led=~led;//LED翻转 cnt_60ms=0; } } } void Timer0_In() interrupt 1 { TH0=0x15; //60ms溢出 TL0=0xA0; // cnt_60ms++; //计数加1 }
定时器2,自动装载模式
/**********************51单片机学习例程************************ * 平台:Keil U4 + STC89C52 * 名称:P1口控制流水灯闪烁 * 编写:Tony * 日期:2022-1-23 * QQ : 674749794 * 晶体:12MHZ * 变更记录:无 ******************************************************************/ #include <reg52.h> unsigned int cnt; //定义该变量为计数用变量,每隔60ms,该变量加一 sbit led= P1^0; void Timer0_Init(); /******************************************** 定时器0初始化函数,16位定时器,0.25ms溢出一次,开启中断 ********************************************/ void Timer0_Init(){ TMOD=0x02; //模式设置,0b0000 0010,定时器0,工作模式2,8位定时器 (M1=1,M0=0) ET0=1; //开启定时器0中断 TH0=0x06; //0.25ms溢出 TL0=0x06; // TR0=1; //使能定时器0 cnt=0; } void main(){ led=0; Timer0_Init(); EA=1; //开总中断 while(1){ if(cnt==1200){ //300ms led=~led;//LED翻转 cnt=0; } } } void Timer0_In() interrupt 1 { cnt++; //计数加1 }