AVR我爱编程

带你AVR入个门3:USART(未完成)

2017-09-07  本文已影响19人  乱世工人

串口,应该是继GPIO之后学的第一个外设。

原理跟硬件连接什么的自己查,下面介绍一个最简单的串口发送一个字节的例程。

当你#include了头文件之后,串口的寄存器可以直接用。

总的来说分为两步:初始化,以及发送数据。

初始化要给这么几个寄存器赋值:UCSRB、UCSRC、UBRRL、UBRRH。

首先是传输数据格式的描述:最常见的是8位数据位、1位停止位、0校验位,由UCSRC寄存器控制。

UCSRC = (1<

有看datasheet的朋友(万一有呢?)会发现,UCSRC寄存器里头UCSZ1和UCSZ0这两位的值默认是1,所有上面这句是可以省略掉的。

接下来是UBRRL跟UBRRH这两个寄存器,用来设置波特率,L跟H分别代表低位跟高位。

波特率寄存器的值跟两个因素有关:一个是你要设置的波特率,另一个是单片机晶振频率。

这三者之间的关系如下图:

假设你用的是7372800的晶振,想要设置成9600的波特率,那么UBRR的值应赋值为:

7372800/16/9600-1=47

有一个比较偷懒的方法是:在datasheet里直接查表

然后

UBRRL = 47;

当我不建议你这么做,优雅的写法应该是:

UBRRL = (uint8_t)(F_CPU/16/BAUD -1);

UBRRH = (uint8_t)((F_CPU/16/BAUD -1)>>8);

F_CPU的值上一集已经提过在哪里定义,BAUD你可以定义成宏,也可以作为函数参数输入。

最后一个寄存器是UCSRB,里边是一些功能的开关位,我们要发送数据,只需要使能发送数据位TXEN:

UCSRB = 1<

最简单的串口初始化就完成了。

接下来是发送一个字节。

void usart_send_byte(uint8_t data)

{

    while(!(UCSRA & (1<

    ;

    UDR = data;

}

while(!(UCSRA & (1<

register&(1<

main函数长这样子:

#include

#include "usart.h"

int main(void)

{

usart_initialize(9600);

while(1)

{

usart_send_byte(0xFF);

}

return 0;

}

usart.c跟usart.h自己补全。

上一篇下一篇

猜你喜欢

热点阅读