51单片机串口使用

article/2025/10/14 20:39:08

文章目录

  • 前言
  • 一、串口概念
  • 二、中断中的RI、TI和SUBF
    • 1.RI
    • 2.TI
    • 3.SUBF
  • 三、串口波特率的计算
  • 四、代码的编写
  • 总结


前言

今天将为大家讲解51单片机的串口原理及代码编写。

一、串口概念

51单片机串口是一种通信接口,它可以将51单片机与外部设备连接起来,实现数据的双向传输。51单片机串口的原理是,51单片机的串口接口由两个管脚组成,一个是RXD,另一个是TXD,RXD用于接收数据,TXD用于发送数据。当51单片机接收到外部设备发送的数据时,它会将数据放入串口缓冲区,然后通过RXD管脚将数据发送到51单片机的内部。当51单片机要发送数据时,它会将数据放入串口缓冲区,然后通过TXD管脚将数据发送到外部设备。
通过串口我们就能实现单片机和PC机的通信了。

二、中断中的RI、TI和SUBF

1.RI

RI是接收标志位,当51单片机接收到外部设备发送的数据时,RI会被置位。
当进行下一次接收时需要手动将RI清零。

2.TI

TI是发送标志位,当51单片机要发送数据时,TI会被置位。
当进行下一次发送时需要手动将TI清零。

3.SUBF

SBUF是串口缓冲区,它用于存放51单片机接收到的数据和要发送的数据。
SBUF一次只能发送和接收一个字节的数据。

三、串口波特率的计算

51单片机串口波特率的计算方法是:波特率=时钟频率/(16*(256-波特率寄存器值))。其中,时钟频率是51单片机的时钟频率,波特率寄存器值是51单片机的波特率寄存器的值。
一般我们是不会自己去计算串口的波特率的,我们使用STC-isp这个软件来帮助我们生成相应的代码。
STC-isp软件:
在这里插入图片描述
在STC-isp中可以帮助我们去生成对应的代码。
我们只需要注意波特率和系统频率等重要参数选择即可。
在这里插入图片描述
生成代码后将代码复制到自己的工程中就行了。

四、代码的编写

串口初始化代码

/*******************************************************************************
* 函 数 名       : uart_init
* 函数功能		 : 串口通信中断配置函数,通过设置TH和TL即可确定定时时间
* 输    入       : baud:波特率对应的TH、TL装载值
* 输    出    	 : 无
*******************************************************************************/
void uart_init(u8 baud)
{TMOD|=0X20;	//设置计数器工作方式2SCON=0X50;	//设置为工作方式1PCON=0X80;	//波特率加倍TH1=baud;	//计数器初始值设置TL1=baud;ES=1;		//打开接收中断EA=1;		//打开总中断TR1=1;		//打开计数器		
}

串口中断函数
每当串口接收或者发送一个字符串时都会进入串口中断。
RI和TI在上面我们已经说到过了,这里我就直接使用了。

这里定义一个busy发送标志位当在发送数据时busy=1代表串口进入了忙状态,当串口成功发送完一个字符时busy=0,进入空闲状态,这样可以保证我们每一个字符都被成功的发送出去。
定义一个buf用于接收PC机给单片机发送的数据。每当发生一次接收中断都会将接收到的字符串放入buf中。

