Atmega16单片机串口通信

Atmega16单片机串口通信

本篇文章参考自叶大鹏老师于2008年4月5日完成的UART通信PPT制作而成。

串口通信需要使用到的内部寄存器

在进行程序编写前需要对16单片机中的寄存器的作用和使用方法有所了解,下面为16单片机串口通信使用到的几个寄存器:

  1. USART I/O 数据寄存器 - UDR (UDR寄存器用于数据在传输中的存储):
    UDR寄存器用于数据在通信中的存储
  2. USART控制和状态寄存器A - UCSRA
    UCSRA寄存器
    寄存器中位的定义
    寄存器中位的定义
void uart_sendB(uchar data)        /*发送函数*/
{
    while(!(UCSRA&(BIT(UDRE))));   //等待发送缓冲器为空
    UDR=data;                      //将数据存入UDR寄存器
}
  1. USART控制和状态寄存器B - UCSRB
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
void uart_rx(void)              /*串口接收函数*/
{
    UCSRB&=~BIT(RXCIE);         //校验数据是否传输完成,关闭接收中断
    rdata=UDR;                  //将接收到的数据存入rdata
    flag=1;                     //标志位至1
    UCSRB|=BIT(RXCIE);          //接收完毕,开启中断
}
  1. USART控制和状态寄存器C - UCSRC
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  2. USART波特率寄存器 - UBRRL和UBRRH
    在这里插入图片描述
    在这里插入图片描述
#define mclk 8000000

    baud=mclk/16/baud-1;    //程序片段
    UBRRL=baud;             //设置波特率,先写低位再写高位
    UBRRH=baud>>8;          //设置波特率,先写低位再写高位

程序代码

本段程序编译环境为ICCAVR7 for AVR。
#include<iom16v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
#define mclk 8000000
#pragma interrupt_handler uart_rx:12
uchar rdata,flag=0;
void uart_init(uint baud)        //串口初始化
{
    UCSRB=0x00;
    UCSRA=0x00;
    UCSRC=(1<<URSEL)|(0<<UPM0)|(3<<UCSZ0);
    
    baud=mclk/16/baud-1;
    UBRRL=baud;
    UBRRH=baud>>8;
    UCSRB=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE);
    
    SREG=BIT(7);                    //开中断
    DDRD|=0x02;                     //设计发送口(TX)为输出,这很重要
}
void uart_rx(void)                  //串口接收函数
{
    UCSRB&=~BIT(RXCIE);         //校验数据是否传输完成,关闭接收中断
    rdata=UDR;                  //将接收到的数据存入rdata
    flag=1;                     //标志位至1
    UCSRB|=BIT(RXCIE);          //接收完毕,开启接收中断
}


void uart_sendB(uchar data)   //发送函数
{
    while(!(UCSRA&(BIT(UDRE)))); //等待发送缓冲器为空
    UDR=data;                    //将数据存入UDR
    while(!(UCSRA&(BIT(TXC))));
    UCSRA|=BIT(TXC);          
}

void main(void)
{
    uchar i=4;
    uart_init(19200);
    while(1)
    {
        if(flag)
        {
            uart_sendB(i);
            flag=0;
        }
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值