atmega8 UART-不显示实际角色

时间:2014-10-10 11:04:51

标签: avr uart baud-rate

嗨,我是新手,我需要帮助。它假设只是在realterm中显示'S'而不是'null'。会出现什么问题?它可以是注册吗?还是代码本身?

#include <avr/io.h>
#include <util/delay.h>

void UART_Init(unsigned int ubrr)
{
    UBRRH=(unsigned int)(ubrr>>8);
    UBRRL=(unsigned int)ubrr;
    UCSRA=0x00;
    UCSRB=(1<<TXEN)|(1<<RXEN);
    UCSRC=(0<<USBS)|(1<<UCSZ0)|(1<<UCSZ1);
}

void UART_Tx(unsigned char chr)
{
    while (bit_is_clear(UCSRA,UDRE)){}
    UDR=chr;
}

int main(void)
{
    UART_Init(95);
    DDRD|=0B11111111;
    PORTD|=0B11111111;

    while(1){
        _delay_ms(10);
        UART_Tx('S');
    }
}

系统正在使用14745600 Hz的xtal运行。主机速度为9600波特。所有设置应为8N1。

2 个答案:

答案 0 :(得分:2)

写入UCSRC寄存器时需要设置URSEL。

更改

UCSRC=(0<<USBS)|(1<<UCSZ0)|(1<<UCSZ1);

UCSRC=(1<<URSEL)|(0<<USBS)|(1<<UCSZ0)|(1<<UCSZ1);

从数据表中:

  

UBRRH寄存器与UCSRC寄存器共享相同的I / O位置。因此有些   访问此I / O位置时必须特别注意。在对此I / O位置进行写访问时,写入的值的高位USART寄存器选择(URSEL)位控制将写入的两个寄存器之一。如果URSEL是   在写操作期间,0将更新UBRRH值。如果URSEL是UCSRC,那就是UCSRC   设置将更新。

其余代码对我来说很好。

答案 1 :(得分:0)

更改UART_Tx('S');使用UART_Tx(“S”);