Das ist c-mässig ein Stiefel, auch wenn es scheinbar funktioniert;
if(zeichen=='0')
PORTB = (0<<PINB0);

Ein Bit löschen geht so
PORTB &= ~(1<<PINB0);


Du solltest, so wie in der Wikil, für die Register-Bits die korrekten Symbole verwenden

sowas ist pfui gack:
UBRRL = 23; //9600Baud siehe Baudratentabelle
UCSRB = 8 + 16; //Sender enable, Empfänger enable

Besser:
Code:
    uint16_t ubrr = (uint16_t) ((uint32_t) F_CPU/(16*BAUDRATE) - 1);
 
    UBRRH = (uint8_t) (ubrr>>8);
    UBRRL = (uint8_t) (ubrr);
 
    // UART Receiver und Transmitter anschalten 
    // Data mode 8N1, asynchron 
    UCSRB = (1 << RXEN) | (1 << TXEN);
    UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0);

Noch was: Bevor "Hello, world" nicht geht, ist an empfange nicht zu denken

https://www.roboternetz.de/wissen/in...lo.2C_world.29