STC89C52学习笔记(六)

STC89C5 2 学习笔记(

综述:本文讲述了51单片机的定时器和中断,还讲述了如何初始化定时器、编写中断服务函数和完成定时器控制LED闪烁。

一、定时器

1. 作用

①用于计时

②替代长时间的Delay。因为在Delay下,单片机的MCU也被占用着不能执行其他工作,按键检测和其他工作会不灵敏。

2. 数目

不同单片机有不同数目的定时器和操作方式,在使用前可以先查一下数据手册。

STC89C5 2有三个定时器:T0、T1、T2,T0、T1是所有51单片机都有的。

3. 定时器的工作模式

(1)STC89C52的T0和T1均有四种工作模式 :模式0:13位定时器/计数器;模式1:16位定时器/计数器(常用 ;模式2:8位自动重装模式;模式3:两个8位计数器。

(2)工作模式包括:时钟(SySclk是系统时钟,也即是晶振周期,在本单片机上,晶振是12MHz)、计数(最大能计数到65535)、中断。定时器T0和T1工作模式1的框图如下:

思路:定时器→计数→中断。定时器≈小闹钟,当时钟输出信号每隔一秒,计数加一,当加到指定时间,计数单元向中断系统发送申请,产生中断,程序跳转到中断服务程序中,执行完再回到原来的程序。

二、中断

1.定义

中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的。

2.数目

一般51单片机有8个中断源:外部中断0、定时器0中断、外部中断1、定时器1中断、串口中断、外部中断2、外部中断3,其中外部中断2、外部中断3不是每个51单片机都有的。

3.优先级

每一个中断源有一个优先级别,CPU总是先响应优先级别最高的中断请求,51单片机共有4个中断优先级。

4.中断号

三、定时器控制LED闪烁

1. 初始化定时器0

初始化定时器0,需要对以下寄存器进行赋值,使之实现以下通道。

①配置TMOD寄存器。

使定时器工作在定时器0(T0),所以,TMOD寄存器应配置为0000 0001,

②配置TCOD寄存器。

当TF为1时,会产生中断,于是应该将TF0配置为0。配置TR0为1,使T0开始计数,IE0和IT0控制外部中断引脚。

③给计时器赋初值。

由于计时器可以计数2^16-1=65535次,每次1us,总共65535us。这里给高位TH0=x/256,低位TL0=x%256,x是需要计数的值。

④配置ET0=1,EA=1,PT0=0。

代码如下:

复制代码
void Timer0_Init()
{
	TMOD=0x01;
	
	TF=0;
	TR0=1;
	TH0=65535/256;
	TL0=65535%256;
	
	ET0=1;
	EA=1;
	PT0=0;
}

2. 编写中断程序

①查询定时器0的中断号为interrupt 0。

②计算计时时间,编写中断程序。若是每隔1sLED状态取反一次,即可使计数器0达成1ms的计数,再在函数中循环1000次,达成1s的时间。由于65535-64535=1000us=1ms,即可使"TH0=64535/256;TL0=64535%256;"。程序如下:

复制代码
void Timer0_Routine() interrupt 1
{
	TH0=64535/256;//1000us,也即是1ms
	TL0=64535%256;
	T0Count++;

	if(T0Count>=1000)//每隔一秒P2_0取反一次
	{
		T0Count=0;
		P2_0=~P2_0;
	}
}

拓展:

①修改TMOD的配置函数。

以上的程序虽然可以完成相应的要求,但是TMOD寄存是不可位寻址,也即是,在这种配置下(TMOD=0x01),只能实现寄存器0这种模式,寄存器1没办法使用。所以这里可以用与或式赋值法 ,将TMOD配置为TMOD=TMOD&0xF0 ,保留高4位的值,把第四位清零;TMOD=TMOD|0xF0,保留高七位的值,将最后一位置1。

所以,可以把初始化的代码更改位

复制代码
void Timer0_Init()
{
	TMOD=TMOD&0xf0;
	TMOD=TMOD|0x01;
	TF0=0;
	TR0=1;
	TH0=64535/256;//1000us,也即是1ms
	TL0=64535%256;
	
	ET0=1;
	EA=1;
	PT0=0;
}

②简便版配置计数器初始化。

运用"stc-isp"软件,点击"定时器计数器",按照以下配置,再加上ET0=1,EA=1,PT0=0,即可生成1ms的定时器0计数初始化。

复制代码
void Timer0_Init()
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x18;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时

	ET0=1;
	EA=1;
	PT0=0;
}

四、模块化定时器0

将定时器模块化可以方便日后的使用。建立.c和.h文件,将定时器0初始化函数和定时器0中断函数赋值到.c文件中,并添加函数相应说明。在.h文件中,添加防重复定义和函数的声明。


参考视频:51单片机学习视频

侵权联系删除!

相关推荐
天空'之城5 分钟前
单片机基础核心知识点汇总(三十七)
单片机·嵌入式硬件
Groundwork Explorer9 分钟前
ESP32-C3 SuperMini 排查WIFI收发故障
python·单片机·嵌入式硬件·mcu
糖糖单片机设计26 分钟前
基于STM32的远程宠物自动投喂系统
人工智能·stm32·51单片机·语音识别·智能硬件
wixzjsh37 分钟前
基于STC89C52的温度采集与监控系统设计与实现
单片机
谢白羽38 分钟前
MiniMax-H3 : 4卡 H20-3e一套权重部署实践/8卡H200部署优化实测
笔记·llm·论文·大模型部署·sglang
志尊宝44 分钟前
Vue3 零基础每日笔记(024):组件的创建与使用——从 import 到自动导入
前端·vue.js·笔记·前端框架·html5
H_oRIZoN_1 小时前
Linux入门DAY42【51 单片机】DS18B20 数字温度传感器完整解析(单总线原理 + 时序 + 读取流程)
linux·单片机·linux应用编程
智购无人售货机厂家1 小时前
2026自动售货机品类拓展逻辑:从饮料零食到鲜食药品文创的工程实践~YH
服务器·人工智能·单片机·线性代数·矩阵
m4Rk_1 小时前
【论文阅读】Agent 记忆机制(67):MemPO——用记忆级信用分配训练 Agent 主动管理长程上下文
论文阅读·人工智能·学习·开源·github
chnyi6_ya1 小时前
论文阅读笔记:VBVR-Pro 把「用生成来推理」变成一个可训练、可验证、可优化的闭环
论文阅读·笔记