Adding Separator to Breadcrumbs

I’m not sure if you want it like this, however, this can be achieved by CSS.

.crumbs > span > span + span {
    margin-left: 1em;
}

.crumbs > span > span + span:before {
    content: '|'; /* or something else */
    *display: inline;
    display: inline-block;
    margin-left: -1em;
    width: 1em;
    text-align: center;
}

// EDIT
If you want it PHP-only, then this is a way to go:

function crumbs() {
    if ((is_page() && ! is_category()) || is_archive() || is_single() || is_single()) {
        $crumbs="";
        $crumbs .= '<div class="crumbs"><span xmlns:v="http://rdf.data-vocabulary.org/#">';
        $crumbs .= '<span typeof="v:Breadcrumb"><a rel="v:url" property="v:title" href="'.get_bloginfo('url').'">Home</a></span>';
        $post_ancestors = get_post_ancestors($post);

        if ($post_ancestors) {
            $post_ancestors = array_reverse($post_ancestors);
            foreach ($post_ancestors as $crumb)
                $crumbs .= '<span typeof="v:Breadcrumb"><a rel="v:url" property="v:title" href="'.get_permalink($crumb).'">'.get_the_title($crumb).'</a></span>';
        }

        if (is_category() || is_single()) {
            $category = get_the_category();
            $crumbs .= '<span typeof="v:Breadcrumb"><a rel="v:url" property="v:title" href="'.get_category_link($category[0]->cat_ID).'">'.$category[0]->cat_name.'</a></span>';
        }

        if (!is_category())
            $crumbs .= '<span typeof="v:Breadcrumb"><span class="crumbs-last" property="v:title">'.get_the_title().'</span></span>';

        $crumbs .= '</span></div>';

        $close_crumb = '</span>';
        $open_crumb = '<span typeof="v:Breadcrumb">';
        $separator="<span class="separator">|</span>";
        echo str_replace($close_crumb.$open_crumb, $close_crumb.$separator.$open_crumb, $crumbs);
    }
}

Yes, it’s not nice – but that’s due to the whole thing, IMHO.