Atmega128有两个串口:USART0与USART1,以USART0为例

串口的初始化包括:
(1)、传输模式的选择:同步还是异步,默认为异步模式,可通过选择USART控制和状态寄存器UCSR0C中的UMSEL位来选择,UMSEL为0,是异步模式.
(2)、波特率的设置:通信的双方都必须有相同的波特率,波特率可以通过设置波特率发生寄存器UBRR0来确定,UBRR0为两字节16位的寄存器,可分为 UBRR0H和UBRR0L.同时起作用的还有UCSR0A中的波特率加倍位UX2,当UX2为1时设置的波特率加倍.
(3)、传输帧格式的设置:默认是8位数据位,一位停止位
(4)、发送接受的使能与中断:通过设置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<iom128v.h>
#include<macros.h>
/***********************************宏定义**********************************/
#define fosc 8000000  //晶振8MHZ
#define baud 2400  //波特率
/****************************************************************************
函数功能:uart0初始化程序
入口参数:
出口参数:
****************************************************************************/
void uart0_init(void)
{UCSR0B = 0x00;                     //关闭UART00UCSR0A = 0x00;                      //不使用倍速发送(异步)UCSR0C =(1<<UCSZ01)|(1<<UCSZ00);    //数据位为8位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;    //将要发送的数据装入UDR0寄存器} /****************************************************************************
函数功能:uart0接收单字节数据
入口参数:
出口参数:
****************************************************************************/
unsigned char getchar0(void){while(!(UCSR0A& (1<<RXC0)));//表明已经接收完毕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<iom128v.h>
#include<macros.h>
/***********************************宏定义**********************************/
#define fosc 8000000  //晶振8MHZ
#define baud 9600  //波特率
/****************************************************************************
函数功能:uart1初始化程序
入口参数:
出口参数:
****************************************************************************/
void uart1_init(void) //USART1初始化
{UCSR1B = 0x00;   //关闭USART1UCSR1A = 0x00;   //不适使用倍速发送UCSR1C = (1<<UCSZ11)|(1<<UCSZ10);//数据位为八位UBRR1L=(fosc/16/(baud+1))%256;//异步正常模式下,UBRR的计算公式UBRR1H=(fosc/16/(baud+1))/256;UCSR1B =(1<<RXEN1)|(1<<TXEN1); //接收使能,传送使能
}
/****************************************************************************
函数功能:uart1发送单字节数据
入口参数:c
出口参数:
****************************************************************************/
void putchar1(unsigned char c)//串口1发送字符{  while (!(UCSR1A&(1<<UDRE1)));//表明发送器一准备就绪UDR1=c;    } /****************************************************************************
函数功能:uart1接收单字节数据
入口参数:
出口参数:
****************************************************************************/
unsigned char getchar1(void) //串口1接回收数据{while(!(UCSR1A& (1<<RXC1)));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串口详解 - gnuhpc - 博客园

Atmega128串口详解相关推荐

  1. STM32开发 -- 串口详解

    如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/80708964 讲完GPIO,接下来看一下串口. 串口通信,已经讲了很多次了. ...

  2. python3.6串口编程实例_使用python3实现操作串口详解

    通过引用serial模块包,来操作串口. 1.查看串口名称 在Linux和Windows中,串口的名字规则不太一样. 需要事先查看. Linux下的查看串口命令 root@D2:~# ls -l /d ...

  3. STM32 串口详解

    目录 01.USART的特点 02.USART简介 2.1.数据传输模型 2.2.帧结构 2.3.波特率 03.STM32的USART 04.代码配置 01.USART的特点 USART是通用异步收发 ...

  4. STM32开发 -- 4G模块开发详解(3)

    如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/81782682 上面两篇文章,基本上把软硬件部分讲完了.接下来我们就看一下收发 ...

  5. STM32开发 -- 4G模块开发详解(2)

    如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/81773782 二.软件部分 1.初始化 模块的波特率为115200,8位数据 ...

  6. delphi 串口通信发送_STM32第五章串口通讯详解

    点击上方"果果小师弟",选择"置顶/星标公众号"干货福利,第一时间送达! 串口通信是串行通信里面的异步方式.串行通信是相对于并行通信来说的.串口是一个事实存在的 ...

  7. PIC单片机精通_A/D转换异步串口通讯实例与详解

    1.前言 串口通信这个话题对于很多做机电一体化.机器人控制等系统协调的同学,根本不陌生.计算机软件(编程技术),近些年飞速发展.尤其是以机器学习.仿生控制.大数据为代表的AI行业.但是,软件及算法永远 ...

  8. FPGA串口(UART)通信协议制定与设计思路详解示例

    串口(UART)通信协议制定与设计思路详解 1 概述 本文用于描述规定的串口通信协议,以及传输内容. 2 项目关于串口的要求 a) 支持BIT自检,1路UART上报BIT信息: b) 1路UART接口 ...

  9. 通过串口来控制网管型交换机的操作步骤详解

    之前我们对网管型交换机的三种管理方式简单的给大家介绍了一下,一.通过串口管理:二.通过web管理:三.通过网管软件管理.今天,飞畅科技的小编来为大家详细介绍下通过串口终端配置是如何对网管交换机进行控制 ...

  10. Linux串口编程详解

    Linux串口编程详解(阻塞模式.非阻塞模式.select函数) 之前一直觉得串口编程很简单,这两天仔细研究后发现串口里的各种参数还挺复杂,稍不注意就容易出错,这里总结一下网上的各种文章及自己的理解与 ...

最新文章

  1. python字典如何删除数据库_Python 字典删除元素clear、pop、popitem
  2. mysql 返回的查询结果为空 (即零行)._Mysql数据同步(单向)
  3. Amazing 2020
  4. SharedPreferences保存对象以及集合,腾讯MMKV使用,保存搜索历史
  5. Java知识积累-基础篇
  6. asp.net 发送邮件函数两则
  7. 2022年计算机408统考大纲,相比往年大量改动
  8. 漫画:996 的本质是什么?
  9. redhat AS5 FTP虚拟用户配置(本地数据库方式认证)
  10. 机房监控系统解说—开关传感器篇
  11. android arm linux下使用内存转储crash工具分析 kernel system dump问题
  12. 顶级赛事,大神现身,速来观战
  13. 快速排序时间复杂度数学证明
  14. word:如何从第三页插入目录
  15. 如何用朴素贝叶斯模型预测柯南里的被害人和凶手
  16. 無襯線體(Sans-serif)
  17. oracle中hint 详解
  18. iOS苹果相册“地点”相簿效果实现浅谈
  19. 大数据日志分析项目mapreduce程序
  20. MySQL中操作关系型数据库 SQL

热门文章

  1. centos+docker+jitsimeet视频服务器搭建
  2. 某知名系统漏洞挖掘与利用思路探索
  3. iTunes驱动程序缺少用于导入和刻录CD与DVD的注册设置
  4. 直播礼物特效新格式-Pag格式
  5. list集合去重和排序
  6. 基于FPGA的四轴运动控制IC设计(verilog)
  7. js自动生成html报表,JavaScript实现动态生成表格
  8. 【数据结构】四、双向链表和双向循环链表
  9. PID公式的推导过程及实现代码
  10. 项目管理:项目进度优化策略