9.串口通信

串口基本认识

串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方
式的扩展接口。串行接口(Serial Interface)是指数据一位一位地顺序传送。其特点是通信线路简
单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成
本,特别适用于远距离通信,但传送速度较慢

串口接线方式

  1. RXD:数据输入引脚,数据接受;STC89系列对应P3.0口。
    TXD:数据发送引脚,数据发送;STC89系列对应P3.1口。

接线方式

在这里插入图片描述

串口编程要素

输入/输出数据缓冲器都叫做SBUF, 都用99H地址码,但是是两个独立的8位寄存器
代码体现为: 想要接收数据 char data = SBUF 想要发送数据 SBUF = data

在这里插入图片描述

回忆UART是异步串行接口,通信双方使用时钟不同,因为双方硬件配置不同,但是需要约定通信
速度,叫做波特率
对于电脑来说,别人做好了软件,鼠标点点点就能配置好,而苦逼单片机的波特率配置需要我们写
代码
点点点配置什么,我们代码也要配置对应参数。

51发送字符到PC

SCON

在这里插入图片描述

在这里插入图片描述

选择SM0和SM1为01,工作模式为方式一,

REN = 0,禁止接收
REN = 1,允许接收

SCON = 0100 0000; //禁止接收
SCON = 0101 0000; //允许接收

PCON

PCON &= 0x7F;//0111 1111 按位与将SMOD设置为0。

AUXR

在这里插入图片描述

TMOD

目标:0010 xxxx

TMOD &= 0x0F; //先将高位清零,低位不变
TMOD |= 0x20; //0010 xxxx

TH1

在这里插入图片描述

TH1 = 0xFD; //smod = 0 9600 = (2^smod) / 32 x 11059200 / 12/(256 - THL)
TL1 = 0xFD; // THL = 253 = FD(HEX)

代码实现

#include "reg52.h"
#include "intrins.h"sfr AUXR = 0x8E;void Delay250ms()		//@11.0592MHz
{unsigned char i, j, k;_nop_();i = 2;j = 193;k = 57;do{do{while (--k);} while (--j);} while (--i);
}void UartInit(void)		//9600bps@11.0592MHz
{PCON &= 0x7F;		SCON  = 0x50;		AUXR &= 0xBF;		AUXR &= 0xFE;		TMOD &= 0x0F;		TMOD |= 0x20;		TL1 = 0xFD;		TH1 = 0xFD;		ET1 = 0;		TR1 = 1;		
}void my_UartInit()
{SCON = 0x40;//选择SM0和SM1为01,工作模式为方式一,SCON = 0100 0000;PCON &= 0x7F;//0111 1111  按位与将SMOD设置为0AUXR |= 0x01;//0000 0001TMOD &= 0x0F;//目标:0010 xxxx   //先将高位清零,低位不变TMOD |= 0x20;//0010 xxxxTH1 = 0xFD;	//smod = 0	9600 = (2^smod) / 32 x 11059200 / 12 /(256 - THL)TL1 = 0xFD;	//THL = 253 = FD(HEX)ET1 = 0;//禁止定时器1中断TR1 = 1;//启动定时器1
}void main()
{char msg_data = 's';my_UartInit();	while(1){Delay250ms();SBUF = msg_data;}
}

51发字符串给PC

