Atmega128串口详解

发布者:Aq123456258最新更新时间:2016-01-11 来源: eefocus关键字: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
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!");        
 }

关键字:Atmega128  串口详解 引用地址:Atmega128串口详解

上一篇:avr单片机学习心得
下一篇:AVR外部晶振是否起振的测试小程序

推荐阅读最新更新时间:2024-03-16 14:43

ATmega128 时钟系统及其分布
时钟系统及其分布 Figure 18为AVR的主要时钟系统及其分布。这些时钟并不需要同时工作。为了降低功耗, 可以通过使用不同的睡眠模式来禁止无需工作的模块的时钟,如 P 41“ 电源管理及睡眠模 式” . 所示。 CPU 时钟- clkCPU CPU时钟与操作AVR内核的子系统相连,如通用工作寄存器文件、状态寄存器以及保存堆 栈指针的数据存储器。终止CPU 时钟将使内核停止工作和计算。 I/O 时钟- clkI/O I/O时钟用于主要的I/O 模块,如定时器/ 计数器、SPI 和USART。I/O 时钟还用于外部中断 模块。但是有些外部中断由异步逻辑检测,因此即使I/O 时钟停止了这些中断仍然可以得 到监控。此外,TWI
[单片机]
<font color='red'>ATmega128</font> 时钟系统及其分布
ATmega128 状态寄存器
状态寄存器包含了最近执行的算术指令的结果信息。这些信息可以用来改变程序流程以 实现条件操作。状态寄存器的内容只有在ALU 运算结束后才会更新。这样,在多数情况 下就不需要专门的比较指令了,从而使系统运行更快速,代码效率更高。 在进入中断例程时状态寄存器不会自动保存;中断返回时也不会自动恢复。这些工作需 要软件来处理。 AVR 中断寄存器 – SREG – 定义如下: • Bit 7 – I: 全局中断使能 置位时使能全局中断。单独的中断使能由其他独立的控制寄存器控制。如果I 清零,则不论单独中断标志置位与否,都不会产生中断。任意一个中断发生后I 清零,而执行RETI指令后置位以使能中断。I 也可以通过SEI 和CLI
[单片机]
<font color='red'>ATmega128</font> 状态寄存器
ATMEGA128 UART的使用
#include myuart.h #include avr/io.h #include #define UDRE 5 #define RXEN 4 #define TXEN 3 #define UCSZ0 1 #define RXC 7 #define RXCIE 7 ISR(USART0_RX_vect)//接收中断 { unsigned char dummy; while ( UCSR0A & (1 RXC) ) { dummy = UDR0; } USART_Transmit(dummy); } void USART_Transmit(unsigned char data)//发送字节 {
[单片机]
<font color='red'>ATMEGA128</font> UART的使用
ATmega128并行控制带字库的12864程序
ATmega128的特点是io口很多,所以我们可以用并行的方式来驱动此液晶屏,增加总线的速度,此程序是是网上整理收集而来,但已经通过本人验证可以使用,故在此发表.大家在应用的时候只需更改相应的io就行了. 软件:GCC V4.20 --------------------------------------------------------------- 实验内容:写Lcd12864_ST7920。 --------------------------------------------------------------- 硬件连接: LCD12864_ST7920 ATmega128 1.GND
[单片机]
ATmega128(PWM—time 0)
//atmega128的定时器实现快速PWM输出示例程序,定时器0溢出中断的方式 //输出PWM波形驱动发光二极管,亮度由暗到灭,呈闪烁状态 //样值采取正弦波公式,示例如下 //正弦波采样值计算公式 // f(x)=128+127*sin(2*3.1415*x/127) x= //PWM输出也可通过控制LED发光来直观的看到效果,亮度持续的变化 //可以通过选跳线帽选择是通过LED直接查看还是通过滤波器查看实际波形 //编译环境 AVR Studio 4.17/AVR GCC //系统时钟7.3728MHZ,设置熔丝位为外部高频石英晶体振荡,启动时间4.1ms //***********************
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved