STC89C52学习笔记(六)

STC89C52学习笔记(

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

一、定时器

1. 作用

①用于计时

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

2. 数目

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

STC89C52有三个定时器: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单片机学习视频

侵权联系删除!

  • 30
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值