特殊功能寄存器IE=85H是8051微控制器中的一个寄存器,它用于控制中断的开关和优先级。IE寄存器的二进制位对应着不同的中断源,通过设置IE寄存器的相应位可以开启或关闭对应的中断源。

在IE寄存器中,二进制位0表示开放外部中断0,二进制位1表示开放外部中断1,二进制位2表示开放定时器0中断源,二进制位3表示开放定时器1中断源,二进制位4表示开放串口中断源,而二进制位5表示开放定时器溢出中断源。因此,IE=85H表示开启了外部中断0和定时器溢出中断源。

针对定时器溢出中断源的实现方式,我们可以通过以下示例代码进行说明:

#include <reg51.h>
#include <intrins.h>

#define FOSC 11059200L
#define BAUD 9600
#define TIMER0_VALUE (65536 - (FOSC / 12 / 1000)) // 1ms计时器中断

volatile unsigned char counter = 0; // 计时器变量

void init_timer0()
{
    TMOD &= 0xF0; // 清除定时器0的控制位
    TMOD |= 0x01; // 设置为定时器模式1

    TH0 = TIMER0_VALUE / 256; // 定时器初值
    TL0 = TIMER0_VALUE % 256; // 定时器初值

    ET0 = 1; // 开启定时器0中断
    TR0 = 1; // 启动定时器0
    EA = 1; // 全局中断使能
}

void timer0_isr() interrupt 1 // 定时器0中断服务程序
{
    TH0 = TIMER0_VALUE / 256; // 重新设置定时器初值
    TL0 = TIMER0_VALUE % 256; // 重新设置定时器初值

    counter++; // 计时器自增

    if (counter >= 1000) // 1秒后输出计数器的值
    {
        counter = 0;
        printf("1 second passed.\n");
    }
}

void main()
{
    init_timer0(); // 初始化定时器0

    while (1);
}

在上述示例代码中,我们首先定义了一个计时器变量counter,然后通过init_timer0()函数初始化了定时器0,并开启了定时器0的中断。在定时器0中断服务程序timer0_isr()中,我们重新设置了定时器初值,并将计时器自增。当计时器达到1秒时,输出提示信息。

在主函数main()中,我们只是简单地调用了init_timer0()函数进行定时器的初始化,并通过一个无限循环来保持程序运行。当计时器溢出时,定时器0中断服务程序timer0_isr()会被自动触发,并进行计时器的计数。

通过上述示例代码,我们可以看到,定时器溢出中断源的实现方式非常简单直接,只需要开启定时器中断,并通过定时器中断服务程序来实现具体的计时功能即可。