单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 255|回复: 0
打印 上一主题 下一主题
收起左侧

DMAVR-L的USART串口发送与接收数据示例程序

[复制链接]
跳转到指定楼层
楼主
1804181935 发表于 2019-7-25 14:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//***********************************************************************
//                        包含文件
//***********************************************************************

#include <string.h>
#include <stdio.h>
#define         F_CPU        16000000                // 单片机主频为16MHz,用于延时子程序,熔丝位必须设置到外部高频晶振才行
#include <util/delay.h>
#include <avr/io.h>
#include <avr/iom128.h>
#include <avr/interrupt.h>           //中断信号头文件
#include "Config.h"

//***********************************************************************
//                        定义变量区
//***********************************************************************
uint   tx_count=200,tx_flag=0xff;
static uchar A1,A2,A3;                                 
uchar usart_rx_data=0xff;


//***********************************************************************
//                        IO端口初始化
//***********************************************************************

void system_init()
{
    LED = 0xFF;                                 //数据口为输出

    LEDDDR=0xFF;                                                //设置为输出
}

//*************************************************************************
//   将收到的串口数据显示到LED发光二极管,可以根据自己的情况更改
//*************************************************************************

void Display_Uart(uint Data_Rev)
{

        LED = Data_Rev;
}


void usart_init()
{
  UCSR0A=0x00;                                 //单倍速模式

  UCSR0B=0x98;                                 //接收中断允许,发送结束和寄存器空中断关闭,采用查询发送模式                              

  UCSR0C=(1<<UCSZ01)|(1<<UCSZ00);              //写UCSRC寄存器,异步通信无校验,8位数据1位停止位

  UBRR0H=baud_h;                               //写波特率的值

  UBRR0L=baud_l;
}

//*************************************************************************
//                数据处理函数
//*************************************************************************
void data_do(uchar temp_d)
{
     uchar A2t;

         A1=temp_d/100;                                 //分出百,十,和个位

         A2t=temp_d%100;

         A2=A2t/10;

         A3=A2t%10;
}

//*************************************************************************
//                串口相关中断服务子程序
//*************************************************************************
                                //数据发送结束中断向量
ISR(USART0_TX_vect)             //中断服务程序
{
   delay_ms(10);                            //相关操作
}

                                    //数据接收结束中断向量
ISR(USART0_RX_vect)             //中断服务程序
{
    usart_rx_data=UDR0;             //将接收到的数据取出
        Send_SingleChar(usart_rx_data); //接收到的数据再发回电脑,显示在串口调试助手上
}
                                    //数据寄存器空中断向量

void Send_SingleChar(uchar usart_tx_data)
{
        while(!(UCSR0A&(1<<UDRE0)));                //等待发送寄存器空

        UDR0=usart_tx_data;                                        //写入发送数据

        while(!(UCSR0A&(1<<TXC0)));                        //等待发送完毕

        UCSR0A|=(1<<TXC0);

}

//*************************************************************************
//                        主程序
//*************************************************************************
int main(void)
{
  uchar i;

  system_init();                             //系统初始化

  usart_init();                              //usart串口初始化配置

  for(i=1;i<=200;i++)
  {
          Send_SingleChar(i);                                                 //发送01到200
  }

  SREG|=0x80;                               //开启全局中断

  while(1);

}

USART.zip

111.76 KB, 下载次数: 0, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51Hei单片机16群 联系QQ:125739409;技术交流QQ群7344883

Powered by 单片机教程网

快速回复 返回顶部 返回列表