#include "reg52.h"
#include "intrins.h"sfr AUXR = 0x8E;void Delay250ms()		//@11.0592MHz
{unsigned char i, j, k;_nop_();i = 2;j = 193;k = 57;do{do{while (--k);} while (--j);} while (--i);
}void UartInit(void)		//9600bps@11.0592MHz
{PCON &= 0x7F;		SCON  = 0x50;		AUXR &= 0xBF;		AUXR &= 0xFE;		TMOD &= 0x0F;		TMOD |= 0x20;		TL1 = 0xFD;		TH1 = 0xFD;		ET1 = 0;		TR1 = 1;		
}void my_UartInit()
{SCON = 0x40;//选择SM0和SM1为01,工作模式为方式一,SCON = 0100 0000;PCON &= 0x7F;//0111 1111  按位与将SMOD设置为0AUXR |= 0x01;//0000 0001TMOD &= 0x0F;//目标:0010 xxxx   //先将高位清零,低位不变TMOD |= 0x20;//0010 xxxxTH1 = 0xFD;	//smod = 0	9600 = (2^smod) / 32 x 11059200 / 12 /(256 - THL)TL1 = 0xFD;	//THL = 253 = FD(HEX)ET1 = 0;//禁止定时器1中断TR1 = 1;//启动定时器1
}void sendByte(char msg_data)
{SBUF = msg_data;while(TI == 0);//结束TI=1,TI==0为假TI = 0;
}void sendString(char *str)
{while(*str != '\0'){sendByte(*str);str++;}
}void main()
{my_UartInit();while(1){Delay250ms();sendString("hello world!\r\n");}
}

51接收PC发送的字符,达到点灯关灯的目的

#include "reg52.h"
#include "intrins.h"sbit led1 = P3^7;sfr AUXR = 0x8E;char cmd; void Delay250ms()		//@11.0592MHz
{unsigned char i, j, k;_nop_();i = 2;j = 193;k = 57;do{do{while (--k);} while (--j);} while (--i);
}void UartInit(void)		//9600bps@11.0592MHz
{PCON &= 0x7F;SCON  = 0x50;AUXR &= 0xBF;AUXR &= 0xFE;TMOD &= 0x0F;TMOD |= 0x20;TL1 = 0xFD;TH1 = 0xFD;ET1 = 0;TR1 = 1;
}void my_UartInit()
{SCON = 0x50;//选择SM0和SM1为01,工作模式为方式一,SCON = 0101 0000; 允许接收PCON &= 0x7F;//0111 1111  按位与将SMOD设置为0AUXR |= 0x01;//0000 0001TMOD &= 0x0F;//目标:0010 xxxx   //先将高位清零,低位不变TMOD |= 0x20;//0010 xxxxTH1 = 0xFD;	//smod = 0	9600 = (2^smod) / 32 x 11059200 / 12 /(256 - THL)TL1 = 0xFD;	//THL = 253 = FD(HEX)ET1 = 0;//禁止定时器1中断TR1 = 1;//启动定时器1
}void sendByte(char msg_data)
{SBUF = msg_data;while(TI == 0);//结束时TI=1,TI == 0 为假TI = 0;
}void sendString(char *str)
{while(*str != '\0'){sendByte(*str);str++;}
}void main()
{my_UartInit();led1 = 1;while(1){Delay250ms();sendString("hello world!\r\n");}
}void UartHandler() interrupt 4
{if(RI){RI = 0;cmd = SBUF;if(cmd == 'o'){led1 = 0;}if(cmd == 'c'){led1 = 1;}}if(TI){}
}

51接收PC发送的字符串,达到点灯关灯的目的

