51单片机中断与计时器
# 一、定时器初始化
1、配置下图中各寄存器
1. 定时器/计数器控制寄存器TCON
? 该寄存器可以进行位寻址。TCON寄存器用来控制定时器的启、停,标志定时器的溢出和中断情况。单片机复位时TCON全部清0。这个寄存器的给位定义如下表所示。其中TF1、TR1、TF0和TR0位用于定时器/计数器的设置。(IE1、IT1、IE0和IT0位用于外部中断的设置。【暂时不需要了解,且现在只单了解TF0、TR0即可】)
TF0—定时器0溢出标志位
TR0—定时器0运行控制位
TF0和TRO设置在文章后面有快速方法
2.定时器、计数器模式控制寄存器TMOD
TMOD:
TMOD是定时器、计数器模式控制寄存器(TIMER/COUNTER MODE CONTROL REGISTER)
不能位寻址,TMOD用来确定定时器T0和T1的工作方式及功能选择,单片机复位时,TMOD全部被清0,TMOD寄存器的定义如下。
定时器/计数器工作方式寄存器TMOD
这个寄存器的高4位用来设置定时器T1,低4位用来设置定时器T0。
M1:M0—工作方式选择位
每个定时器/计数器由4中工作方式,他们由M1和M0设定,对应关系如下表所示。
定时器/计数器的4种工作方式
M1 | M0 | 工作方式 |
---|
0 | 0 | 方式0:13位定时器/计数器 | 0 | 1 | 方式1:16位定时器/计数器 (常用) | 1 | 0 | 方式2:8位初始值自动重置的8位定时器/计数器 | 1 | 1 | 方式3:仅适用于T0,分成两个8位计数器,T1停止计数 |
模式0(13位定时器/计数器)(很少用)
将定时器设置成模式0时类似8048定时器,即8位计数器带32分频的预分频器。下图所示
模式1
(本不想放模式0的,但我发现我模式1的笔记记模式0上了,哈哈)
TMOD设置在文章后面有快速方法
3.TH0及TL0
TH0和TL0是用于设置定时初始值,让每次定时器记我们想要的特定时间,设置方法可在STC-ISP中快捷、准确的复制(哈哈,有现成的)
前文讲到的快速方法:
2、中断设置
最后的定时器初始化程序:
void Timer0_Init()
{
TMOD &= 0xF0;
TMOD |= 0x01;
TL0 = 0x66;
TH0 = 0xFC;
TF0 = 0;
TR0 = 1;
ET0 = 1;
EA = 1;
PT0 = 0;
}
二、中断程序
例子一:
每隔一秒P2_0控制的LED亮一次
例子二:
按键控制流水灯模式,按下(同一个个按键,P3_1)按键,流水灯转换流动方向
main.c
#include <REGX52.H>
#include <Timer0.H>
#include <Key.H>
int LedMode;
void main()
{
Timer0_Init();
while(1)
{
LedMode = Key();
}
}
int i = 0;
void Timer0_Routine() interrupt 1
{
char LedMode1[] ={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
static Timer0Count;
Timer0Count++;
if(Timer0Count == 1000)
{
P2 = LedMode1[i];
if (LedMode == 0)
{
i++;
if(i >= 8 ){i = 0;}
}
if (LedMode == 1)
{
i--;
if(i <= -1 ){i = 7;}
}
Timer0Count =0;
}
TL0 = 0x66;
TH0 = 0xFC;
}
Key.c
#include <REGX52.H>
#include <delay.H>
int KeyNumber = 0;
int Key()
{
if (P3_1 == 0){delay(20);while(P3_1 == 0);delay(20);KeyNumber = ~KeyNumber;
if(KeyNumber == -1){KeyNumber = 1;}
if(KeyNumber == -2){KeyNumber = 0;}
}
return KeyNumber;
}
Timer0.c
#include <REGX52.H>
void Timer0_Init()
{
TMOD &= 0xF0;
TMOD |= 0x01;
TL0 = 0x66;
TH0 = 0xFC;
TF0 = 0;
TR0 = 1;
ET0 = 1;
EA = 1;
PT0 = 0;
}
delay.c
void delay(int x)
{
unsigned char i, j;
for (;x > 0;x--)
{
i = 2;
j = 119;
do
{
while (--j);
} while (--i);;
}
}
.h文件不再一一列出,只列出Key.h,其余格式一样
#ifndef __KEY_H__
#define __KEY_H__
int Key(void);
#endif
例子二全部文件列表:
注:本文程序使用测试单片机为STC89C52RC
|