单片机
返回首页

AVR USART串口程序

2016-10-18 来源:eefocus

usart简介:
  • 通用同步和异步串行接收器和转发器(USART) 是一个高度灵活的串行通讯设备。主要特点为:
    全双工操作( 独立的串行接收和发送寄存器)
    异步或同步操作
    主机或从机提供时钟的同步操作
    高精度的波特率发生器
    支持5, 6, 7, 8, 或9 个数据位和1 个或2 个停止位
    硬件支持的奇偶校验操作
    数据过速检测
    帧错误检测
    噪声滤波,包括错误的起始位检测,以及数字低通滤波器
    三个独立的中断:发送结束中断, 发送数据寄存器空中断,以及接收结束中断
    多处理器通讯模式
    倍速异步通讯模式

数据读写 官方解释

  • USART的初始化
    void USART_Init( unsigned int baud )
    {
    /* 设置波特率*/
    UBRRH = (unsigned char)(baud>>8);
    UBRRL = (unsigned char)baud;
    /* 接收器与发送器使能*/
    UCSRB = (1< /* 设置帧格式: 8 个数据位, 2 个停止位*/
    UCSRC = (1< }
  • 数据发送【发送5 到8 位数据位的帧】
    void USART_Transmit( unsigned char data )
    {
    /* 等待发送缓冲器为空 */
    while ( !( UCSRA & (1< ;
    /* 将数据放入缓冲器,发送数据 */
    UDR = data;
    }
  • 数据发送【发送9 位数据位的帧】
    void USART_Transmit( unsigned int data )
    {
    /* 等待发送缓冲器为空 */
    while ( !( UCSRA & (1< ;
    /* 将第9 位复制到TXB8 */
    UCSRB &= ~(1< if ( data & 0x0100 )
    UCSRB |= (1< /* 将数据放入缓冲器,发送数据 */
    UDR = data;
    }
  • 数据接收【以5 到8 个数据位的方式接收数 据帧】
    unsigned char USART_Receive( void )
    {
    /* 等待接收数据*/
    while ( !(UCSRA & (1< ;
    /* 从缓冲器中获取并返回数据*/
    return UDR;
    }
  • 数据接收【以9 个数据位的方式接收帧】
    unsigned int USART_Receive( void )
    {
    unsigned char status, resh, resl;
    /* 等待接收数据*/
    while ( !(UCSRA & (1< ;
    /* 从缓冲器中获得状态、第9 位及数据*/
    /* from buffer */
    status = UCSRA;
    resh = UCSRB;
    resl = UDR;
    /* 如果出错,返回-1 */
    if ( status & (1< return -1;
    /* 过滤第9 位数据,然后返回*/
    resh = (resh >> 1) & 0x01;
    return ((resh << 8) | resl);
    }
  • 首先包含sio.h和相关头文件。
  • 调用Com_init(); //串行口初始化
  • 主程序
    void main(void)
    {
    uint8 SIO_buff[4]; //定义串口数据缓冲区
    init_devices();
    //指示单片机正常开始工作,一亮,二亮,都亮,都灭
    PORTA = 0x02; //1脚为高,0脚为低,0脚灯亮
    Delay(); //延时
    PORTA = 0x01; //0脚为高,1脚为低,1脚灯亮
    Delay(); //延时
    PORTA = 0x00; //同时亮
    Delay(); //延时
    PORTA = 0x03; //同时灭

    Com_putstring ('ww',2,&RTbuf_UART0); //输出一个字符串到串行口
    while(1)
    {
    if(Com_R_count(&RTbuf_UART0)!=0)
    {
    Com_getstring (SIO_buff,1,&RTbuf_UART0);
    Com_Rbuf_Clear(&RTbuf_UART0); //清空buffer
    if(SIO_buff[0]==1) //接收到一个一
    {
    Com_putstring ('ok!!',4,&RTbuf_UART0); //输出一个字符串到串行口
    PORTA = 0x00; //同时亮
    Delay(); //延时
    PORTA = 0x03; //同时灭
    }
    } //end of if(Com_R_count(&RTbuf_UART0)!=0)
    Delay();//延时
    Com_putstring ('ww00',4,&RTbuf_UART0); //输出一个字符串到串行口
    }
    }

串口调试经验谈:

1、确保你的串口连线正常,有的串口的接法,9针串口线的7针和第八针要交叉,本站最小系统板的V2.3需要交叉,V2.5不需要交叉。

2、确保你的MAX232工作正常,方法:在本开发小板上把跳线JP2的1和3短接,2和4不接,通过串口调试助手发什么数据就可以收到什么数据。

3、最容易出现的一个问题是,晶振的选择,本程序要求晶振是7.3728M外部晶振,为什么使用7.3728的特殊晶振,因为它可以产生标准的波特率,如果你收到的是乱码或者根本无法收到,请检查你的晶振的相关熔丝位设置是否正确,这里看看熔丝位快速入门。

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 用数字电路CD4069制作的万能遥控轻触开关

  • 红外线探测报警器

  • 短波AM发射器电路设计图

  • RS-485基础知识:处理空闲总线条件的两种常见方法

  • 带有短路保护系统的5V直流稳压电源电路图

  • 基于ICL296的大电流开关稳压器电源电路

    相关电子头条文章