文章目录

  • 前言
  • 一、串行通信口的功能以及串行通信口的结构及原理
    • 1.1 串行通信口的功能
    • 1.2 51单片机串口的结构
  • 二、串行通信口的控制寄存器
    • 2.1 串行控制寄存器SCON
    • 2.2 电源控制寄存器PCON
    • 2.3 配置寄存器
      • 配置SCON寄存器
      • 配置PCON寄存器
      • 配置中断
    • 2.4 实验
      • 单片机向pc发送数据
      • PC向单片机发送数据,单片机接收数据
      • 2.5 实验现象
        • 单片机向PC发送数据
        • PC向单片机发送数据,单片机接收数据
  • 三、总结

前言

对于51单片机的串口通信学习进行一个总结,把自己的经验分享给大家,在学习过程中遇到了很多困难和不理解的地方,通过多次实践,对串口通信有了一个大概的了解,希望对大家能够有帮助。


一、串行通信口的功能以及串行通信口的结构及原理

1.1 串行通信口的功能

首先来了解什么是数据通信?

数据通信就是指单片机与单片机之间或者单片机和其他设备之间的信息交换

而数据通信又分为串行通信并行通信

  • 并行通信:数据的各位同时进行发送或接收的通信方式。优点是速率高。缺点是需要的传输线多,成本高,只适合近距离的数据通信。

  • 串行通信:一位一位的按顺序的进行发送或接收的通信方式。优点是需要的传输线少,成本低。缺点是传输的速率慢,适合远距离的数据通信。

从上述来看,串行口的功能,就是通过串行口连接的数据传输线大大减少,可以进行远距离的数据通信。

1.2 51单片机串口的结构

串口的结构如下图所示,
通过定时器T1计时,由T1产生溢出率,作为波特率发生器。

  • 两个数据缓冲器,SBUF。分别是发送数据的发送寄存器,读取数据的接收寄存器。
    串口写入时,写入的是发送寄存器,即数据向发送寄存器SBUF写入。
    向串口读时,读出的是接收寄存器,即数据由接收寄存器SBUF读出。

  • 定时器1产生波特率, 串口一般使用定时器1,模式2,八位自动重装模式,来产生溢出率,从而产生波特率。而且在配置定时器相关的寄存器时不用配置定时器中断,只是使用定时器1来产生波特率的功能。

  • 移位寄存器,在接受控制器的控制下,将输入的数据逐位移入接收SBUF。

  • 串行控制寄存器SCON,SCON的功能是控制串行通信口的工作方式以及工作的状态。


二、串行通信口的控制寄存器

2.1 串行控制寄存器SCON

SCON寄存器用来控制串行通信的工作方式及反映串行口的工作状态。SCON的地址是98H,可位寻址。如下图所示。

通过配置SCON寄存器来对串行通信的工作模式进行控制。
说说几个常用的位

  • SM1和SM2,组合确定串行口的模式,不同的模式下波特率不同,功能也不同,下面会详细介绍不同模式下的波特率该如何计算
  • REN,允许/禁止串行接收控制位。 由软件置位REN,即REN=1为允许串行接收状态,可启动串行口接收数据。
  • TI,发送中断请求标志位。主机通过串行口发送数据发送完成后,TI会置1,向串口申请中断,如果TI为1 就表示SUBF的数据已经发送完成了,要手动将TI位清零。(即SBUF=Data)
  • RI,接收中断请求标志位。从机接收到主机通过串行口接收到的数据后,RI会置1,即会串口申请中断,如果RI为1 就表示数据已经通过SBUF读取完成了,要手动将RI位清零。(即Data=SBUF)

2.2 电源控制寄存器PCON


这里我们只需要知道SMOD是啥就可以了。

  • SMOD位,就是波特率是否加倍,若SMOD=0,波特率不变。SMOD=1,波特率加倍SMOD默认为0。

2.3 配置寄存器

配置SCON寄存器


看,上图就是SCON寄存器的位图,下面以串口通信的模式1来举例。
模式1,那么
SM1和SM2就要配置成 0 1
REN,可置1,置1就是允许串行通信口接收数据,当不需要接收数据的时候可以置0。
后面的几位直接不看,一般用不到
TI和RI,也默认为0,当接收数据或发送数据的时候,会由硬件置1,继而触发中断,这时要由软件置1。
这样SCON寄存器就配置好了。
这样我的SCON配置如下

SCON=0x40;   //方式1   REN置1/0 允许/禁止数据接收的控制位

配置PCON寄存器

我们只需要明确一点,我的波特率是否需要加倍,如果加倍,那么PCON的第一位SMOD就要置1。
这样我的PCON就配置好了,如加倍

PCON |= 0x80;  //波特率加倍

配置中断

注意,定时器1,不用开中断,即ET1=0,因为定时器的功能只是产生波特率。
下图为串口和中断的连接图,较为直观,也比较好理解

下方代码块为中断服务子函数模块

// 串口中断函数模板
void Uart_Routine() interrupt 4
{if(RI==1)  {RI=0;}if(TI==1){TI=0;}
}

2.4 实验

单片机向pc发送数据

代码如下:
UART.c
因为是单片机向PC发送数据,不用接收数据,所以这里的SCON寄存器的REN位未置1,而模式1,SM1和SM2就要配置成 0 1。

#include <REGX52.H>/*** @brief 串口初始化* @param  无* @retval 无*/
void Uart_Init()    //4800bps@11.0592MHz
{SCON=0x40;   //方式1   REN置1 允许/禁止数据接收的控制位PCON |= 0x80;  //波特率加倍  //配置定时器1 模式二 8位自动重装TMOD&=0x0F;TMOD|=0x20;  //模式二TL1 = 0xF4;       //设定定时初值TH1 = 0xF4;        //设定定时器重装值ET1=0;   //不用开启中断 定时器在这里的作用是产生波特率TR1=1;   //启动定时器1}/*** @brief 串口发送一位字节数据* @param  Byte 要发送的字节数据* @retval 无*/
void Uart_SendByte(unsigned char Byte)
{SBUF=Byte;   //向缓存器中写入内容while(TI==0);   //发送中断标志位 如果检测到了寄存器的TI位 如果为0 就表示数据未发送完成  反复执行本条语句检测TI位//如果TI为1 就表示SUBF的数据已经发送完成了  马上执行下条语句将TI位清零TI=0;
}

main.c
这里,调用UART模块里的串口发送一位字节数据的函数,向PC发送递增的数据。

#include <REGX52.H>
#include "Delay.h"
#include "Uart.h"unsigned char Sec;
void main()
{Uart_Init();while(1){Sec++;Uart_SendByte(Sec);Delay(50);}
}

PC向单片机发送数据,单片机接收数据

UART.c
这里,因为单片机要接收自己发送到PC里的数据,简而言之就是MCU->PC,然后PC->MCU

#include <REGX52.H>/*** @brief 串口初始化* @param  无* @retval 无*/
void Uart_Init()    //4800bps@11.0592MHz
{SCON=0x50;   //方式1   REN置1 允许/禁止数据接收的控制位  允许接收 REN置1PCON |= 0x80;  //波特率加倍  //配置定时器1 模式二 8位自动重装TMOD&=0x0F;TMOD|=0x20;  //模式二TL1 = 0xF4;       //设定定时初值TH1 = 0xF4;        //设定定时器重装值ET1=0;   //不用开启中断 定时器在这里的作用是产生波特率TR1=1;   //启动定时器1//接收数据完成后就触发中断ES=1;EA=1;
}/*** @brief 串口发送一位字节数据* @param  Byte 要发送的字节数据* @retval 无*/
void Uart_SendByte(unsigned char Byte)
{SBUF=Byte;   //向缓存器中写入内容while(TI==0);   //发送中断标志位 如果检测到了寄存器的TI位 如果为0 就表示数据未发送完成  反复执行本条语句检测TI位//如果TI为1 就表示SUBF的数据已经发送完成了  马上执行下条语句将TI位清零TI=0;
}/* 串口中断函数模板
void Uart_Routine() interrupt 4
{if(RI==1)   //如果接收到数据 接收完成后 产生中断 如果是接收中断  //发送数据也会产生中断{P2=SBUF;  //从SUBF缓存器中读取数据Uart_SendByte(SBUF);RI=0;}
}
*/

main.c
如果接收到数据 接收完成后 产生中断 ,单片机把SBUF缓存里的数据读取出来了,因为检测到了接收中断,即RI=1,在主函数写了串口中断函数,检测是否接收中断,把接收到的数据,以LED灯的形式显示出来。

#include <REGX52.H>
#include "Delay.h"
#include "Uart.h"unsigned char Sec;
void main()
{Uart_Init();while(1){}
}
void Uart_Routine() interrupt 4
{if(RI==1)   //如果接收到数据 接收完成后 产生中断 如果是接收中断  //发送数据也会产生中断{P2=SBUF;  //从SUBF缓存器中读取数据Uart_SendByte(SBUF);RI=0;}
}

2.5 实验现象

单片机向PC发送数据

可以看到单片机向PC发送递增的数据,直到关闭串口,数据停止发送。

PC向单片机发送数据,单片机接收数据

可以看到在PC上发送0xF0,LED灯以相应的状态亮起,串口数据发送成功。

三、总结

首先要保证双机通信时,配置的波特率相同

然后串口通信主要要明确S**CON中的RN,SM0和SM1模式位的选择,以及RI和TI和理解。

在配置定时器1的时候,一定不要开定时器中断,即ET1=0,因为定时器的功能只是产生波特率。

然后定时器1产生的波特率该如何计算,计时器的初始值应该如何计算,将会在下一篇文章中详细说明。

希望对你有帮助,行文仓促,还请谅解,欢迎指错。

51单片机-串口通信(串口向电脑发送信息电脑通过串口控制LED)相关推荐

  1. 单片机实验八 RS232串口通信实验(接收与发送)

    实验八 RS232串口通信实验(接收与发送) 一.实验目的 1.熟悉实验软件和硬件,进行正确的接线: 2.通过实验了解串口的基本原理及使用,理解并掌握对串口进行初始化: 3.使用串口调试助手做为上位机 ...

  2. STM32串口通信中使用printf发送数据配置方法 开发环境 Keil

    STM32串口通信中使用printf发送数据配置方法(开发环境 Keil RVMDK) 已有 12456 次阅读2011-6-29 23:29 | 在STM32串口通信程序中使用printf发送数据, ...

  3. 【Arduino】双主板串口通信并将光敏传感器信息上传到阿里云

    [Arduino]双主板串口通信并将光敏传感器信息上传到阿里云 文章目录 [Arduino]双主板串口通信并将光敏传感器信息上传到阿里云 前言 一.所需材料 二.掌控板部分 1.引入库 2.配置WiF ...

  4. 51单片机红外通信及控制LED灯(LCD1602显示)

    51单片机红外通信及控制LED灯(LCD1602显示) 大家好,又和大家见面了,离上一次DS18B20传感器的文章已经过去了一个星期了,这期我将给大家带来,基于STC89C52芯片和HS0038红外接 ...

  5. 51单片机串口通信原理、相关寄存器配置与简单串口收发程序代码

    目录 1. 串口通信原理 2. 51单片机串口通信 2.1 串口简要模式图 2.2 相关寄存器 (1)PCON.SCON.SBUF (2)IE.IPH.IP (3)配置T1定时器 2.3 波特率和系统 ...

  6. 51单片机——中断系统、外部中断、定时器中断、串口通信C语言入门编程

    目录 中断系统: 外部中断: 1.外部中断0.1:当触发时,LED状态取反 定时器中断: 1.定时器0.1:LED以1S为周期闪烁 串口通信: 1.串口中断:通过串口发送什么数据给单片机,单片机再通过 ...

  7. 【51单片机快速入门指南】4.4.1:python串口接收磁力计数据并进行最小二乘法椭球拟合

    目录 硬知识 Python代码 使用方法 串口收集数据 椭球拟合 验证 STC15F2K60S2 16.384MHz Keil uVision V5.29.0.0 PK51 Prof.Develope ...

  8. 采用串口中断方式实现串口通信:停止/持续发送“hello windows!”

    文章目录 一.stm32接收到字符"s"/"t"时停止/持续发送"hello windows!" 1.STM32CubeMX工程创建 2.程 ...

  9. python串口通信的接收与发送_python串口编程整理(更新完)

    python的串口网上有很多例子,这里了只是把认为好的整理到一起. 首先,应该安装serial模块,还能开始后续的操作.我用的python2.6,serial模块可以在这里下载安装serial模块下载 ...

最新文章

  1. Got MethodID of ReferenceType that is not a member of the ReferenceType
  2. PyTorch基础-线性回归以及非线性回归-02
  3. Android开发过程中的部分经验总结
  4. 关于sqoop增量导入oracle的数据到HDFS的出现的错误总结
  5. 【转载】正则表达式30分钟入门教程
  6. 每行代码都有注释释的java面向对象代码_每行代码都有注释释的java面向对象代码...
  7. nagios监控linux主机,Nagios监控平台之二:nrpe监控远程Linux主机 | 旺旺知识库
  8. 软件_linux命令cp目录路径和通配符
  9. 圈复杂度(Cyclomatic Complexity)-转
  10. 优化器,sgd,adam等
  11. Python print 不换行,Print Without Newline In Python
  12. 小米平板2wifi驱动下载_Xiaomi小米随身WiFi驱动下载
  13. css筋斗云,CSS3 七龙珠筋斗云动画
  14. thinkadmin 各种回调的使用
  15. 程序人生 - 敬酒常识
  16. STM32F429 13. SPI 通讯(code)
  17. C#|Winform编程之(列表视图控件)listView控件
  18. 漏洞复现-网康下一代防火墙 RCE
  19. 【读论文】A Deep Neural Network for Unsupervised Anomaly Detection and Diagnosis in Multivariate Time...
  20. 帝国理工计算机科学硕士,帝国理工计算机硕士介绍

热门文章

  1. Linux实时调度策略(SCHED_RR)和CFS(SCHED_OTHER)之间的区别
  2. Zemax-如何导入实体?
  3. zemax---Merit Function Editor
  4. Matlab 电磁波垂直入射、透射和反射
  5. 百度推送启动与停止服务的语句是_这些网课学习栏目推送低俗信息,国家网信办查处!...
  6. 多线程调试(gdb命令行和使用集成开发qtcreator查看线程状态)
  7. kodi直播电视,电视台分类管理,想看哪个一目了然
  8. 计算机管理无法格式化硬盘,无法选择或格式化硬盘分区 - Windows Server | Microsoft Docs...
  9. BetaFlight深入传感设计之九:传感坐标系/机体坐标系/导航坐标系/经纬度坐标系
  10. 四合天地软件测试系统,GZ-2017025软件测试赛题.-全国职业院校技能大赛.doc