AVR 系列单片机的串行通讯实例
Atmega128有两个串口:USART0与 USART1
以 USART0为例
串口的初始化包括:
传输模式的选择:同步还是异步,默认为异步模式,可通过选择 USART控制和状态
寄存器 UCSR0C中的 UMSEL 位来选择,UMSEL为 0,是异步模式.
波特率的设置:通信的双方都必须有相同的波特率,波特率可以通过设置波特率
发生寄存器 UBRR0来确定,UBRR0为两字节 16位的寄存器,可分为 UBRR0H 和
UBRR0L.同时起作用的还有 UCSR0A中的波特率加倍位 UX2,当 UX2为 1时设置的
波特率加倍.
传输帧格式的设置:默认是 8位数据位,一位停止位
发送接受的使能与中断:通过设置 UCSR0B来根据需要选择接收或发送的使能和
是否使用中断,对使用中断的 USART操作,初始化前要关闭中断
USART0的控制和状态寄存器有:UCSR0A,UCSR0B,UCSR0C,波特率寄存器有 UBRR0,
即 UBRR0H和 UBRR0L,数据寄存器为 UDR0
1、 初始化:
设置波特率前,要关闭 USART0的所有使用,包括使能和中断:
UCSR0B=0B00000000; //关闭 USART0
2、设置 UCSR0A:
UCSR0A能写的有 Bit0,Bit1,Bit6,其他 5位为状态位.我们一般使用的有
Bit1-U2X0,当这一位为 1时,波特率的分频因子从 16降到 8,能够有效的将异
步通信模式的传输速率加倍,但是这一位仅对异步操作有影响,使用同步操
作时应将此位清零.
UCSR0A=0B00000000; //不使用倍速发送
3、设置 UCSR0C:
Bit6-UMSEL0:USART0 的模式选择,0为异步模式,1为同步模式
Bit5:4-UPM01:0:奇偶校验模式,00禁止,01,保留,10偶校验,11,奇校验
Bit3-USBS0:停止位的选择,0停止位为 1bit,1 停止位为 2-bits
Bit2:1-UCSZ01:0:字符长度,当 UCSZ02为 0时,00
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
示 5位,01表示 6位,10
表示 7位,11表示 8位.当 UCSZ02 为 1 时,11表示 9位.(UCSZ02 为 UCSR0B
里的一位寄存器)
eg:
UCSR0C=0B00000110 //异步模式,禁止奇偶校验,停止位为 1位,数据位为 8位
4、设置 UBRR:
UBRR的设置和这些参数有关:U2X0,CPU频率,波特率
当 U2X0 为 0时,即异步正常模式下,UBRR的计算公式:
1、U2X=0 时的公式计算
UBRR0L= (F_CPU/BAUDRATE/16-1)%256;
UBRR0H= (F_CPU/BAUDRATE/16-1)/256;
2、U2X=1 时的公式计算
UBRRL= (F_CPU/BAUDRATE/8-1)%256;
UBRRH= (F_CPU/BAUDRATE/8-1)/256;
//也可根据数据手册的[波特率设置的例子]查得
//UBRRL = 0x2F; //set baud rate lo
//UBRRH = 0x00; //set baud rate hi
设置一般会有误差,误差计算方法
为:Error[%]=(BaudRate_ture/BaudRate-1)*100%;
5、然后就是设置 UCSR0B:
Bit7-RXCIE0 为接收结束中断使能,Bit6-TXCIE0 为发送结束中断使
能,Bit4-RXEN0为接收使能,Bit3-TXEN0为发送使能.一般情况下,接收使用中断
方式,所以使用接收结束中断使能.
UCSR0B=0B10011000 //发送接收使能,接收结束使能
还一种写法是 UCSR0B|=(1<< RXEN0)|(1<< TXEN0)|(RXCIE0);
如果更熟练,可以直接以 10进制活 16进制来设置这些寄存器:
UCSR0B=0x98;或者 UCSR0B=152;
串口的初始化函数:
void uart_init(void) //串口 0初始化
{
UCSR0B=0x00; //disable while setting baud rate
UCSR0A=0B00000000; //Bit1 为 1则倍速发送 U2X=0
UCSR0C=0x06; //B00000110 //奇偶模式无,八位数据位,一位停止位
UBRR0L=103; //B00011001波特率:9600 Bps
UBRR0H=0x00; //误差率:0.156%
UCSR0B=0x98;
}
初始化之后就是对 USART0 进行读写了.
UCSR0A的 Bit5-UDRE0 标志指出发送缓冲器 UDR0 是否准备好接收新数据,UDRE0
为 1说明缓冲器为空,可以接收新数据,UDRE0标志也可用来产生寄存器空中断.
复位后的 UDRE0 置位,表明发送器已经就绪:
当 UDRE0为 1时!(UCSR0A&(1<< UDRE0))为 0
void putchar(uchar c) //串口 0发送字符
{
while(!(UCSR0A&(1<< UDRE0))); //while(!(UCSR0A&32)); 表明发送器已经就
绪。
UDR0=c;
}
串口 0 发送字符串:
void putstr(uchar *s) //串口 0发送字符串
{
while(*s)
{
putchar(*s);
s++;
}
}
RXC0为 UCSR0A里的 Bit7位,为 USART0接收结束的状态位,接收缓冲器中有未读
出的数据时 RXC0置位,否则清零.
串口 0 接收字符:
uchar getchar(void) //串口 0 接收字符
{
while(!(UCSR0A&(1<< RXC0)));
return UDR0;
}
在使用串口的程序中一般包含这些文件:
#include
#include
#include
#include
avr/io.h里有各种寄存器的定义,avr/signal.h,avr/interrupt.h 里有中断的
定义,avr/delay.h包含延时函数.
转自
http://blog.csdn.net/gnuhpc/archive/2009/07/24/4378251.aspx
例程如下:
/*******************************************************************
********/
/*串口 0 测试程
序
*/
/*目标器件:
ATmega128
*/
/*晶振:RC
8MHZ
*/
/*编译环境:ICCAVR
6.31A
*/
/*E-Mail:number007cool@163.com
*/
/*******************************************************************
********/
/*********************************包含头文件
********************************/
#include
#include
/***********************************宏定义
**********************************/
#define fosc 8000000 //晶振 8MHZ
#define baud 2400 //波特率
/*******************************************************************
*********
函数功能:uart0 初始化程序
入口参数:
出口参数:
********************************************************************
********/
void uart0_init(void)
{
UCSR0B = 0x00; //关闭 UART00
UCSR0A = 0x00; //不使用倍速
发送(异步)
UCSR0C =(1<
本文档为【AVR_单片机_串口通信_串行通讯_详细例程介绍】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。