AVR Atmega32a USART 库无法正常工作


/*
  • RC_Car_AVR.c

  • 创建: 4/18/2018 7:55:07 PM

  • 作者: */

    #define F_CPU 16000000 #define 波特 9600 #define TUBRR ((F_CPU/16)/波特) - 1)

    #include #include

    字符读取;

    void USART_Init(void){

    UBRRL = TUBRR;

    UCSRB = (1<<TXEN)|(1<<RXEN); UCSRC = (1<<UCSZ1)|(1<<UCSZ0);

    }

    char USART_Receive(void){

    /* 等待接收数据 */而(!UCSRA & (1<<RXC)));

    /* 从缓冲区获取并返回接收的数据 */返回 UDR; }

    int main(void){

    USART_Init();

    DDRB |= (1<<0);

    端口 |= (1<<0);

    而 (1){

    Read = USART_Receive();
    if(Read == 'F'){
    PORTB ^= (1<<0);
    _delay_ms(100);
    }
    

    } }

当我通过蓝牙模块 (HC05) 收到某个字符时,我正在尝试切换 LED。

我已经像数据表一样编写了 USART 库,但它似乎不起作用(我只关心初始化和接收代码,因为我使用的是半双工系统,所以我不需要传输部分)。

我正在使用带有16MHz外部晶体振荡器的Atmega32a。

如果您发现任何错误,请告诉我。

提前谢谢。

您的初始化是错误的。

试试这个

void USART_Init(void){
UBRRL = TUBRR;
UBRRH = TUBRR >> 8;
UCSRB = (1<<TXEN)|(1<<RXEN);
UCSRC = (1<<UCSZ1)|(3<<UCSZ0);

}

这是 atmega32 数据表中提供的以下初始化代码

void USART_Init( unsigned int baud )
{
/* Set baud rate */
UBRRH = (unsigned char)(baud>>8);
UBRRL = (unsigned char)baud;
/* Enable receiver and transmitter */
UCSRB = (1<<RXEN)|(1<<TXEN);
/* Set frame format: 8data, 2stop bit */
UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
}

我知道以下数据表在开始时开销很小,但最终您会看到所有答案都在那里提供。

最新更新