51 单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。
作用:1、用于计时;2、替代长时间的Delay,提高CPU 运行效率和处理速度。
定时器个数:3个(T0、T1、T2),T0和T1与传统的51单片机兼容,T2是此型号单片机增加的资源。
单片机通过配置寄存器来控制内部线路的链接。
一、TMOD
M0 1 M1 0 :16位定时器/计数器
TMOD:0x01 (不可位寻址)
可位寻址:可以对每一位进行单独赋值;不可位寻址:只能进行整体赋值。
二、TCON
如果GATE=0就不用管IE0和IT0(不影响)
三、TH0/TL0
256=2^8 对应一个字节8位
TH0=64535/256; TL0=64535%256; 64535(计数1000微秒->1毫秒)
四、中断系统
在中断函数中不要执行过长的任务。
ET0=1 EA=1 PT0=0
五、计数1秒
设置T0Count
unsigned int T0Count;void Timer0_Routine() interrupt 1
{TH0=64536/256;TL0=64536%256;T0Count++;if (T0Count>=1000) {P20=0;}
}
#include <STC89C5xRC.H>void Timer0_Init()
{// TMOD=0x01;TMOD=TMOD&0xF0; //把TMOD第四位清零,高四位不变TMOD=TMOD|0x01;TF0=0;TR0=1;TH0=64536/256;TL0=64536%256;PT0=0;EA=1;ET0=1;
}void main()
{Timer0_Init();while(1){}
}unsigned int T0Count;void Timer0_Routine() interrupt 1
{TH0=64535/256;TL0=64535%256;T0Count++;if (T0Count>=1000) {T0Count=0;P20=~P20;}
}
初始化-进行while-计时-中断程序(改变灯状态)-重新进入while/计时-......
这个代码中没有中断的配置,要自己加一下。
六、定时器自动流水灯
1、timer0.c
#include <STC89C5xRC.H>/*** @brief 定时器0初始化,1毫秒*/void Timer0Init(void) //1毫秒@11.0592MHz
{TMOD &= 0xF0; //设置定时器模式TMOD |= 0x01; //设置定时器模式TL0 = 0x66; //设置定时初值TH0 = 0xFC; //设置定时初值TF0 = 0; //清除TF0标志TR0 = 1; //定时器0开始计时PT0=0;EA=1;ET0=1;
}/*
void Timer0_Routine() interrupt 1 //一般放到main中
{static unsigned int T0Count; //加了static不会销毁TL0 = 0x66; //设置定时初值TH0 = 0xFC; //设置定时初值T0Count++;if (T0Count>=1000) {T0Count=0;P20=~P20;}
}
*/
2、timer0.h
# ifndef __TIMER0_H__
# define __TIMER0_H__void Timer0Init(void);# endif
3、key.h流水灯
# ifndef __KEY_H__
# define __KEY_H__extern unsigned char pattern;
void key();# endif
extern 声明告诉编译器:这个变量在程序的其他地方已经定义。(声明一个外部变量 )
4、key.c
unsigned char pattern=0xFE;void key()
{pattern=(pattern<<1)|0x01;if(pattern==0xFF) pattern=0xFE;
}
5、main.c
#include <STC89C5xRC.H>
#include "timer0.h"
#include "key.h"void main()
{Timer0Init();while(1){}
}void Timer0_Routine() interrupt 1 //一般放到main中
{static unsigned int T0Count; //加了static不会销毁TL0 = 0x66; //设置定时初值TH0 = 0xFC; //设置定时初值T0Count++;if (T0Count>=1000) {T0Count=0;key();P2=pattern;}
}