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单片机学习视频

侵权联系删除!

相关推荐
澄澈i15 分钟前
设计模式学习[9]---模板方法模式
c++·学习·设计模式·模板方法模式
池佳齐36 分钟前
《AI大模型开发笔记》——Prompt提示词最佳实践
人工智能·笔记·prompt
Ice16637 分钟前
算法学习笔记(十):位运算、数论等
笔记·学习
ZZZ_O^O1 小时前
【贪心算法入门第一题——860.柠檬水找零】
学习·算法·leetcode·贪心算法
我们的五年1 小时前
【Linux课程学习】:命令行参数,环境变量
linux·c语言·学习
辞丶1761 小时前
STM32基于HALL库的串口以及DMA(串口总篇)
stm32·单片机·嵌入式硬件
梅子酱~1 小时前
Vue 学习随笔系列十七 -- 表格样式修改
javascript·vue.js·学习
相醉为友2 小时前
003 STM32基础、架构以及资料介绍——常识
stm32·单片机·嵌入式硬件
尘佑不尘2 小时前
蓝队基础,了解企业安全管理架构
数据库·笔记·安全·web安全·蓝队
HZU_Puzzle2 小时前
【6】STM32·FreeRTOS·列表和列表项
stm32·单片机·嵌入式硬件