1

嗨,我是新手,我需要帮助。假设只在实数中显示“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');
    }
}

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

4

2 回答 2

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 为零,则 UBRRH 值将被更新。如果 URSEL 为 1,则将更新 UCSRC 设置。

其余的代码对我来说看起来不错。

于 2014-10-10T12:00:56.017 回答
0

更改 UART_Tx('S'); 使用 UART_Tx("S");

于 2015-05-06T04:04:48.433 回答