您的位置 首页 培训

Atmega128串口详解

Atmega128有两个串口:USART0与USART1以USART0为例串口的初始化包括:传输模式的选择:同步还是异步,默认为异步模式,可通过选择USART控制和状

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标明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包括延时函数.

例程:
串口通讯(USART0)
/***************************************************************************/
/*串口0测验程序 */
/*方针器材:ATmega128 */
/*晶振:RC 8MHZ */
/*编译环境:ICCAVR 7.13A */
/*时刻:2010年3月14日*/
/*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<UBRR0L=(fosc/16/(baud+1))%256; //异步正常情况下的核算公式
UBRR0H=(fosc/16/(baud+1))/256;
UCSR0B =(1<}
/****************************************************************************
函数功用:uart0发送单字节数据
进口参数:c
出口参数:
****************************************************************************/
void putchar0(unsigned char c)
{
while (!(UCSR0A&(1< UDR0=c; //即将发送的数据装入UDR0寄存器
}

/****************************************************************************
函数功用:uart0接纳单字节数据
进口参数:
出口参数:
****************************************************************************/
unsigned char getchar0(void)
{
while(!(UCSR0A& (1< return UDR0;
}

/****************************************************************************
函数功用:uart0发送字符串数据
进口参数:*s
出口参数:
****************************************************************************/
void puts0(char *s)
{
while (*s)
{
putchar0(*s);
s++;
}
putchar0(0x0a);//回车换行
//putchar0(0x0d);
}

/****************************************************************************
函数功用:主程序
进口参数:
出口参数:
****************************************************************************/
void main(void)
{
unsigned char i;

uart0_init();//UART0初始化
puts0(“HELLO!”);
while(1)
{
puts0(“test ok!”);
}
}

串口通讯(USART1)
/***************************************************************************/
/*串口1测验程序 */
/*方针器材:ATmega128 */
/*晶振:RC 8MHZ */
/*选用的波特率:9600(也能够别的设定),改了波特率后需要将电源拔了再插上方可运用*/
/*编译环境:ICCAVR 7.13 */
/*E-Mail:number007cool@163.com */
/*时刻:2010年1月14日 */
/***************************************************************************/
/*********************************包括头文件********************************/
#include
#include
/***********************************宏界说**********************************/
#define fosc 8000000 //晶振8MHZ
#define baud 9600//波特率
/****************************************************************************
函数功用:uart1初始化程序
进口参数:
出口参数:
****************************************************************************/
void uart1_init(void) //USART1初始化
{
UCSR1B = 0x00; //封闭USART1
UCSR1A = 0x00; //不适运用倍速发送
UCSR1C = (1<UBRR1L=(fosc/16/(baud+1))%256;//异步正常形式下,UBRR的核算公式
UBRR1H=(fosc/16/(baud+1))/256;
UCSR1B =(1<}
/****************************************************************************
函数功用:uart1发送单字节数据
进口参数:c
出口参数:
****************************************************************************/
void putchar1(unsigned char c)//串口1发送字符
{
while (!(UCSR1A&(1< UDR1=c;
}

/****************************************************************************
函数功用:uart1接纳单字节数据
进口参数:
出口参数:
****************************************************************************/
unsigned char getchar1(void) //串口1接收回数据
{
while(!(UCSR1A& (1< return UDR1; //将接纳到的字符回来
}

/****************************************************************************
函数功用:uart1发送字符串数据
进口参数:*s
出口参数:
****************************************************************************/
void puts1(char *s)
{
while (*s)
{
putchar1(*s);
s++;
}
putchar1(0x0a);//回车换行
putchar1(0x0d);
}

/****************************************************************************
函数功用:主程序
进口参数:
出口参数:
****************************************************************************/
void main(void)
{
unsigned char i;

uart1_init();
puts1(“HELLO!”);
while(1)
{
puts1(“test ok!”);
}
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/peixun/261499.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部