ATMEGA单片机串口调试中一个问题解决

概要

第一次写点东西。
源于最近的一次单片机串口通信失败。原来单片机用的16MHz晶振,串口通信115200到9600波特率都能通信成功,但是换成8MHz时别的波特率也都能成功,唯独115200波特率不能成功。查阅了大量的国内外文章后终于知道了为什么。

原因

ATMEGA单片机串口有三种模式:
在这里插入图片描述
这里涉及到的主要时前两种模式,可以看到不同模式下波特率的计算公式是不一样的。
Normal Mode:根据解释只有特别低的速率时才适合使用,比如UBBRn已经超过了4095,那么就只能使用Normal Mode了;
Double Speed Mode:根据解释,适合用于波特率要求比较精确或者速率比较高的场合

不同晶振和实际波特率对比

这里计算了Double Speed Mode下的对比:
在这里插入图片描述
在这里插入图片描述
波特率实际做成了excel可以下拉的。其他波特率对应的就不列举了,需要的可以下载。

小结

从上表就可以看出来,9600波特率下16M晶振和8M晶振都没问题。但是在115200波特率下8M晶振实际的波特率误差达到8.51%,通信失败!
解决方法可以采用7.3728M晶振,但是实际找了很多这个频率SMD3225封装竟然没有石英晶振。其他的频率比如11.0592M晶振,对串口也是比较友好的。
希望对大家有用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基本的atmega16A单片机串口通信的C语言代码示例: ```C #include <avr/io.h> #include <util/delay.h> void USART_Init(unsigned int ubrr) { /* Set baud rate */ UBRRH = (unsigned char)(ubrr>>8); UBRRL = (unsigned char)ubrr; /* Enable receiver and transmitter */ UCSRB = (1<<RXEN)|(1<<TXEN); /* Set frame format: 8data, 2stop bit */ UCSRC = (1<<USBS)|(3<<UCSZ0); } void USART_Transmit(unsigned char data) { /* Wait for empty transmit buffer */ while (!(UCSRA & (1<<UDRE))); /* Put data into buffer, sends the data */ UDR = data; } unsigned 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) { /* Set the baud rate to 9600 */ USART_Init(51); while(1) { /* Send the string "Hello World" */ USART_Transmit('H'); USART_Transmit('e'); USART_Transmit('l'); USART_Transmit('l'); USART_Transmit('o'); USART_Transmit(' '); USART_Transmit('W'); USART_Transmit('o'); USART_Transmit('r'); USART_Transmit('l'); USART_Transmit('d'); USART_Transmit('\r'); USART_Transmit('\n'); /* Wait for a second */ _delay_ms(1000); } } ``` 此代码实现了基本的串口通信,发送 "Hello World" 到串口,可以通过串口助手或其他串口监视器来查看信息。 请注意,要使用该代码,需要将单片机的波特率配置为9600。 在此示例,波特率计算如下: ```C UBRR = (F_CPU/(16*BAUD))-1; UBRR = (F_CPU/(16*9600))-1; UBRR = 51; ``` 其F_CPU为单片机的时钟频率,BAUD为波特率。在使用此代码时,请确保已经正确初始化了单片机的时钟源。例如,如果您使用的是外部晶体振荡器,则需要在程序正确配置。 请勿使用此代码进行商业用途。本代码仅供学习和测试目的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值