I just spent 9-5 yesterday underground in our labs, programming a simple processor with one or two byte opcodes, having just wired up a very large number of logic gates (via a patch panel) to its control lines in order to create subtraction and addition functions. Registers are displayed in the form of eight blinking LEDs on the front. The whole thing is about as big as a large modern laptop, and infinitely more simple -- it had a very limited instruction set (jump conditional, add, subtract, jump unconditional, start subroutine, etc) and a selectable clock speed of between 1Hz and 300 Hz. The standard method of debugging is, of course, to step through cycle-by-cycle and check the values of the registers and memory making sure they're what you expect them to be.
After two hours trying to get a program to print out the first 12 fibronanci numbers to work (entered via lots and lots of hex on the 'front panel', compounded by the fact that I hadn't noticed one of the wires had fallen out...), I can tell you that the final sight of this very simple computer working to do something useful was inspiring indeed. I've written some assembly overnight that should act as a 4-bit multiplier, and some more assembly to act as a memory-checker.
Regarding what others have said on the page: Millikan's Oil-Drop hurts your eyes, and doesn't give very good results. I personally hate it. On the other hand, if you first years have done Maxwells equations properly (I learnt them in my first year; and it's not hard to derive c=1/sqrt(\mu_0 \epsilon_0) in free space from them), then it's easy to have equipment that allows you to very, very, accurately measure the speed of light. This I did find cool indeed. Likewise for fourier optics and information theory, along with anything that involved liquid nitrogen ("Introduction to pressure gauges"). Finally, there are a few important QM demonstrations that you might like to consider -- Stern-Gerlach, Zeeman effect, and so on.
Good luck!