#include "reg52.h"
#include "intrins.h"
#include "string.h"sbit led1 = P3^7;sfr AUXR = 0x8E;char cmd[12] = {'\0'};void Delay250ms()		//@11.0592MHz
{unsigned char i, j, k;_nop_();i = 2;j = 193;k = 57;do{do{while (--k);} while (--j);} while (--i);
}void UartInit(void)		//9600bps@11.0592MHz
{PCON &= 0x7F;SCON  = 0x50;AUXR &= 0xBF;AUXR &= 0xFE;TMOD &= 0x0F;TMOD |= 0x20;TL1 = 0xFD;TH1 = 0xFD;ET1 = 0;TR1 = 1;
}void my_UartInit()
{SCON = 0x50;//选择SM0和SM1为01,工作模式为方式一,SCON = 0101 0000; 允许接收PCON &= 0x7F;//0111 1111  按位与将SMOD设置为0AUXR |= 0x01;//0000 0001TMOD &= 0x0F;//目标:0010 xxxx   //先将高位清零,低位不变TMOD |= 0x20;//0010 xxxxTH1 = 0xFD;	//smod = 0	9600 = (2^smod) / 32 x 11059200 / 12 /(256 - THL)TL1 = 0xFD;	//THL = 253 = FD(HEX)ET1 = 0;//禁止定时器1中断TR1 = 1;//启动定时器1
}void sendByte(char msg_data)
{SBUF = msg_data;while(TI == 0);//结束TI=1,TI==0为假TI = 0;
}void sendString(char *str)
{while(*str != '\0'){sendByte(*str);str++;}
}void main()
{my_UartInit();led1 = 1;while(1){Delay250ms();sendString("hello world!\r\n");}
}void UartHandler() interrupt 4
{static int i = 0;//静态变量 只被初始化一次if(RI)//中断处理函数中,对于接收中断的响应{	RI = 0;//清除接收中断标志位cmd[i] = SBUF;i++;if(strstr(cmd,"open")){led1 = 0;i = 0;memset(cmd,'\0',12);}if(strstr(cmd,"close")){led1 = 1;i = 0;memset(cmd,'\0',12);}}if(TI){}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/286466.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【网络爬虫】(2) requests模块,案例:网络图片爬取,附Python代码

1. 基本原理 1.1 requests 模块 requests 是 Python 中一个非常流行的 HTTP 客户端库,用于发送所有的 HTTP 请求类型。它基于 urllib,但比 urllib 更易用。 中文文档地址:Requests: 让 HTTP 服务人类 — Requests 2.18.1 文档 &#xff0…

cookie、localStorage、sessionStorage 详解

目录 cookie 是什么? cookie 不可以跨域请求 cookie 的属性 会话cookie & 永久性cookie cookie 禁用 cookie 的应用 sessionStorage 是什么? 失效时间 存储内容的类型 存储的大小 存储的位置 sessionStorage 的应用 localStorage 是什么…

GTC 2024 火线评论:DPU 重构文件存储访问

编者按:英伟达2024 GTC 大会上周在美国加州召开,星辰天合 CTO 王豪迈在大会现场参与了 GPU 与存储相关的最新技术讨论,继上一篇《GTC 2024 火线评论:GPU 的高效存储利用》之后,这是他发回的第二篇评论文章。 上一篇文章…

【ZZULI数据结构实验一】多项式的三则运算

【ZZULI数据结构实验一】多项式的四则运算 ♋ 结构设计♋ 方法声明♋ 方法实现🐇 定义一个多项式类型并初始化---CreateDataList🐇 增加节点---Getnewnode🐇 打印多项式类型的数据-- PrintPoly🐇 单链表的尾插--Listpush_back&…

Java多线程实战-从零手搓一个简易线程池(一)定义任务等待队列

🏷️个人主页:牵着猫散步的鼠鼠 🏷️系列专栏:Java全栈-专栏 🏷️本系列源码仓库:多线程并发编程学习的多个代码片段(github) 🏷️个人学习笔记,若有缺误,欢迎评论区指正…

【C语言】结构体

个人主页点这里~ 结构体 一、结构体类型的声明1、结构的声明2、结构体变量的创建和初始化3、声明时的特殊情况4、自引用 二、结构体内存对齐1、对齐规则2、存在内存对齐的原因3、修改默认对齐数 三、结构体传参四、结构体实现位段 一、结构体类型的声明 我们在指针终篇中提到过…

从零自制docker-5-【USER Namespace NETWORK Namespace】

文章目录 USER Namespace代码NETWORK Namespace代码块 USER Namespace 即进程运行在一个新的namespace中,且该namespace中的User ID和Group IDA在该namespace内外可以不同,可以实现在namspace的用户是root但是对应到宿主机并不是root Cloneflags增加一…

3款免费甘特图制作工具的比较和选择指南

GanntProject GanttProject https://www.ganttproject.biz/ 是一款项目管理和调度应用,适用于 Windows、macOS 和 Linux。它易于使用,无需任何设置,适用于个人用户和小型团队。该应用提供任务层次结构和依存关系、里程碑、基准行、Gantt 图表…

AI论文速读 | 具有时间动态的路网语义增强表示学习

论文标题: Semantic-Enhanced Representation Learning for Road Networks with Temporal Dynamics 作者: Yile Chen(陈亦乐) ; Xiucheng Li(李修成); Gao Cong(丛高) ; Zhifeng Ba…

卓健易控zj-v8.0设备智能控费系统

卓健易控zj-v8.0设备智能控费系统 详细可联系:19138173009 在现今医疗技术日新月异、突飞猛进的时代,我院服务患者的实力与日俱增。随着先进辅助检查设备的不断完善和引进,医生们如同得到了得力助手,能够为患者做出更加精确的诊断…

TCP重传机制详解——04FACK

文章目录 TCP重传机制详解——04FACK什么是FACKFACK的发展为什么要引入FACK实战抓包讲解开启FACK场景,且达到dup ACK门限值开启FACK场景,未达到dup ACK门限值 为什么要淘汰FACK总结REF TCP重传机制详解——04FACK 什么是FACK FACK的全称是forward ackn…

JVM(二)——垃圾回收

三、垃圾回收 1、如何判断对象可以回收 1)引用计数法 定义: 在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是…

