#include <reg51.h>

sbit wave = P1^0;              // Output pin

void delay_1ms(void)           // Half period for 500 Hz
{
    TH1 = 0xFC;
    TL1 = 0x66;
    TR1 = 1;                   // Start Timer 1
    while (TF1 == 0);          // Poll overflow flag
    TR1 = 0;                   // Stop Timer 1
    TF1 = 0;                   // Clear flag
}

void delay_500us(void)         // Half period for 1 kHz
{
    TH1 = 0xFE;
    TL1 = 0x33;
    TR1 = 1;
    while (TF1 == 0);
    TR1 = 0;
    TF1 = 0;
}

void main(void)
{
    unsigned int i;

    TMOD = 0x10;               // Timer 1, Mode 1 (16-bit)

    while (1)
    {
        // 500 Hz for about 1 second (500 cycles = 1000 half periods)
        for (i = 0; i < 1000; i++)
        {
            wave = ~wave;
            delay_1ms();
        }

        // 1 kHz for about 1 second (1000 cycles = 2000 half periods)
        for (i = 0; i < 2000; i++)
        {
            wave = ~wave;
            delay_500us();
        }
    }
}
