51单片机-第四节-定时器

一、定时器:

1.介绍:

单片机内部实现的计时系统。

作用:代替长时间Daley,提高cpu效率。

数量:至少2个,T0,T1,T2等。其中T0,T1为所有51单片机共有,T2等为不同单片机特化。

工作模式:(只讲模式1)

模式0:13位定时器,计数器; 模式1:16位定时器,计数器(常用);

模式2:8位自动重装模式; 模式3:两个8位计数器

2.模式1原理:

时钟每一秒释放一个脉冲,使计数单元加一,计数单元到达最大值2^16,再加一变为0,且TF0变为1,使中断系统执行中断。

(1)时钟:

本单片机晶振周期12MHz,如果链接12分频(即+12),变为1MHz,每一微秒记一次数。

(2)控制系统:

1为取反,2为y按位或(同为0才为0),3为按位与(同为1才为1)。

本节我们将GATE置为0,则接通与否只由TR0控制,1连通,0断开。(自己推一下)

(3)中断系统:

为cpu处理紧急事件设置,如果出现紧急事件,中断系统会中断当前行动,优先处理紧急事件。

本节令 ET0 = EA = 1,PT0 = 0 即可。(只有一个中断,无所谓优先级)

什么是中断资源?

中断资源是指需要中断时,根据不同的中断源,进入不同的函数,这些函数称为中断资源。

其中,函数内部进行什么操作需自己实现。

注:不同单片机中断资源不同。

本单片机中断资源:

(4)寄存器介绍:(需要哪一个来这里找)

TMOD:定时器模式寄存器

M1,M0为控制模式的,我们运用模式1,令 M1,M0 为 0,1 即可。

TCON:定时器控制寄存器

TL0,TH0,TL1,TH1:计时系统寄存器。

(5)计时原理:

TL0,TH0共16位可计 0 - 65535,每隔1us计数+1。

需通过给TL0,TH0赋初始值,来控制计时时长。

3.定时器模块化:

cpp 复制代码
//定时器0初始化
void Time0_Init()
{
	TMOD &= 0xF0;
	TMOD |= 0x01;//可使前4位保持不变,只改变定时器0对应的后4位
	TF0 = 0;
	TR0 = 1;
	//控制计时时长,1ms计一次
	TH0 = 64535 / 256;
	TL0 = 64535 % 256 + 1;
	//中断系统
	ETO = 1;
	EA = 1;
	PT0 = 0;
}
//定时器模板1s
/*
unsigned int T0Count = 0;
void Timer0_Routine() interrupt 1
{
	T0Count++;
	TH0 = 64535 / 256;
	TH0 = 64535 % 256;
	if (T0Count >= 1000)//计到1s执行一次
	{
		T0Count = 0;
		//需执行的操作

	}
}
*/

二、实战:按键控制LED流水灯

1.循环左移和右移的库函数:

包含头文件 <INTRINS.H>

函数 crol :unsigned char crol(unsigned char a , unsigned char num);

循环左移,将变量a左移num位,到达最高位后返回最低位。

函数 cror :循环右移。

2.设置变量:

cpp 复制代码
unsigned char KeyNum,LEDMode;
//KeyNum --- 检测独立按键状态
//LEDMode --- 控制流水灯模式

3.根据LEDMode控制流水灯:(中断)

cpp 复制代码
//定时器模板1s
void Timer0_Routine() interrupt 1
{
	static unsigned int T0Count = 0;
	T0Count++;
	TH0 = 64535 / 256;
	TL0 = 64535 % 256 + 1;
	if (T0Count >= 1000)//计到1s执行一次
	{
		T0Count = 0;
		//需执行的操作
		if (LEDMode == 0)P2 = _crol_(P2, 1);
		if (LEDMode == 1)P2 = _cror_(P2, 1);
	}
}

4.根据独立按键改变LEDMode:

cpp 复制代码
while (1)
{
	KeyNum = Key();
	if (KeyNum)
	{
		if (KeyNum == 1)
		{
			if (LEDMode == 1)LEDMode = 0;

		}
		if (KeyNum == 2)
		{
			if (LEDMode == 0)LEDMode = 1;
		}
	}

}

5.组合成品:

cpp 复制代码
#include <REGX52.h>
#include"51singlechip.h"
#include<INTRINS.H>

unsigned char KeyNum,LEDMode;

void main()
{
	P_2 = 0xFE;//初始化
	Time0_Init();
	while (1)
	{
		KeyNum = Key();
		if (KeyNum)
		{
			if (KeyNum == 1)
			{
				if (LEDMode == 1)LEDMode = 0;

			}
			if (KeyNum == 2)
			{
				if (LEDMode == 0)LEDMode = 1;
			}
		}

	}
}

//定时器模板1s
void Timer0_Routine() interrupt 1
{
	static unsigned int T0Count = 0;
	T0Count++;
	TH0 = 64535 / 256;
	TL0 = 64535 % 256 + 1;
	if (T0Count >= 1000)//计到1s执行一次
	{
		T0Count = 0;
		//需执行的操作
		if (LEDMode == 0)P2 = _crol_(P2, 1);
		if (LEDMode == 1)P2 = _cror_(P2, 1);
	}
}
相关推荐
yutian06061 小时前
Keil MDK下载程序后MCU自动重启设置
单片机·嵌入式硬件·keil
析木不会编程4 小时前
【小白51单片机专用教程】protues仿真独立按键控制LED
单片机·嵌入式硬件·51单片机
枯无穷肉8 小时前
stm32制作CAN适配器4--WinUsb的使用
stm32·单片机·嵌入式硬件
不过四级不改名6778 小时前
基于HAL库的stm32的can收发实验
stm32·单片机·嵌入式硬件
嵌入式大圣9 小时前
单片机UDP数据透传
单片机·嵌入式硬件·udp
云山工作室9 小时前
基于单片机的视力保护及身姿矫正器设计(论文+源码)
stm32·单片机·嵌入式硬件·毕业设计·毕设
嵌入式-老费9 小时前
基于海思soc的智能产品开发(mcu读保护的设置)
单片机·嵌入式硬件
qq_3975623111 小时前
MPU6050 , 设置内部低通滤波器,对于输出数据的影响。(简单实验)
单片机
liyinuo201711 小时前
嵌入式(单片机方向)面试题总结
嵌入式硬件·设计模式·面试·设计规范
艺术家天选11 小时前
STM32点亮LED灯
stm32·单片机·嵌入式硬件