AVR Atmega32a USART库不起作用

时间:2018-04-19 15:27:20

标签: avr atmega usart

/*

* RC_Car_AVR.c  *  *创建时间:4/18/2018 7:55:07 PM  *作者:  * /

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

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

char Read;

void USART_Init(void){

UBRRL = TUBRR;

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


}

char USART_Receive(void){

/* Wait for data to be received */
while (!(UCSRA & (1<<RXC)));

/* Get and return received data from buffer */
return UDR;
}



int main(void){

USART_Init();

DDRB |= (1<<0);

PORTB |= (1<<0); 

while (1){

    Read = USART_Receive();

    if(Read == 'F'){

        PORTB ^= (1<<0);
        _delay_ms(100);
    }

}
}

当我通过蓝牙模块(HC05)接收某个角色时,我试图切换LED。 我就像数据表那样编写了USART库,但它似乎无法工作(我只关心初始化和接收代码,因为我正在使用半双工系统,所以我不需要传输部分)。 我使用Atmega32a和16MHz外部晶体振荡器。

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

提前致谢。

1 个答案:

答案 0 :(得分:0)

您的初始化错误。

试试这个

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);
}

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