吧唧吧唧的吃. . . . . . . . .

51单片机中断与计时器


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()		//1毫秒@11.0592MHz
{			
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x66;		//设置定时初始值
	TH0 = 0xFC;		//设置定时初始值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	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()		//1毫秒@11.0592MHz
{
				
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x66;		//设置定时初始值
	TH0 = 0xFC;		//设置定时初始值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0 = 1;
	EA  = 1;
	PT0 = 0;
}

delay.c

void delay(int x)    //0.001 s
{	
	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

例子二全部文件列表:


文章作者: 668rose
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 668rose !
评论
  目录