STC89C52RC定时器中断机制与实现方法

版权申诉
0 下载量 55 浏览量 更新于2024-11-08 收藏 767B RAR 举报
资源摘要信息: "STC89C52RC 微控制器的定时器中断机制及实现细节" STC89C52RC是一款8位微控制器,属于STC系列单片机中的一员。它基于经典的8051内核,具有丰富的I/O口、定时器/计数器以及串行通信接口等特点,广泛应用于工业控制、智能仪表、家用电器等领域。 知识点详细说明: 1. STC89C52RC简介: STC89C52RC是一款带有8KB Flash和256字节RAM的单片机,拥有3个定时器/计数器,以及5个中断源。其工作频率最高可达40MHz,具有较好的性能和较高的运行速度。STC89C52RC的定时器/计数器可以被配置为定时器模式或计数器模式,用于执行定时或计数任务。 2. 定时器中断概念: 在微控制器中,定时器中断是一种特殊的中断服务,用于在设定的时间间隔内执行特定的代码。定时器中断允许单片机在无需连续轮询的情况下,周期性地执行中断服务程序(ISR),从而有效地管理时间相关的任务。 3. STC89C52RC的定时器: STC89C52RC有三个定时器,分别是定时器0、定时器1和定时器2。它们都可以作为定时器和计数器使用。每个定时器都有一个对应的控制寄存器和一个16位的计数器寄存器。 4. 定时器中断的配置: - 定时器中断的使能:要使用定时器中断,首先需要在中断允许寄存器IE中设置相应的中断使能位(ET0、ET1、ET2)。 - 定时器模式的设置:根据需求选择定时器模式。STC89C52RC的定时器模式包括模式0(13位定时器/计数器)、模式1(16位定时器/计数器)、模式2(8位自动重装定时器/计数器)等。 - 定时器初值的设定:根据定时需求设定定时器初值,该值加载到定时器的计数器寄存器中。 - 定时器启动:通过设置TCON寄存器中的TR0、TR1或TR2位来启动定时器。 5. 中断服务程序(ISR): 中断发生时,CPU会暂停当前正在执行的任务,跳转到相应的中断服务程序执行。编写ISR时,应确保其执行时间足够短,以避免影响其他中断的响应。 6. 定时器中断例程的编写: 在STC89C52RC中,编写定时器中断例程需要遵循特定的步骤: - 初始化定时器:选择定时器模式、设定定时初值。 - 启动定时器:设置定时器运行控制位。 - 编写中断服务程序:设置中断标志位、编写具体的业务逻辑代码。 - 全局中断使能:通过设置EA位使能全局中断。 7. 定时器中断的优先级: STC89C52RC支持中断优先级设置,可以使用IP寄存器来设置不同中断源的优先级,这样可以更灵活地控制中断的响应顺序。 8. hex文件的应用: "seg_timer.hex"文件是STC89C52RC的程序代码经过编译后生成的十六进制文件,用于通过编程器或ISP下载到单片机中。该文件包含了定时器中断配置和ISR等必要信息。 通过以上内容的介绍,我们可以看到STC89C52RC定时器中断的配置方法、中断服务程序的编写以及实际应用中的操作步骤。掌握了这些知识点,用户便能够在开发中合理利用STC89C52RC的定时器中断功能,以实现精确的时间管理和控制任务。

#include <reg52.h> unsigned char Table[] = {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71}; unsigned char Table_F[] = {0x8e}; sbit SEG1 = P3^7; sbit SEG2 = P3^6; sbit SEG3 = P3^5; sbit SEG4 = P3^4; sbit Irin = P3^2; sbit Irout = P3^3; sbit Key = P2^0; sbit SPK = P1^0; sbit LED = P2^7; unsigned char People = 0; unsigned char ALL = 0; #define uchar unsigned char #define uint unsigned int uint Num = 0; void Timer0Init(void); //50??@11.0592MHz void delay(unsigned int i) { char j; for(i; i > 0; i--) //??6000*200? for(j = 200; j > 0; j--); } void Delay_ms_89xx(unsigned int n_ms) //STC89Cxx ?? @11.0592MHz { unsigned char i, j; for(;n_ms>0;n_ms--) { i = 2; j = 176; do { while (--j); } while (--i); } } void main() { unsigned char count_sta = 0; unsigned char delay_time = 0; // IT0 = 1; //set INT0 int type (1:Falling 0:Low level) // EX0 = 1; //enable INT0 interrupt // EA = 1; //open global interrupt switch LED = 0; while(1) { //???? if(Key == 0) { People = 0; ALL = 0; } //???? if(Irin == 0) { Delay_ms_89xx(50); if(Irin == 0) { People++; ALL++; LED = 1; SPK = 0; while(Irin == 0); Delay_ms_89xx(500);Delay_ms_89xx(500); SPK = 1; LED = 0; } } if(Irout == 0) { Delay_ms_89xx(50); if(Irout == 0) { if(People > 0) { People --; } while(Irout == 0); } } //?? P0 = 0xff;//?? SEG1 = 1; SEG2 = 1; SEG3 = 1; SEG4 = 1; delay(2); SEG1 = 0; P0 = ~Table[ALL/10]; delay(2); P0 = 0xff;//?? SEG1 = 1; SEG2 = 1; SEG3 = 1; SEG4 = 1; delay(2); SEG2 = 0; P0 = ~Table[ALL%10]; delay(2); P0 = 0xff;//?? SEG1 = 1; SEG2 = 1; SEG3 = 1; SEG4 = 1; delay(2); SEG3 = 0; P0 = ~Table[People/10]; delay(2); P0 = 0xff;//?? SEG1 = 1; SEG2 = 1; SEG3 = 1; SEG4 = 1; delay(2); SEG4 = 0; P0 = ~Table[People%10]; delay(2); } } //External interrupt0 service routine void exint0() interrupt 0 //(location at 0003H) { Delay_ms_89xx(50); Num++; }程序逐步分析

2023-06-03 上传