Also note that the watchdog timer uses an internal, uncalibrated, RC clock that has a very low accuracy compared to the crystal-based "normal" timers; it will probably make a lousy "24 hour clock."
WDTCSR = (1<<WDCE); // watchdog change enable
WDTCSR = (0<<WDP3)|(1<<WDP2) | (1<<WDP1); // set
//prescaler to 1 second
WDTCSR = (1<<WDIE) | (0<<WDE); // enable wdt interrupt
Your second write to WDTCSR is overwriting the prescaler bits, I think. And/or apparently you need to set WDE to change the prescaler, even if you're going to immediately clear it. See the bottom of page 49 of the Atmega168 datasheet. This sequence seems to work:
cli(); // stop interrupts
WDTCSR = (1<<WDCE | 1<<WDE); // watchdog change enable
WDTCSR = 1<<WDIE | (0<<WDP3)|(1<<WDP2) | (1<<WDP1); // set prescaler to 1 second
sei(); // start interrupts