题目要求2秒变换一次LED1的状态,那么LED1的状态变换频率就是0.5Hz,也就是每秒亮一次灭一次。

系统时钟的频率为16M,分频系数为32,那么定时器的时钟频率为16M/32=500kHz。

如果要实现每2秒变换一次LED1的状态,就可以设置定时器的计数值为定时时间除以时钟周期,也就是:

定时器计数值 = 定时时间 / 时钟周期 = 2s / (1/500kHz) = 1,000,000

在定时器溢出中断中,我们可以编写一个计数器count,每次定时器溢出就将count加1。当count的值累加到1时,表示已经过了2秒的时间,可以控制LED1状态翻转一次,并将count清零。

以下是一个简单的实现方式:

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

sbit LED1=P1^0; // LED1连接在单片机的P1.0上

uint count; // 定义一个计数器变量

void main()
{
    TMOD = 0x01; // 定时器T0工作在模式1(16位定时器)下
    TH0 = 0xFC; // 定时器T0的初值,注意是高八位
    TL0 = 0x18; // 定时器T0的初值,注意是低八位

    ET0 = 1; // 允许定时器T0的溢出中断
    EA = 1; // 允许全局中断

    TR0 = 1; // 启动定时器T0

    while (1)
    {
        // 主程序中可以进行其他操作
    }
}

void timer0() interrupt 1
{
    TH0 = 0xFC; // 重新设置定时器T0的初值
    TL0 = 0x18;

    count++; // 计数器加1

    if (count == 1000000) // 累加到100万就表示已经过了2秒
    {
        count = 0; // 计数器清零
        LED1 = !LED1; // 控制LED1状态翻转一次
    }
}

以上代码中,0xFC18是经过计算得出的初值,用于设置定时器T0的初值,从而得到2秒的定时时间。每次定时器溢出就将count加1,累加到100万就表示已经过了2秒,此时将count清零,并控制LED1状态翻转一次。通过不断地反复执行该逻辑,就可以实现2秒变换一次LED1的状态的要求。