bit busy = 0;//发送标志位
unsigned char buf[30];//接收缓冲区void serial_handle() interrupt 4
{if(TI){       TI = 0;busy = 0;//进入空闲状态}else if(RI){buf[i] = SBUF;i = (i + 1) % 30;}}

发送一个字符和发送字符串函数
发送一个字符非常的简单,只需要将要发送的字符放入SBUF中即可。
发送一个字符串就是将字符串中的一个个的字符发送出去就可以了,这里用到了指针的操作不熟悉的小伙伴可以去复习一下C语言。

void SendData(unsigned char dat)
{while(busy);busy = 1;//进入忙状态	SBUF = dat;	
}void SendString(char *s)
{while(*s){SendData(*s++);}
}

发送测试

void main(void)
{/*主函数*/uart_init(0XFA);while(1){SendString("Hello World\r\n");delayms(1000);}}

效果:
每隔一秒就打印一次Hello World。
在这里插入图片描述
接收测试:

	if(strcmp(buf, "LED1 ON") == 0){P2 = 0xfe;memset(buf, 0, sizeof(buf));}

在这里插入图片描述
在串口助手上发送LED1 ON让LED1打开,使用串口的数据后使用memset函数清空buf缓冲区,因为缓冲区的大小都是有限的,所以需要我们手动清空缓冲区。

总结

串口在debug中有非常重要的重要,希望大家都能够将他掌握。


http://chatgpt.dhexx.cn/article/kMxZ06hT.shtml

相关文章

51单片机串口通信

串口通信 1、通信的基本概念2、 51单片机串口介绍2.1、串口通信简介2.2、串口内部结构2.3、串口通信寄存器SCONPCON 2.4、串口工作方式 3、串口使用方法3.1、硬件3.2、通信协议RS2323.3、串口初始化 4、硬件设计5、 软件设计6、拓展 串口的通信,一般是检测通信模块是…

UART串口通信

什么是串行通信? 将数据字节分成一位一位的形式在一条传输线上逐位地发送。 优点:成本低,控制复杂。 什么是异步通信? 异步通信是指通信的发送与接收设备使用各自的时钟控制数据的发送和接收过程。为使双方的收发协调,要求发送和接收设备的时钟尽可能一致。 异步通信的两…

MCU-51:单片机串口详解

目录 一、计算机通信简介二、串口通信简介2.1 同步通信2.2 异步通信 三、串行通信的传输方式四、串口通信硬件电路五、常见接口介绍六、串口相关寄存器详解6.1 特殊功能寄存器SCON6.2 PCON寄存器6.3 TMOD寄存器 七、代码演示-单片机和电脑通信7.1 串口向电脑发送数据7.2 电脑通…

51单片机学习入门(三):串口

1.串口是什么? 串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信。单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信。 51单片机内部自带UART(…

51单片机——串口通信(发送和接受数据)

目录 一、实现的功能 二、串口通信 2.1单片机发送数据 2.1.1串口初始化 2.1.2串口发送程序 2.1.3发送效果 ​2.2单片机接收数据 2.2.1串口初始化 2.2.2接收数据程序 2.2.3接收效果 一、实现的功能 通过串口(UART)让单片机与计算机进行通信。51单…

51单片机-串口通信

目录 1.什么是通信 1.1.通信的概念 1.2.传送方式 1.3.同步方式 1.4.传送方向 1.5.校验方式 2.单片机串口介绍 2.1.硬件电路 2.2.电平标准 2.3.常见接口 2.4.内部结构 2.5.相关寄存器 2.6.工作模式(模式1) 2.7.如何配置串口中断 3.实际应用…

IDEA调试注解处理器AbstractProcessor

1.右击项目Open In->Terminal 执行命令mvnDebug clean package 查看端口号 2.添加远程调试配置监听的端口 3.debug启动远程调试就欧克了

强大的IDEA调试工具

在开发中难免会遇到bug,而如何去跟有效率的去修复bug,除了必要的经验之外,巧妙的使用工具也是非常有必要的。 一下就是对IDEA强大调试工具的介绍 在调试代码的时候,你的项目得debug模式启动,也就是点那个绿色的甲虫启动…

IntelliJ IDEA调试显示表达式结果

今天无意中看到使用IntelliJ IDEA调试代码时,可以看到某段表达式的结果,如 在调试时,若想看到optStu.get().getName()的值该怎么做? 只需选中它 然后右键 点击Evaluate按钮即可出现result

idea 调试 java,将Intellij-IDEA调试器附加到正在运行的java进程

Is it possible to attach Intellij-IDEA debugger to a running java process? 解决方案 Yes! Here is how you set it up. Run Configuration Create a Remote run configuration: Run -> Edit Configurations... Click the "+" in the upper left Select the …

idea调试unity里面的lua代码

前言 本人一名java后端开发,看到前端同事调试lua代码无脑print,甚为鄙视,百度加实操写一份调试unity的lua脚本文档 操作 1.安装lua lua官网下载页面 最终下载页面 2.idea安装插件 emmylua 3.idea打开unity的lua脚本 idea->file->op…

idea调试maven项目

maven debug 调试 关联maven项目启动调试进行调试 关联maven项目 启动调试 进行调试

宝塔 xdebug idea 调试 php

安装宝塔 安装php xdebug插件 查看是否安装成功 phpinfo 修改php.ini 配置 [XDebug] ;xdebug.profiler_append 0 ;xdebug.profiler_enable 1 ;xdebug.profiler_enable_trigger 0 ;xdebug.profiler_output_dir "D:\BtSoft\temp\xdebug" ;xdebug.trace_output_di…

IDEA调试程序的基本方法

IDEA基本调试步骤 版本 IntelliJ IDEA 2020.1 x64 操作系统 Windows10 64位 步骤 先上一段代码,求解如下问题,因为涉及了循环,判断等,可以用于调试 问题:寻找某两个数相除,其结果 离黄金分割点 0.618最…

IDEA调试模式技巧

记录自己在使用IDEA调试过程中的发现 文章目录 1.debug时在list或map中快速找到目标对象2.条件断点 1.debug时在list或map中快速找到目标对象 debug过程中map中对象很多: 在该map中获取指定对象可以右键该map,选择filter: 输入过滤条件&a…

使用IDEA调试DBeaver

使用IDEA调试DBeaver 工具准备代码准备准备 Eclipse IDE 和 workspace在 Eclipse 中运行和调试在 IDEA 中运行和调试 官方WIKI: Develop-in-IDEA 最近需要对DBeavar进行二次开发,整理一下搭建开发环境的步骤和遇到的一些问题 工具准备 IDEA版本&#…

IDEA调试技巧

Debug技巧 在我们的编程生涯中,调试代码是免不了的,而如何调试代码就显得尤为重要了,其中利用 IDE 自带的调试工具,是我们快速定位问题的重要手段之一。在此,我们就一起来了解一下 IntelliJ IDEA 自带的调试工具&…

Idea 调试自定义 AbstractProcessor 程序

我们常使用的 Lombok 可以自动生成 gettr 和 setter 方法,使用起来非常方便;有时候我们也要去实现自己的注解处理器,实现一些在编译阶段需要执行的逻辑,例如我之前写的 spring cloud 自动生成 openfeign 的Fallback 降级方法;自动生成 openfeign 的Fallback 但是自定义注…

idea调试jdk源码

前言: 最近想看看HashMap的实现过程,本来了解到private notes可以对源码添加注释,但最后没有获取到插件,该问题没有解决,于是就想直接对源码包进行调试以及修改。 一、解压源码包 在jdk的安装路径内找到src.zip复制一…

intellij idea调试之jar包调试

之前写过一篇文章《记一次“java: 程序包org.aspectj.lang不存在”问题解决》。但是有次我碰到用那种方法也解决不了的场景。想来想去只能直接跑jar包来运行程序了。但是还需要用idea来调试程序,这个时候就需要做一些关联配置。通过网上搜索得到方案,整个…