atmel studio遇到的USART问题,解决了,但是不知道问题所在

本文记录了一个AVR单片机串口通信的问题及解决方案。作者通过定义宏来配置寄存器,并实现了一个简单的USART初始化函数,用于设置波特率和数据位等参数。此外还提供了一个发送字符的函数以及接收中断处理程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一次写这个东西,这个问题困扰我好久,一直不知道如何解决,今天终于无意中成功了,但是就是不知道问题在那,把问题叙述如下:

#define  F_CPU   4000000UL //晶振
#include <avr/io.h>
#include <avr/interrupt.h>


#define INT8U   unsigned char
#define INT16U  unsigned int


//清空缓冲标志
INT8U flag = 0;
INT8U rdata;
//------------------------------------------------------------------
// USART初始化
//------------------------------------------------------------------
void Init_USART()
{
UCSRB = _BV(RXEN) | _BV(TXEN) | _BV(RXCIE);
UCSRC = _BV(URSEL) | _BV(UCSZ1) | _BV(UCSZ0);


UBRRH = (F_CPU/9600/16-1) / 256;
UBRRL = (F_CPU/9600/16-1) % 256;


}
//------------------------------------------------------------------
// 发送一个字符
//------------------------------------------------------------------
void PutChar(INT8U c)
{
UDR = c;
while(!(UCSRA & _BV(UDRE)));
}


void show_redata()
{
if(flag==1)
{
PutChar(rdata);
flag=0;
}

}


ISR (USART_RXC_vect)
{
rdata = UDR;
flag = 1;
}


int main(void)
{
DDRD = 0x02;PORTD = 0xff;

Init_USART();

sei();
 
    while(1)
    {
show_redata();

//如果直接使用

//if(flag==1) 

//      {

//           PutChar(rdata);  

//           flag=0;

//       }

//       程序不能使用,不知道怎么回事
    }

}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值