How does TTL serial work?
With TTL serial, there are two unidirectional data lines. Each is driven by the sender, both high and low. A 0 bit is represented by 0V a 1 bit by VCC.

The receiver's pin should be set to an input.

So, for a microcontroller to send a byte (8-N-1 no flow control) it could do something like this:

#define BAUDRATE 9600
#define DELAY (SYS_CLK/BAUDRATE)

#define UART_BITBANG_OFF     UART_BITBANG_PORT |= _BV(UART_BITBANG_PIN)
#define UART_BITBANG_ON      UART_BITBANG_PORT &amp;= ~ _BV(UART_BITBANG_PIN)

#define UART_BITBANG_BIT(bit) {if (bit) UART_BITBANG_ON; else UART_BITBANG_OFF; _delay_us(DELAY);}

void uart_bitbang_init(void)
{
    UART_BITBANG_DDR &amp;= ~ _BV(UART_BITBANG_PIN);        // TX output
}

void uart_bitbang_putc(uint8_t c)
{
    UART_BITBANG_BIT(1)
    UART_BITBANG_BIT((c &amp; 0x1) == 0);
    UART_BITBANG_BIT((c &amp; 0x2) == 0);
    UART_BITBANG_BIT((c &amp; 0x4) == 0);
    UART_BITBANG_BIT((c &amp; 0x8) == 0);
    UART_BITBANG_BIT((c &amp; 0x10) == 0);
    UART_BITBANG_BIT((c &amp; 0x20) == 0);
    UART_BITBANG_BIT((c &amp; 0x40) == 0);
    UART_BITBANG_BIT((c &amp; 0x80) == 0);
    UART_BITBANG_BIT(0);
}


(This code reads a bit backwards as it was originally meant for inverted TTL serial)

Of course, most MCUs have hardware UARTs which do all this for you.

Here's what you'd see on a scope:

https://www.pololu.com/docs/0J25/4.a



Here's a great video from ladyada explaining serial:
http://www.adafruit.com/blog/2010/09/15/usb-serial-and-you-video-an-adafruit-after-school-special/