目录
1.定时器
2. STC89C52定时器资源
3.定时器框图
4. 定时器工作模式
5.中断系统
1)介绍
2)流程图:编辑
3)STC89C52中断资源
4)定时器和中断系统
5)定时器的相关寄存器
6.按键控制LED流水灯模式
1.定时器
介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成
作用:
(1)用于计时系统,可实现软件计时,或者使程序每隔一固定时间完成一项操作
(2)替代长时间的Delay,提高CPU的运行效率和处理速度(避免按键不灵敏)
(…)
2. STC89C52定时器资源
定时器个数:3个(T0、T1、T2), T0 和 T1 与传统的51单片机兼容,T2是此型号单片机增加的资源
注意:定时器的资源和单片机的型号是关联在一起的,不同的型号可能会有不同的定时器个数和操作方式,但一般来说,T0和T1的操作方式是所有51单片机所共有的
3.定时器框图
提供计数单元的时钟脉冲 时钟计数 产生中断,执行定时任务
定时器在单片机内部就像一个小闹钟一样,根据时钟的输出信号,每隔“一秒”,计数单元的数值就增加一,当计数单元数值增加到“设定的闹钟提醒时间”时,计数单元就会向中断系统发出中断申请,产生“响铃提醒”,使程序跳转到中断服务函数中执行
4. 定时器工作模式
STC89C52的T0和T1均有四种工作模式:
模式0:13位定时器/计数器
模式1:16位定时器/计数器(常用)
模式2:8位自动重装模式
模式3:两个8位计数器
工作模式1框图:
1)TH0 TL0 计数系统最多可以存65535
2)TF0为标志位,通过标志位向中断系统申请中断
3)时钟提供脉冲,一个脉冲使计数系统加 1 ,当计数系统到达65535后会溢出(计数系统为 0 )通过TF0产生中断
4)/12或/6 为分频 如:12MHZ/12 ==1 MHZ
SYSclk:系统时钟,即晶振周期,本开发板上的晶振为12MHz (system clock)
T0 Pin :单片机外部接口
当有外部引脚来提供时钟时,定时器为计数器
5.中断系统
1)介绍
2)流程图:
3)STC89C52中断资源
中断源个数:8个(外部中断0、定时器0中断、外部中断1、定时器1中断、串口中断、定时器2中断、外部中断2、外部中断3)
中断优先级个数:4个
中断号:
注意:中断的资源和单片机的型号是关联在一起的,不同的型号可能会有不同的中断资源,例如中断源个数不同、中断优先级个数不同等等
4)定时器和中断系统
为了方便理解,这里使用的中断系统图是传统51单片机的图,STC89C52的中断系统图可参考手册
从左下往右分别为 非门(数据取反) 或门(有1 则为1) 与门(有0则为0)
5)定时器的相关寄存器
寄存器是连接软硬件的媒介,在单片机中寄存器就是一段特殊的RAM存储器,一方面,寄存器可以存储和读取数据,另一方面,每一个寄存器背后都连接了一根导线,控制着电路的连接方式寄存器相当于一个复杂机器的“操作按钮”
6.按键控制LED流水灯模式
#include <REGX52.H>
#include"Timer0.h" //main.c
#include"Key.h"
#include<INTRINS.H>
unsigned char KeyNum,LEDMode;
void main()
{
P2=0xfe;
Timer0Init();
while(1)
{
KeyNum=Key();
if(KeyNum)
{
if(KeyNum==1)
{
LEDMode++;
if(LEDMode>=2)LEDMode=0;
}
}
}
}
void Timer0_Routine() interrupt 1
{
static unsigned int T0Count;
TL0 = 0x18;
TH0 = 0xFC;
T0Count++;
if(T0Count>=500)
{
T0Count=0;
if(LEDMode==0)
P2=_crol_(P2,1);
if(LEDMode==1)
P2=_cror_(P2,1);
}
}
#include <REGX52.H>
void Timer0Init(void) //Timer0.c
{
TMOD &= 0xF0;
TMOD |= 0x01;
TL0 = 0x18;
TH0 = 0xFC;
TF0 = 0;
TR0 = 1;
ET0=1;
EA=1;
PT0=0;
}
#ifndef ___Timer0__ //防止重定义
#define ___Timer0__ //Timer0.h
void Timer0Init(void);
#endif
#include <REGX52.H> //Key.c
#include"Delay.h"
unsigned char Key()
{
unsigned char KeyNumber = 0;
if(P3_1==0){Delay(20);while(P3_1==0);Delay(20);KeyNumber=1;}
if(P3_0==0){Delay(20);while(P3_0==0);Delay(20);KeyNumber=2;}
if(P3_2==0){Delay(20);while(P3_2==0);Delay(20);KeyNumber=3;}
if(P3_3==0){Delay(20);while(P3_3==0);Delay(20);KeyNumber=4;}
return KeyNumber;
}
#ifndef ___Key__ //防止重定义
#define ___Key__ //Key.h
unsigned char Key();
#endif
#include <REGX52.H>
void Delay(unsigned int xms) //延时 xms ms
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
} while (--i);
xms--;
}
}
#ifndef __Delay_H //防止重定义
#define __Delay_H //Delay.h
void Delay(unsigned int xms);
#endif
注意:可位寻址可以对单独的位进行赋值(TCON),不可位寻址只能整体赋值(TMOD)
谢谢观看