AVR Atmega32a USART 库无法工作

问题描述 投票:0回答:1
/*
 * RC_Car_AVR.c
 *
 * Created: 4/18/2018 7:55:07 PM
 * Author : 
 */ 

#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 外部晶体振荡器。

如果您发现任何问题请告诉我。

提前致谢。

avr atmega usart
1个回答
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);
}

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

© www.soinside.com 2019 - 2024. All rights reserved.