Atmega16单片机串口通信_串口= udr-程序员宅基地

技术标签: 串口通信  C语言  寄存器  AVR单片机  ATmega16  单片机  

Atmega16单片机串口通信

本篇文章参考自叶大鹏老师于2008年4月5日完成的UART通信PPT制作而成。

串口通信需要使用到的内部寄存器

在进行程序编写前需要对16单片机中的寄存器的作用和使用方法有所了解,下面为16单片机串口通信使用到的几个寄存器:

  1. USART I/O 数据寄存器 - UDR (UDR寄存器用于数据在传输中的存储):
    UDR寄存器用于数据在通信中的存储
  2. USART控制和状态寄存器A - UCSRA
    UCSRA寄存器
    寄存器中位的定义
    寄存器中位的定义
void uart_sendB(uchar data)        /*发送函数*/
{
    while(!(UCSRA&(BIT(UDRE))));   //等待发送缓冲器为空
    UDR=data;                      //将数据存入UDR寄存器
}
  1. USART控制和状态寄存器B - UCSRB
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
void uart_rx(void)              /*串口接收函数*/
{
    UCSRB&=~BIT(RXCIE);         //校验数据是否传输完成,关闭接收中断
    rdata=UDR;                  //将接收到的数据存入rdata
    flag=1;                     //标志位至1
    UCSRB|=BIT(RXCIE);          //接收完毕,开启中断
}
  1. USART控制和状态寄存器C - UCSRC
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  2. USART波特率寄存器 - UBRRL和UBRRH
    在这里插入图片描述
    在这里插入图片描述
#define mclk 8000000

    baud=mclk/16/baud-1;    //程序片段
    UBRRL=baud;             //设置波特率,先写低位再写高位
    UBRRH=baud>>8;          //设置波特率,先写低位再写高位

程序代码

本段程序编译环境为ICCAVR7 for AVR。
#include<iom16v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
#define mclk 8000000
#pragma interrupt_handler uart_rx:12
uchar rdata,flag=0;
void uart_init(uint baud)        //串口初始化
{
    UCSRB=0x00;
    UCSRA=0x00;
    UCSRC=(1<<URSEL)|(0<<UPM0)|(3<<UCSZ0);
    
    baud=mclk/16/baud-1;
    UBRRL=baud;
    UBRRH=baud>>8;
    UCSRB=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE);
    
    SREG=BIT(7);                    //开中断
    DDRD|=0x02;                     //设计发送口(TX)为输出,这很重要
}
void uart_rx(void)                  //串口接收函数
{
    UCSRB&=~BIT(RXCIE);         //校验数据是否传输完成,关闭接收中断
    rdata=UDR;                  //将接收到的数据存入rdata
    flag=1;                     //标志位至1
    UCSRB|=BIT(RXCIE);          //接收完毕,开启接收中断
}


void uart_sendB(uchar data)   //发送函数
{
    while(!(UCSRA&(BIT(UDRE)))); //等待发送缓冲器为空
    UDR=data;                    //将数据存入UDR
    while(!(UCSRA&(BIT(TXC))));
    UCSRA|=BIT(TXC);          
}

