美文网首页AVR我爱编程
带你AVR入个门3:USART(未完成)

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

作者: 乱世工人 | 来源:发表于2017-09-07 11: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自己补全。

    相关文章

      网友评论

        本文标题:带你AVR入个门3:USART(未完成)

        本文链接:https://www.haomeiwen.com/subject/dstijxtx.html