Java面试篇:Redis使用场景问题(缓存穿透,缓存击穿,缓存雪崩,双写一致性,Redis持久化,数据过期策略,数据淘汰策略)

目录 1.缓存穿透解决方案一:缓存空数据解决方案二:布隆过滤器 2.缓存击穿解决方案一:互斥锁解决方案二:设置当前key逻辑过期 3.缓存雪崩1.给不同的Key的TTL添加随机值2.利用Redis集群提高服务的可用性3.给缓存业务添加降级限流策略4.给业务添加多级缓存 4.双写一致性…

MySQL substr函数使用详解

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

景联文科技上新高质量大模型训练数据!

在过去的一年中,人工智能领域呈现出了风起云涌的态势,其中模型架构、训练数据、多模态技术、超长上下文处理以及智能体发展等方面均取得了突飞猛进的发展。 在3月24日举办的2024全球开发者先锋大会的大模型前沿论坛上,上海人工智能实验室的领…

c语言--内存函数的使用(memcpy、memcmp、memset、memmove)

目录 一、memcpy()1.1声明1.2参数1.3返回值1.4memcpy的使用1.5memcpy模拟使用1.6注意 二、memmove()2.1声明2.2参数2.3返回值2.4使用2.5memmove()模拟实现 三、memset3.1声明3.2参数3.3返回值3.4使用 四、memcmp()4.1声明4.2参数4.3返回值4.4使用 五、注…

MySQL-extra常见的额外信息

本文为大家介绍MySQL查看执行计划时,extra常见的额外信息 Using index 表示使用了覆盖索引,即通过索引树可以直接获取数据,不需要回表。 表结构: CREATE TABLE t1 (id int(11) NOT NULL AUTO_INCREMENT,name varchar(255) DEFAULT NULL,ag…

IP SSL证书注册流程

使用IP地址申请SSL证书,需要用公网IP地址申请,申请之前确保直接的IP地址可以开放80或者443端口两者选择1个就好,端口不需要一直开放,只要认证的几分钟内开放就可以了,然后IP地址根目录可以上传txt文件。 IP SSL证书认…

vue3+vite - 报错 import.meta.glob() can only accept string literals.(详细解决方案)

报错说明 在vue3+vite项目中,解决报错: [plugin:vite:import-analysis] import.meta.glob() can only accept string literals. 如果我们报错差不多,就可以完美搞定这个错误。 解决教程 这个错误,是因为

【STM32嵌入式系统设计与开发】——9Timer(定时器中断实验)

这里写目录标题 一、任务描述二、任务实施1、ActiveBeep工程文件夹创建2、函数编辑(1)主函数编辑(2)USART1初始化函数(usart1_init())(3)USART数据发送函数( USART1_Send_Data(&…