当前位置:文档之家› atmega128L串口通信详解

atmega128L串口通信详解


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 时的公式计算
串口的初始化函数: 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++; } }
UCSR0C =(1<<UCSZ01)|(1<<UCSZ00); UBRR0L=(fosc/16/(baud+1))%256; UBRR0H=(fosc/16/(baud+1))/256; UCSR0B =(1<<RXEN0)|(1<<TXEN0); }
/*********************************************************************** ***** 函数功能:uart0 发送单字节数据 入口参数:c 出口参数: ************************************************************************ ****/ void putchar0(unsigned char c) { while (!(UCSR0A&(1<<UDRE0)));//表明发送器已经准备就绪 UDR0=c; } /*********************************************************************** ***** 函数功能:uart0 接收单字节数据 入口参数: 出口参数: ************************************************************************ ****/ unsigned char getchar0(void) { while(!(UCSR0A& (1<<RXC0)));//表明已经接收完毕 return UDR0; } /*********************************************************************** ***** 函数功能:uart0 发送字符串数据 入口参数:*s 出口参数: ************************************************************************ ****/ void puts0(char *s) { //将要发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%;
Atmega128 串口详解
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
5、然后就是设置 UCSR0B:
Bit7-RXCIE0 为接收结束中断使能,Bit6-TXCIE0 为发送结束中断使能,Bit4-RXEN0 为接收使 能,Bit3-TXEN0 为发送使能.一般情况下,接收使用中断方式,所以使用接收结束中断使能. UCSR0B=0B10011000 //发送接收使能,接收结束使能 还一种写法是 UCSR0B|=(1<< RXEN0)|(1<< TXEN0)|(RXCIE0); 如果更熟练,可以直接以 10 进制活 16 进制来设置这些寄存器: UCSR0B=0x98;或者 UCSR0B=152;
1、初始化:
设置波特率前,要关闭 USART0 的所有使用,包括使能和中断: UCSR0B=0B00000000; //关闭 USART0
2、设置 UCSR0A:
UCSR0A 能写的有 Bit0,Bit1,Bit6,其他 5 位为状态位.我们一般使用的有 Bit1-U2X0,当这一位为 1 时, 波特率的分频因子从 16 降到 8,能够有效的将异步通信模式的传输速率加倍,但是这一位仅对异步操作有影 响,使用同步操作时应将此位清零. UCSR0A=0B00000000; //不使用倍速发送
例程: 串口通信( 串口通信(USART0)
/*********************************************************************** ****/ /*串口 0 测试程序 /*目标器件:ATmega128 /*晶振:RC 8MHZ /*编译环境:ICCAVR 7.13A /*时间:2010 年 3 月 14 日*/ /*E-Mail:number007cool@ ****/ /*********************************包含头文件 ********************************/ #include<iom128v.h> #include<macros.h> /***********************************宏定义 **********************************/ #define fosc 8000000 //晶振 8MHZ #define baud 2400 //波特率 /*********************************************************************** ***** 函数功能:uart0 初始化程序 入口参数: 出口参数: ************************************************************************ ****/ */ */ */ */ */
/***********************************************************************
void uart0_init(void) { UCSR0B = 0x00; UCSR0A = 0x00; //关闭 UART00 //不使用倍速发送(异步) //数据位为 8 位 //异步正常情况下的计算公式 //接收使能和发送使能
串口通信( 串口通信(USART1) /*********************************************************************** ****/ /*串口 1 测试程序 /*目标器件:ATmega128 /*晶振:RC 8MHZ /*编译环境:ICCAVR 7.13 /*E-Mail:number007cool@ /*时间:2010 年 1 月 14 日 */ */ */ */ */ */
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!"); } }
相关主题