void main(void)
{
    uchar i=4;
    uart_init(19200);
    while(1)
    {
        if(flag)
        {
            uart_sendB(i);
            flag=0;
        }
    }
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_41889059/article/details/90602619

智能推荐

POJ 3311 Hie with the Pie(Floyd+状态压缩DP)-程序员宅基地

文章浏览阅读378次。C - Hie with the PieTime Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64uSubmit StatusDescriptionThe Pizazz Pizzeria prides itself in delivering pizzas to_hie with the pie

BroadCastReceiver的工作过程_解释一下 broadcast 和 intent 在 app 内传递消息的工作流程-程序员宅基地

文章浏览阅读389次。广播的注册过程 API版本 26 参考资料:Android开发艺术探索总体流程预览 在Activity中调用registerReceiver方法,最终调用的是ContextWrapper中的registerReceiver方法。 1 ContextWrapper registerReceiver@Override public Intent registerReceiver(_解释一下 broadcast 和 intent 在 app 内传递消息的工作流程

「无线安全」WIFI安全-1之浅谈Wi-Fi-程序员宅基地

文章浏览阅读1.8k次,点赞53次,收藏16次。WiFi 全称 `Wireless Fidelity`,又称为`802.11b`标准。`Wireless Fidelity`翻译过来是`无线保真`,其中保真是指要求在无线网络中可靠地传输数据。Wi-Fi是一种无线网络技术,可以用于无线互联网接入和数据传输。它是一项非常重要的技术,为我们提供了无线上网和连接设备的便利,通俗的讲就是一种把有线上网的方式转变成无线上网方式的技术。

小米官网轮播图js+css3+html实现-程序员宅基地

文章浏览阅读1.1k次。官网轮播:我的轮播:重难点:  1、布局  2、图片和右下角小圆点的同步问题  3、setInterval定时器的使用  4、淡入淡出动画效果  5、左右箭头点击时,图片和小圆点的效果同步  6、另一种轮播思维解答:  1、最底下容器使用相对定位,图片、小圆点、箭头均使用绝对定位悬浮在底部容器上,图片均的top和left值均设置..._使用html和css3开发制作小米商城网页,并利用javascript制作轮播图,从而完成

pycharm 光标突然变粗,无法正常书写_mac pychorm 工具游标莫名其妙-程序员宅基地

文章浏览阅读4.8k次,点赞4次,收藏3次。使用pycharm有时候不知道按到什么按键,中光标变粗,无法正常打代码,如下:此时pycharm变成了改写模式,只需要按下键盘的ins小按键(即insert键)即可切换成正常模式,问题就解决了...._mac pychorm 工具游标莫名其妙

postgis 坐标体系及文本转geometry格式转换_postgis将txt转换为geometry格式-程序员宅基地

文章浏览阅读412次。2、文本格式输入,通过在地理化文本中增加参数定义地理格式。from 重点场景边框2023 LIMIT 3。1、地理化字段直接转换。_postgis将txt转换为geometry格式

随便推点

JS仿qq下拉菜单_如何实现一个qq列表类似的js逻辑操作?-程序员宅基地

文章浏览阅读108次。功能:1、点击我的好友会展开下拉出具体的好友2、再次点击,会折叠内容3、首次点击某个具体的好友,只有当前这个好友高亮4、再次点击这个好友时,高亮状态就会消失主要练习:js绑定事件慢慢修改小细节:再次点击,会折叠内容时,里面的高亮要全部取消<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="._如何实现一个qq列表类似的js逻辑操作?

Allegro Inside ODB++ 安装_odb++ inside-程序员宅基地

文章浏览阅读7.6k次。allegro odb++ 工具下载地址:http://www.valor.com/en.aspx请选择操作系统您要下载的ODB + +内包装和单击相应的链接。http://www.valor.com/en/Products/ODBpp/Cadence%20Allegro_Inside%20Package.aspx下载并安装文件“ odb_inside_install.nt.v800..._odb++ inside

HTML之实现可隐藏式导航栏_html 怎么实现作于分栏并可以隐藏-程序员宅基地

文章浏览阅读1.3w次,点赞8次,收藏23次。HTML之实现可隐藏导航栏预计目标部分代码展示关键代码解释frame框架用法hideOrDisplayNavFrame()函数解释结果展示预计目标论坛系统中左右两列的框架集结构便于浏览者导航,但同时也使得浏览者的工作区域变小。浏览者希望必要的时候可以隐藏框架集中的某个框架,以使得其他相邻的框架占据尽可能打的面积,如下图所示。现在希望在 tool.html 页面中放置一个自定义命令按钮,单机此按..._html 怎么实现作于分栏并可以隐藏

pycharm 修改__author__-程序员宅基地

文章浏览阅读430次。2019独角兽企业重金招聘Python工程师标准>>> ..._ubuntu中pycharm修改code author

关于intouch软件打开项目时出现“另一会话正在编辑此应用。无法编辑此应用程序。”?_intouch另一会话正在编辑此应用程序-程序员宅基地

文章浏览阅读3.2k次。找到项目文件(注意是项目文件)地址,删除文件夹中的appedit.lok文件。_intouch另一会话正在编辑此应用程序

Python 图形化界面基础篇:使用弹出窗口和对话框_python程序运行窗口2023-程序员宅基地

文章浏览阅读3.5k次,点赞5次,收藏19次。在开发图形用户界面( GUI )应用程序时,与用户进行交互的一种常见方式是通过弹出窗口和对话框。这些弹出窗口允许用户输入数据、进行选择、查看信息等。 Python 的 Tkinter 库和一些第三方库提供了创建和管理弹出窗口和对话框的方法。在本篇博客中,我们将深入探讨如何使用这些功能来增强你的 GUI 应用程序。_python程序运行窗口2023