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;
}
}