IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 51单片机中断与计时器 -> 正文阅读

[嵌入式]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种工作方式

M1M0工作方式
00方式0:13位定时器/计数器
01方式1:16位定时器/计数器 (常用)
10方式2:8位初始值自动重置的8位定时器/计数器
11方式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

例子二全部文件列表:

注:本文程序使用测试单片机为STC89C52RC

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-09-15 02:09:57  更:2022-09-15 02:11:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 22:52:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码