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

智能推荐

免费开源!细节拉满的一个2D实时水面反射效果Demo,基于Cocos Creator 3.5-程序员宅基地

文章浏览阅读464次。引言:插件Easy NavMesh、BenchMark 性能检测的作者孙二喵,从开发者王师傅的论坛分享中获得启发,实现了 2D 实时水面反射效果,Demo 免费开源。2D 实时水面反射Demo 效果前几天看到论坛大佬的 2D 水面 Shader 教程(注:后文有详细内容),效果挺好的,就跟着在 Cocos Creator 3.5.2 中做了一个,实现 2D 实时水面反射,并支持角色移动,开箱即用..._cocos creator 2d镜面反射

SIMATIC C7-635西门子触摸屏维修6ES7635-2EB02-0AE3-程序员宅基地

文章浏览阅读345次,点赞9次,收藏8次。西门子的ET200系列是采用PROFIBUS-DP协议的分布式I/O,应用时,S7PLC作为DP主站,通过带有集成DP接口的CPU315-2DP接到PROFIBUS总线,ET200作为DP从站接到PROFIBUS。黑液蒸发把洗选工段产生的副产品------稀黑液高度浓缩后送燃烧工段处理,碱回收设备的工况恶劣,尤其是腐蚀性和黑液结垢问题很为棘手,平稳整个工艺过程的运行,使设备工作在合理,工艺参数范围内是减慢结垢速度、延长设备使用寿命的方法。系统采用主站加从站的结构,可使系统造价降低,并且扩展灵活。

LvieGBS国标GB/T28181视频流媒体平台支持预置位查询预置位设置预置位调用预置位删除_gb28181 预置点-程序员宅基地

文章浏览阅读2k次。GB/T28181视频流媒体平台支持预置位查询预置位设置预置位调用预置位删除1、摄像头预置位2、预置位2.1、预置位列表2.2、预置位设置2.3、预置位调用2.3、预置位删除3、搭建GB28181视频直播平台1、摄像头预置位摄像头的预置位是将监视的区域与球机的运动状态关联在一起的手段。可以通过配置设置预置位点,在需要快速监控指定区域的时候,通过调用,摄像头的云台可以运动到指定的监控区域。2、预置位2.1、预置位列表国标设备-》查看通道-》播放2.2、预置位设置2.3、预置位调用2.3、_gb28181 预置点

Python import各种包遇到的问题_import helper出错-程序员宅基地

文章浏览阅读1.5k次。对于一般的包,直接File->Settings->Project Interpreter->点加号搜名字就行了但是在安装seaborn的时候,总是提示出错,问题可能在于seaborn要依赖于scipy,但是装seaborn的时候他不给你装scipy,只能手动去装,于是我就去一个网站下载了scipy:http://www.lfd.uci.edu/~gohlke/pythonlibs/#sci_import helper出错

大学生网页作业设计HTML,库里网页_库里的html动态网页-程序员宅基地

文章浏览阅读1.3k次,点赞3次,收藏11次。大学生网页代码,静态动态都可以做,这是我随手做的球星库里的网页_库里的html动态网页

SVN命令行基本操作_svn命令 显示修改列表-程序员宅基地

文章浏览阅读467次。原文地址:http://blog.csdn.net/hekunhotmail/article/details/9302541以下是我常用到的svn 命令行,整理了一下,这东西版本控制上很有用,所以不会不行,当然,你也可以选择一些svn图形界面的工具0 查看当前工作目录svn 状态简写:svn st1、将文件checkout到本地目录svn checkout path(path是_svn命令 显示修改列表

随便推点

运维自动化之puppet-dashboard(7)-程序员宅基地

文章浏览阅读80次。安装配置:yum -y install rubygem-rake ruby-mysqlyum localinstall puppet-dashboardgem install rakemysql授权create database dashboard character set utf8;grant all on dashboard.* TO 'dashboard'@'%' i..._dashboard 自动化的应用

《数据结构 C语言版 严蔚敏 第2版》:树和二叉树_数据结构c语言版严蔚敏第二版-程序员宅基地

文章浏览阅读373次,点赞4次,收藏2次。《数据结构 C语言版 严蔚敏 第2版》:树和二叉树_数据结构c语言版严蔚敏第二版

你的css选择器可视化备忘录-程序员宅基地

文章浏览阅读808次,点赞19次,收藏27次。这个 CSS 规则选择了在另一个元素之后出现的任何元素(除了容器中的第一个元素),并在顶部应用了一定的边距,有效地使元素均匀地间隔开来。有一种望而却步的赶脚。,因为它会匹配页面上的所有元素,包括嵌套元素,这可能会增加浏览器的渲染负担。这使得子选择器非常有用,因为它可以帮助我们更精确地定位特定层次结构的元素,并应用相应的样式。允许我们选择与指定元素具有相同父元素且位于其后面的所有兄弟元素,而不仅仅是直接的兄弟元素。例如,如果我们想为页面上的所有元素设置相同的字体样式,我们可以使用通用选择器来实现。

使用poi导出嵌套对象(一对多、多对多)_execl poi导出 1对多的关系-程序员宅基地

文章浏览阅读4k次,点赞4次,收藏13次。Workbook workbook = new WorkbookBuilder(new SXSSFWorkbook()) .setDefaultRowHeight(20) .matchingAll() .setFontHeight(12) .setFontName("微软雅黑") .setVerticalAlignment(VerticalAlignment.CENTER) .setAlignment(HorizontalAlignment.CENTER) .se._execl poi导出 1对多的关系

pandas基础学习-程序员宅基地

文章浏览阅读27次。作为参数,0表示第一行,1表示第2行,以此类推。DataFrame意为数据框架,是Pandas库中的一种数据结构,类似于二维表,由行和列组成,与Series一样支持多种数据类型。loc属性,以列名(columns)和行名(index)作为参数,当只有一个参数时,默认是行名,即抽取整行数据,包括所有列。修改行标题,使用DataFrame对象的index属性直接赋值,,或者使用DataFrame对象的rename方法修改行标题。缺失值的处理方式有不处理、删除、填充或替换、插值(均值、中位数、众数等填补)_pandas基础

关于将android项目发布到jcenter的最新最全说明_publication not found-程序员宅基地

文章浏览阅读3.1k次。方式一 一些坑提醒 项目中含有中文,那么请全局设置utf-8编码或者,使用另一种方式生成JavaDoc(可以仔细看下方生成JavaDoc方式,不一样的) 上传的库的名字,是和你Module的名字是一样的!!!所以你的Module叫什么,你的gradle依赖路径就是: groupId:moduleName:publishVersion 下面的步骤只是将项目提交到Maven里面,你要在提交完成后_publication not found

推荐文章

热门文章

相关标签