51单片机串口使用

news2024/10/6 4:01:17

文章目录

  • 前言
  • 一、串口概念
  • 二、中断中的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;	//设置计数器工作方式2
	SCON=0X50;	//设置为工作方式1
	PCON=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://www.coloradmin.cn/o/363347.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

单片机输入输出模式

单片机输入输出模式输入模式模拟输入、浮空输入、上拉输入、下拉输入GPIO输出模式推挽输出、开漏输出、复用推挽输出、复用开漏输出。上下拉电阻上拉电阻下拉电阻输入模式 模拟输入、浮空输入、上拉输入、下拉输入 模拟输入:I/O端口的模拟信号(电压信号…

Python入门自学进阶-Web框架——32、上课、作业流程开发

对学员上课、作业进行管理。首先对几个表,即model用途进行阐述:课程表存放要开什么课,有了课程表,就要有班级,如开了Python入门课程,再根据学员人数,组成班级,如Python入门课程一班、…

报考浙大MBA项目的基本常识信息

一、项目简介 以培养具有国际视野、创新创业精神、卓越领导能力和高度社会责任感的中高级管理人才和创业型人才为己任。通过对引领时代发展的经典管理思想和前沿管理理念的传授,以及对推动行业健康发展的企业管理实践的研讨,来培养和提升学员的职业意…

一个测试工程师的7年感悟 ---- 致在一路独行的你(别放弃)

前言 不知不觉在软件测试行业,摸爬滚打了7年之久。这一路上也留下了许许多多令我难以忘记的故事。有刚入行时的迷茫,有学习技术路上踩过的坑,有做项目连夜敲代码的悲情也有迎来项目成功上线的欢愉,有太多太多值得铭记的瞬间&…

JUC-day02

JUC-day02 集合的线程安全callable和futureJUC三个工具类(练习)读写锁: 共享锁 独占锁(练习)AQS: 实现原理(核心方法)CAS: 原理–>可见性关键字 1 集合的线程安全(重点) 1.1 集合操作Demo NotSafeDemo public static void main(String[] args) {List list new ArrayLis…

Java集合(二)---Map

1.什么是Hash算法哈希算法是指把任意长度的二进制映射为固定长度的较小的二进制值,这个较小的二进制值叫做哈希值static final int hash(Object key) {int h;return (key null) ? 0 : (h key.hashCode()) ^ (h >>> 16);}以上是HashMap中的hash算法代码2…

三天吃透Spring面试八股文(最新整理)

本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~ Github地址:https://github.com/…

【音视频处理】为什么MP3不是无损音乐?音频参数详解,码率、采样率、音频帧、位深度、声道、编码格式的关系

大家好,欢迎来到停止重构的频道。上期我们讨论了视频的相关概念,本期我们讨论音频的相关概念。包括采样率、码率、单双声道、音频帧、编码格式等概念。这里先抛出一个关于无损音频的问题。为什么48KHz采样率的.mp3不是无损音乐 ,而48KHz采样率…

95后刚毕业2、3年就年薪50W,才发现,打败我们的不是年龄····

一刷朋友圈,一读公众号,一打开微博,甚至是一和朋友聊天,这些让人焦虑的话题总会铺天盖地的袭来: Ta刚毕业半年,就升职加薪当上了测试主管 (同样是一天24小时,为什么同龄人正在抛弃…

【Linux】编辑器——vim(最小集+指令集+自动化配置)

目录 1.vim最小集 1.1 vim的三种模式 1.2 vim的基本操作 2.vim指令集 2.1 命令模式指令集 移动光标 删除文字 复制 替换 撤销上一次操作 更改 跳至指定的行 2.2 底行模式指令集 列出行号 跳到文件中的某一行 查找字符 保存文件 多文件操作 3.如何配置vim 配…

网络编程之TCP 的介绍

TCP 的介绍学习目标能够说出TCP 的特点1. 网络应用程序之间的通信流程之前我们学习了 IP 地址和端口号,通过 IP 地址能够找到对应的设备,然后再通过端口号找到对应的端口,再通过端口把数据传输给应用程序,这里要注意,数…

科技 “新贵”ChatGPT 缘何 “昙花一现” ,仅低代码风靡至今

恍惚之间,ChatGPT红遍全网,元宇宙沉入深海…… 在科技圈,见证了太多“昙花一现”,“新贵” ChatGPT 的爆火几乎复制了元宇宙的路径,它会步元宇宙的后尘,成为下一个沉入深海的工具吗? 不可否认的…

小程序开发注意点

1.组件样式隔离注意点 2.methods方法 3.自定义组件的properties参数 4.自定义组件的事件监听 5.纯数据字段 6.插槽 单个插槽 启用多插槽 使用多个插槽 7.属性绑定实现父传子功能 例如在这里有一个组件为<one></one>&#xff0c;那么可以在组件当中传入参数 &l…

iOS上架及证书最新创建流程

目前使用uniapp框架开发app&#xff0c;大大节省了我们兼容多端应用的工作量和人手&#xff0c;所以目前非常缺乏ios上架和证书创建流程流程的文档假如你没有任何的打包或上架经验&#xff0c;参考本文有很大的收益。通常申请ios证书和上架ipa应用&#xff0c;是需要MAC电脑的&…

干货复试详细教程——从联系导师→自我介绍的复试教程

文章目录联系导师联系之前的准备联系导师注意自我介绍教育技术领域通用的复试准备其他补充联系导师 确定出分和自己能进复试以后联系。 分两类 科研技能型 低调&#xff0c;如实介绍&#xff0c;不吹不水。就算你很牛啥都会手握核心期刊论文也不太狂 学霸高分型 不要自卑&…

审计syslog设备活动

从交换机到路由器&#xff0c;几乎所有网络设备都会生成syslog。因为您的网络中有大量生成syslog的设备&#xff0c;所以审计过程&#xff08;包括跟踪、监控和分析所有syslog&#xff09;需要花费大量时间和精力。但是&#xff0c;无论这些任务需要多少精力去完成&#xff0c;…

Java:Java与Python — 编码大战

Java和Python是目前市场上最热门的两种编程语言&#xff0c;因为它们具有通用性、高效性和自动化能力。两种语言都有各自的优点和缺点&#xff0c;但主要区别在于Java 是静态类型的&#xff0c;Python是动态类型的。它们有相似之处&#xff0c;因为它们都采用了“一切都是对象”…

3、Maven安装

前言&#xff1a;工具下载地址阿里云盘&#xff1a;Maven&#xff1a;https://www.aliyundrive.com/s/SgHKjQ5doSp提取码: ml40一、什么是maven?Apache Maven是个项目管理和自动构建工具&#xff0c;基于项目对象模型&#xff08;POM&#xff09;的概念。作用&#xff1a;完成…

小白都能看懂的C语言入门教程

文章目录C语言入门教程1. 第一个C语言程序HelloWorld2. C语言的数据类型3. 常量变量的使用4. 自定义标识符#define5. 枚举的使用6. 字符串和转义字符7. 判断和循环8. 函数9. 数组的使用10. 操作符的使用11. 结构体12. 指针的简单使用C语言入门教程 1. 第一个C语言程序HelloWor…

Could not find resource jdbc.properties问题的解决

以如下开头的内容&#xff1a; Exception in thread "main" org.apache.ibatis.exceptions.PersistenceException: ### Error building SqlSession. ### The error may exist in SQL Mapper Configuration 出现以上问题是没有在src/main/resources下创建jdbc.prop…