Atmega16单片机串口通信
Atmega16单片机串口通信
本篇文章参考自叶大鹏老师于2008年4月5日完成的UART通信PPT制作而成。
串口通信需要使用到的内部寄存器
在进行程序编写前需要对16单片机中的寄存器的作用和使用方法有所了解,下面为16单片机串口通信使用到的几个寄存器:
- USART I/O 数据寄存器 - UDR (UDR寄存器用于数据在传输中的存储):
- USART控制和状态寄存器A - UCSRA :
void uart_sendB(uchar data) /*发送函数*/
{
while(!(UCSRA&(BIT(UDRE)))); //等待发送缓冲器为空
UDR=data; //将数据存入UDR寄存器
}
- USART控制和状态寄存器B - UCSRB :
void uart_rx(void) /*串口接收函数*/
{
UCSRB&=~BIT(RXCIE); //校验数据是否传输完成,关闭接收中断
rdata=UDR; //将接收到的数据存入rdata
flag=1; //标志位至1
UCSRB|=BIT(RXCIE); //接收完毕,开启中断
}
- USART控制和状态寄存器C - UCSRC :
- 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;
}
}
}