... or instead of a full-blown TSR, if the user-defined call is only to be made while your application is running, write an interrupt handler for the 18-times a second user interrupt in DOS, and make your handler keep an eye open for the time and call the correct function.
But do remember that when the call is made, the processor may not have been handling your application, so the data segment may be wrong, the stack may be wrong (or even very, very small) etc.