第六章、stc89c52单片机中的定时器和中断系统介绍

1、定时器介绍

定时器介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成 定时器作用: (1)用于计时系统,可实现软件计时,或者使程序每隔一固定时间完成一项操作 (2)替代长时间的Delay,提高CPU的运行效率和处理速度 (…)

1.1 STC89C52单片机中定时器资源

  • 定时器个数:3个(T0、T1、T2),T0和T1与传统的51单片机兼容,T2是此型号单片机增加的资源
  • 注意:定时器的资源和单片机的型号是关联在一起的,不同的型号可能会有不同的定时器个数和操作方式,但一般来说,T0和T1的操作方式是所有51单片机所共有的
  • 定时器在单片机内部就像一个小闹钟一样,根据时钟的输出信号,每隔“一秒”,计数单元的数值就增加一,当计数单元数值增加到“设定的闹钟提醒时间”时,计数单元就会向中断系统发出中断申请,产生“响铃提醒”,使程序跳转到中断服务函数中执行

1.2 定时器工作模式:

STC89C52的T0和T1均有四种工作模式:     

  1. 模式0:13位定时器/计数器     
  2. 模式1:16位定时器/计数器(常用,主要介绍这一种模式)     
  3. 模式2:8位自动重装模式     
  4. 模式3:两个8位计数器

工作模式1框图:

1.3 定时器/计数器工作模式寄存器 TMOD

1.4 定时器/计数器控制寄存器TCON

 

2、中断系统介绍

中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的。
当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。实现这种功能的部件称为中断系统,请示CPU中断的请求源称为中断源。微型机的中断系统- - 般允许多个中断源,当几个中断源同时向CPU请求中断,要求为它服务的时候,这就存在CPU优先响应哪--个中断源请求的问题。通常根据中断源的轻重缓急排队,优先处理最紧急事件的中断请求源,即规定每--个中断源有一个优先级别。CPU总是先响应优先级别最高的中断请求。

当CPU正在处理--个中断源请求的时候(执行相应的中断服务程序),发生了另外-一个优先级比它还高的中断源请求。如果CPU能够暂停对原来中断源的服务程序,转而去处理优先级更高的中断请求源,处理完以后,再回到原低级中断服务程序,这样的过程称为中断嵌套。这样的中断系统称为多级中断系统,没有中断嵌套功能的中断系统称为单级中断系统

2.1 STC89c52中断资源

  • 中断源个数:8个(外部中断0、定时器0中断、外部中断1、定时器1中断、串口中断、定时器2中断、外部中断2、外部中断3)
  • 中断优先级个数:4个
  • 中断号:

2.2 STC89C52系列单片机中断结构

2.3 控制中断允许寄存器IE和XICON

STC89C52系列单片机CPU对中断源的开放或屏蔽,每一个中断源是否被允许中断,是由内部的中断允许寄存器IE(地址为A8H)和XICON(地址为C0H)控制的。寄存器IE的格式如下:

2.3.1 中断允许寄存器IE和XICON

  •  EA:使能端,相当于中断系统总开关。EA=1,CPU开放中断;EA=0,CPU屏蔽所有中断申请。
  • ET0:定时器T0的溢出中断允许位。ET0=1,允许T0中断;ET0=0,禁止T0中断。
  • EX1:外部中断0的中断允许位。EX0=1,允许中断;EX0=0,禁止中断。
  • ES:串行口1中断允许位。ES=1,允许串行口1中断;ES=0,禁止串行口1中断

 2.3.2 中断优先级控制寄存器IP/XICON和IPH

 

中断系统和定时器相互联系:

定时器 TL0和TH0计数满溢出时(0-65535),会将TF0会标记溢出,送给中断系统(interrupt)

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基本的STC89C52RC利用定时器定时中断实现的时钟代码,可以显示时、分、秒。代码使用了6个共阳极数码管进行显示。 ```c #include <reg52.h> unsigned char code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; // 数码管显示表 unsigned char second = 0, minute = 0, hour = 0; // 秒、分、小时 void delay(int x) // 延时函数 { int i, j; for(i = x; i > 0; i--) for(j = 110; j > 0; j--); } void dis_num() // 数码管显示函数 { unsigned char a, b, c, d; a = hour / 10; // 十位小时 b = hour % 10; // 个位小时 c = minute / 10; // 十位分钟 d = minute % 10; // 个位分钟 P2 = 0x80; // 第一位数码管 P0 = table[a]; delay(5); P2 = 0x40; // 第二位数码管 P0 = table[b]; delay(5); P2 = 0x20; // 第三位数码管 P0 = table[c]; delay(5); P2 = 0x10; // 第四位数码管 P0 = table[d]; delay(5); } void timer0() interrupt 1 // 定时器0中断函数 { TH0 = (65536 - 50000) / 256; // 50ms计时 TL0 = (65536 - 50000) % 256; second++; // 秒加1 if(second == 60) // 秒满60进位 { second = 0; minute++; if(minute == 60) // 分满60进位 { minute = 0; hour++; if(hour == 24) // 时满24归零 { hour = 0; } } } dis_num(); // 数码管显示 } void init() // 初始化函数 { TMOD = 0x01; // 设置为定时器0模式1 TH0 = (65536 - 50000) / 256; // 50ms计时 TL0 = (65536 - 50000) % 256; EA = 1; // 总中断允许 ET0 = 1; // 定时器0中断允许 TR0 = 1; // 定时器0启动 } void main() { init(); // 初始化 while(1); // 循环等待中断 } ``` 需要注意的是,定时器中断时间和数码管显示的延时时间需要根据具体硬件情况进行调整,以保证实际效果正确。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值