基于51单片机的UART串口通信

发布者:WanderlustGlow最新更新时间:2024-03-19 来源: elecfans关键字:51单片机  UART  串口通信 手机看文章 扫描二维码
随时随地手机看文章

  51单片机是对所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8004单片机,后来随着Flash rom技术的发展,8004单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。很多公司都有51系列的兼容机型推出,今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。需要注意的是51系列的单片机一般不具备自编程能力。


  UART是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART用于主机与辅助设备通信,如汽车音响与外接AP之间的通信,与PC机通信包括与监控调试器和其它器件,如EEPROM通信。


  计算机内部采用并行数据,不能直接把数据发到Modem,必须经过UART整理才能进行异步传输,其过程为:CPU先把准备写入串行设备的数据放到UART的寄存器(临时内存块)中,再通过FIFO(First Input First Output,先入先出队列)传送到串行设备,若是没有FIFO,信息将变得杂乱无章,不可能传送到Modem。它是用于控制计算机与串行设备的芯片。有一点要注意的是,它提供了RS-232C数据终端设备接口,这样计算机就可以和调制解调器或其它使用RS-232C接口的串行设备通信了。


  作为接口的一部分,UART还提供以下功能:将由计算机内部传送过来的并行数据转换为输出的串行数据流。将计算机外部来的串行数据转换为字节,供计算机内部并行数据的器件使用。在输出的串行数据流中加入奇偶校验位,并对从外部接收的数据流进行奇偶校验。在输出数据流中加入启停标记,并从接收数据流中删除启停标记。处理由键盘或鼠标发出的中断信号(键盘和鼠标也是串行设备)。


  可以处理计算机与外部串行设备的同步管理问题。有一些比较高档的UART还提供输入输出数据的缓冲区,比较新的UART是16550,它可以在计算机需要处理数据前在其缓冲区内存储16字节数据,而通常的UART是8250。如果您购买一个内置的调制解调器,此调制解调器内部通常就会有16550 UART。接下来我们一起了解一下基于51单片机的UART串口通信

  51串行口结构

  51单片机的UART串行通信是基于其串行口的可编程硬件结构,只要用正确的程序代码通过初始化串行口对应寄存器的形式将其串行硬件结构初始化,再编写符合此串行口通信的程序代码便能够实现串行通信,其硬件结构决定了编程机制( 当然还要靠51芯片内CPU等机制 )。

  此结构具有UART( 通用异步收发器 )的全部功能,能同时进行数据的发送和接收,也可作为同步移位寄存器使用。此结构集成于单片机内部。

  基于51单片机的UART串口通信


  51串行口通信编程机制

  决定编程机制的先决条件是51单片机的硬件结构及51芯片内部CPU的执行机制。根据串行通信口硬件结构,实现UART通信可以分为两步:

  (1)初始化串行通信口( UART )

  配置SCON:设定串口方式( SM0及SM1位配置4种方式 );串口是否要接收数据(REN位 )

  设定PCON寄存器的SMOD位(若非串口方式0 )

  若串口为方式1和方式3,则需要配置TMOD:选择定时器1并配置其初值装载方式(MI M0位 ),并设置TH1,TL0的初值以确定通信的波特率(由波特率的计算公式 ),然后配置TCON:开启定时器1( TR1 )。

  允许使用中断( ES ),开启UART中断( EA )

  可以这些寄存器的配置含义可以查看相应的知识点:中断配置IE寄存器、定时/计数方式配置寄存器TMOD、定时/计数控制寄存器及通信寄存器SCON寄存器笔记。

  (2)程序实现:编写发送/接收数据代码及中断服务程序

  注:TI及RI的置位可查看SCON寄存器TI RI被置位的条件

  [1]发送的数据需要通过程序指令“SBUF =数据;”来将数据送往串行发送缓冲寄存器中,在此条语句后,要用循环判断SCON寄存器中的TI位是否被硬件置位1(表示发送完毕),等待发送完毕,TI置位被置为1时会进入串行中断服务程序[由此不能在串行中断服务程序里面将TI置0,因为从循环里面进入中断后会返回到循环语句中来,所以要在串行中断服务程序之外将TI置0,置0的目的是提供下一次数据发送成功的依据或进入中断服务器程序 ],需要用程序代码将TI重新置为0;然后再由CPU控制的时序将数据从TXD( P3.1 )脚发出,经过连接的串口线到从设备(接收数据的设备 )。

  [2]获取接收到数据时需要通过程序指令“存数据变量=SBUF;”将串行接收缓冲寄存器接收到的数据读取到程序中来,当接收到数据完毕后,RI会被硬件置位1,此时也会进入串行中断服务程序,需要用程序指令将RI重新置位0。当然接收数据是由RXD( P3.0 )引脚完成。

  [3]串行中断服务程序的中断号为4,所以编写串行中断服务程序时需要有以下格式:

  void 函数名() interrupt 4

  {

  中断服务程序内容

  }

  串行中断服务函数当TI或RI被硬件置位1时才被系统调用。TI被硬件置1的情况是,当串行发送缓冲寄存器内的数据被通过TXD( P3.1 )发送完毕时( 不同的串口方式置1条件不同 )不是指将数据存入串行发送缓冲器中时TI会被置1,同理RI被置1的情况是当RXD( P3.0 )接收到数据将此数据按位存入串行接收缓冲寄存器内完毕时( 不同串口方式置1的条件不同 )不是指从串行接收缓冲寄存器读完数据时RI会被置1。这个数据的长度和TI( RI )被置位1根据串行通信方式不同而不同。

  对于用程序来实现51单片机中的串行通信还需要明确两点(与其它部分的联系):

  (1)在51单片机串行通信的方式1和方式3中,波特率由定时器1的溢出率决定。

  (2)SBUF为特殊功能寄存器,它在程序中的两种不同的指令形式表示不同的含义,当在程序中用写指令“SBUF=a;”时,表示将a存入串行数据发送缓冲寄存器中;当在程序中使用读指令“a=SBUF;”时,表示向串行数据接收缓冲寄存器读数据并将得到数据赋值于a。接收器具有双缓冲结构,即在从接收寄存器中前一个已经收到的字节之前,便能接收第二个字节,如果第二个字节已经接收完毕,第一个字节还没有被读出,则第一个字节就损失( 被覆盖 )。而发送器中的数据是由CPU控制的,所以不必程序用户担忧。


  程序实现串行通信

  程序的大体框架为main主函数、串行中断服务程序、子函数(初始化串口、延时函数,字符串处理函数等)

  (1)首先是用程序实现串行通信的初始化

  基于51单片机的UART串口通信

  (2)用程序实现发数据

  将要发送的数据赋值给SBUF即可。

  基于51单片机的UART串口通信

  (3)在中断函数中接受数据

  不管发送数据成功还是接受到数据都会进入到中断程序中,故而在中断程序中判断是否RI被置位为1,如是则表示收到了数据。

  基于51单片机的UART串口通信

  然后只需要在主程序main函数中调用串行口初始化函数及用一定的逻辑调用数据发送函数即可。

  (4)通过串口调试助手来观察程序执行效果

  【1】发数据显示

  设置串口调试助手:

  基于51单片机的UART串口通信

  在串口调试助手中按照下划线部分设置后,结果显示区域就会显示由程序发将上来的数据。

  【2】串口调试助手往单片机发送数据并再显示到串口调试界面之上

  基于51单片机的UART串口通信

  对串口调试助手的设置除了发送数据之上的设置之外还需要在表格中填入字符串,然后点击表格下画圈使之为“停止循环发送”,然后就可以将收到的数据同将要发送的数据一起发送到串口调试界面之上来。


关键字:51单片机  UART  串口通信 引用地址:基于51单片机的UART串口通信

上一篇:基于51单片机的温度报警器设计
下一篇:51单片机的在线仿真环境搭建

推荐阅读最新更新时间:2024-11-12 22:20

一文看懂STM32单片机和51单片机区别
 单片机简介      51单片机简介   应用最广泛的8位单片机当然也是初学者们最容易上手学习的单片机,最早由Intel推出,由于其典型的结构和完善的总线专用寄存器的集中管理,众多的逻辑位操作功能及面向控制的丰富的指令系统,堪称为一代“经典”,为以后的其它单片机的发展奠定了基础。   51单片机之所以成为经典,成为易上手的单片机主要有以下特点:   51单片机特性   1、从内部的硬件到软件有一套完整的按位操作系统,称作位处理器,处理对象不是字或字节而是位。不但能对片内某些特殊功能寄存器的某位进行处理,如传送、置位、清零、测试等,还能进行位的逻辑运算,其功能十分完备,使用起来得心应手。   2、同时在片内RAM区间还
[单片机]
一文看懂STM32单片机和<font color='red'>51单片机</font>区别
51单片机】(手把手教你)1602液晶屏-基础篇
1602液晶简介 1602液晶也叫1602字符型液晶,16x02,每行16个字符显示两行。它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。 #度娘告知 引脚接口说明 1602液晶上有16个引脚,上面依次标了上述符号,与单片机上的接口依次对应连接即可,如图: 原理图 想知道如何操作液晶屏就需要看清楚自己单片机上与液晶屏连接引脚的控制原理图,我使用的是郭天祥的51单片
[单片机]
【<font color='red'>51单片机</font>】(手把手教你)1602液晶屏-基础篇
51单片机汇编语言实例2
简介:上面的单片机系统和汇编语言控制指令,很容易被更改为多口、多位的单键控制系统。图5为多个LED灯-单个按键的运行结果与汇编语言。图6中对P2.0口改用双掷开关,实现P2.0口的两种电平状态。 a)单个按键与多个LED灯(位操作—输入与字节操作—输出)—判断与子程序 此处只是将输出指令由位指令换成了字节指令,而输入判断仍然是位判断指令。 ORG 0000H MAIN: ;CLR C MOV C,P2.0 ;获取P2.0位状态送位累加器;位与字节转换需要判断指令 JNC ZIJIE;JC位累加器—进位位为1转移到ZIJIE , JNC位累加器为0转移到ZIJIE
[单片机]
<font color='red'>51单片机</font>汇编语言实例2
51单片机温度控制电路
51单片机温度控制电路 单片机硬件系统框图
[单片机]
<font color='red'>51单片机</font>温度控制电路
51单片机串口通信及波特率设置
MCS-51单片机具有一个全双工的串行通信接口,能同时进行发送和接收。它可以作为UART(通用异步接收和发送器)使用,也可以作为同步的移位寄存器使用。 1. 数据缓冲寄存器SBUF SBUF是可以直接寻址的专用寄存器。物理上,它对应着两个寄存器,即一个发送寄存器一个接收寄存器,CPU写SBUF就是修改发送寄存器;读SBUF就是读接收寄存器。接收器是双缓冲的,以避免在接收下一帧数据之前,CPU未能及时的响应接收器的中断,没有把上一帧的数据读走而产生两帧数据重叠的问题。对于发送器,为了保持最大的传输速率,一般不需要双缓冲,因为发送时CPU是主动的,不会产生重叠问题。 2. 状态
[单片机]
51单片机C语言学习笔记4:keil C51绝对地址访问
在利用keil进行8051单片机编程的时,常常需要进行绝对地址进行访问.特别是对硬件操作,如DA AD 采样 ,LCD 液晶操作,打印操作.等等. C51提供了三种访问绝对地址的方法: 1. 绝对宏: 在程序中,用 #include absacc.h 即可使用其中定义的宏来访问绝对地址,包括: CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD 具体使用可看一看absacc.h便知 例如: #include absacc.h #define ADstart XBYTE //总线方式访问AD #define ADL XBYTE #define ADH
[单片机]
STM32F103学习笔记——串口通信
在STM32串口通信程序中使用printf发送数据,非常的方便。可在刚开始使用的时候总是遇到问题,常见的是硬件访真时无法进入main主函数,其实只要简单的配置一下就可以了。 下面就说一下使用printf需要做哪些配置。 有两种配置方法: 一、对工程属性进行配置,详细步骤如下 1、首先要在你的main 文件中 包含“stdio.h” (标准输入输出头文件)。 2、在main文件中重定义函数。如下: int fputc(int ch, FILE *f) // 发送数据 { USART_SendData(USART1, (unsigned char) ch);// USART1 可以换成 USA
[单片机]
51单片机还适合作为初学者入门的单片机吗?
对于很多初学者来说考虑要不要从51单片机入门是个挺头疼的问题。毕竟现在许多公司已经不用51单片机做产品了。但是51单片机流行了这么久,它肯定是一款很经典的产品。我以前也是从51开始学的。 我个人的建议是从51单片机作为入门是一个非常不错的选择。大多数的从业者都是以51单片机作为起点的。下面就具体说说我推荐51作为入门的具体原因。 容易入门 我们作为初学者脑海里可能没有单片机的概念,如果我们入门以STM32或者STM8S这类单片机来入门的话,作为初学者我们会感到迷茫无从下手。STM32这类的单片机内容会比较多,一开始就要了解单片机的方向寄存器还要了解单片机的数据寄存器,甚至还有库函数,太多的知识涌入进来,一时间让初学
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved