目录
试想在古代,我们怎么依靠信件来传递信息:写信-->传信-->读信,这个是我们表面理解的步骤,如果我们看的深层一点,可以理解为:
(假设写信人想让收信人去将XX屋子的椅子移动一厘米)
写信人将“将XX屋子的椅子移动一厘米”用双方规定好意思的象形字即汉字表示,并记录在纸张载体上——》通过鸽子或者别人骑马把纸张载体送给收信人——》收信人把信中的象形字翻译成“将XX屋子的椅子移动一厘米”,并按照指示将XX屋子的椅子移动一厘米
发送方用一种编码方式对信息进行编码——》通过一种传输介质发送编码信息——》接收方接受编码信息——》 接收方按照这一种编码方式进行解码,得到有效信息
(1)发送字符帧的基本格式:(编码方式)
(a)起始位:起始位固定为0
(b)数据位:你所要发送的八位一字节数据
(c)校验位:初学时可设置为无校验位,则该位忽略不管
(d)停止位:停止位固定为1

(2)发送信息:通常是单片机直接一位一位发送出去,不过为了提高效率等原因,会存放在硬件电路中经过处理后再发送。
(3)传输介质:可以用蓝牙、WiFi、无线电等方式,这里使用的是用数据线和电脑直接连接进行简单测试,其他方式同理。
TXD:发送数据 Transmit(tx) Data 简写形式
RXD:接受数据 Receive(rx) Data 简写形式
GND:共地,以提供参考点电压

(4)接受信息:因为减轻单片机的负担,不需要每时每刻检测对方是否发送信息,通常会用到中断。
有以上分析可以,我们本次实验的步骤:了解51单片机串口硬件电路——》编写程序控制单片机发送信息给硬件电路,硬件电路按照字符帧格式发送信息——》通过USB转TTL模块发送给电脑(有下载功能的开发板都有)———》电脑收到后,我们通过串口调试助手(网上现成的软件)将收到的二进制信息转换成十进制数、字母等或者16进制数

1、接收信息:当软件将允许接收标志位置1后,当RXD逐位收到发送10位字符帧并经过一系列处理后,RI会被硬件置1,将接下来的八位数据位存放入SBUF寄存器中,如果串口中断有开启,那么单片机就会进入中断执行中断服务函数中的内容。
2、发送信息:当单片机执行一段写SBUF命令时,发送硬件电路会将写入的八位数据位转换成完整的十位字符帧,最后由TXD口逐位发送出去。
4、由于我们使用的是异步通信,所以单片机内部也要通过内置的时钟,产生脉冲信号确定接收或发送的频率,而且该频率要与电脑的一致。
5、定时器1为串口通信提供脉冲信号:TH1,TL1确定时钟脉冲频率,具体查定时器的配置;SMOD确定产生的脉冲信号是否需要分频即降低接收的频率
6、接收和发送SBUF共用一个地址码
7、TI=1或RI=1时中断都会发生,但是我们通常只在接收时才使用中断
(1)波特率:串口通信每秒能发送或接收多少位,也就是上面第五点指的频率
(2)为什么要计算波特率:其实就像高铁运输乘客一样,无论是乘客还是司机都要在相同的时间到达才能完成运输,而由于我们使用的是异步通信,没有使用时钟线,我们就要在接收和发送双方都规定好一个特定的频率,防止错过信息
(3)计算方法:由上面的第五点可和由下面的电源控制寄存器PCON可知51单片机串口收发频率由TH1、TL1和SMOD位决定,所以我们要找到TH1,TL1,SMOD与波特率之间的关系:
计算过程较为复杂,初学者可使用该工具
(1)需要配置的寄存器:
(a)串口控制寄存器SCON(可位寻址——即直接操作某一位,如SM0=1)

SM0,SM1:工作方式选择位,具体看手册,这里我们选择方式1,令SM0=0,SM1=1
REN:允许串口接收位,令REN=1;
TI,RI:接收,发送标志位,在接收或者发送会由硬件置1,为了停止中断,要注意软件将TI、RI置0。
SM2,TB8,RB8:我们在这里没有用到
(b)电源控制寄存器PCON(不可位寻址)

- SMOD:波特率选择位,SMOD=1时,波特率加倍
- 其他位没有用到全部置0,令PCON=0x80
(c)中断允许寄存器IE(可位寻址)

- EA:CPU的总中断允许位,令EA=1
- ES:串口中断允许位,令ES=1
(2)STC89C51参考代码:
实现功能:接收电脑发来的信息后,再发送给回给电脑
#include <reg52.h>
#define u8 unsigned char
#define u16 unsigned int
u8 table[]="I get ";
u8 a,flag;
void Tim1_Init();
void Serial_Init();
void Serial_Interrupt_Init();
void delay(u16 time_out)
{
while(time_out--);
}
void main()
{
u8 i;
Tim1_Init();
Serial_Init();
Serial_Interrupt_Init();
while(1)
{
if(flag==1)
{
//发送字符串
for(i=0;i<6;i++)
{
SBUF=table[i];
//等待发送发送完成
while(!TI);
//清除标志位
TI=0;
}
//发送接收到字符
SBUF=a;
while(!TI);
TI=0;
flag=0;
}
delay(1000);
}
}
//定时器初始化,为串口提供时钟脉冲
void Tim1_Init()
{
TMOD=0x20;
//设置SMOD=1,波特率加倍
PCON=0X80;
//波特率为9600 STC89C51 11.052MHZ
TH1=0xfA;
TL1=TH1;
//启动定时器1
TR1=1;
}
//串口初始化
void Serial_Init()
{
//方式1
SM0=0;
SM1=1;
//启动串口接收数据
REN=1;
}
//打开中断
void Serial_Interrupt_Init()
{
//打开串口中断
ES=1;
//打开总中断
EA=1;
}
//中断服务函数,串口中断后会自动跳到这里
void Serial_Interrupt() interrupt 4
{
//清除标志位
RI=0;
//将接收到的数据位记录到a中
a=SBUF;
flag=1;
}
(3) 串口调试助手的使用:
(a)下载:
(b)步骤:选择相应的串口——》选择相应的波特率——》打开串口——》发送信息
——》
——》
——》
说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时
下载微PE工具箱进入官网下载微PE工具箱-下载 安装好后,打开微PE工具箱客户端,选择安装PE到U盘 PE壁纸可选择自己喜欢的壁纸,勾选上包含DOS工具箱,个性化盘符图标 下载原版系统进入网站下载镜像NEXT,ITELLYOU如果没有账号,注册一下就好进入选择开始使用选择win10 这里我们选择消费者版,用迅雷把BT种子下载下来 下面的两个盘符,是PE工具箱安装进U盘后,分成的盘符,注意EFI的盘符,这里面不能删东西,也不能添东西,另一个盘符可以当做正常的U盘空间使用,我们现在需要把下载下来的景象文件复制到正常的U盘空间中去 这个时候我们的系统U盘就只做好了 安装系统我们将U盘插入电脑,开机,
一、什么是MQTT协议MessageQueuingTelemetryTransport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与HTTP一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。原理:(1)MQTT协议身份和消息格式有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分Topic,可以理解为消息的类型,订阅者订阅(Su
TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是
开门见山|拉取镜像dockerpullelasticsearch:7.16.1|配置存放的目录#存放配置文件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/config#存放数据的文件夹mkdir-p/opt/docker/elasticsearch/node-1/data#存放运行日志的文件夹mkdir-p/opt/docker/elasticsearch/node-1/log#存放IK分词插件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/plugins若你使用了moba,直接右键新建即可如上图所示依次类推创建
文章目录概念索引相关操作创建索引更新副本查看索引删除索引索引的打开与关闭收缩索引索引别名查询索引别名文档相关操作新建文档查询文档更新文档删除文档映射相关操作查询文档映射创建静态映射创建索引并添加映射概念es中有三个概念要清楚,分别为索引、映射和文档(不用死记硬背,大概有个印象就可以)索引可理解为MySQL数据库;映射可理解为MySQL的表结构;文档可理解为MySQL表中的每行数据静态映射和动态映射上面已经介绍了,映射可理解为MySQL的表结构,在MySQL中,向表中插入数据是需要先创建表结构的;但在es中不必这样,可以直接插入文档,es可以根据插入的文档(数据),动态的创建映射(表结构),这就
HTTP缓存是指浏览器或者代理服务器将已经请求过的资源保存到本地,以便下次请求时能够直接从缓存中获取资源,从而减少网络请求次数,提高网页的加载速度和用户体验。缓存分为强缓存和协商缓存两种模式。一.强缓存强缓存是指浏览器直接从本地缓存中获取资源,而不需要向web服务器发出网络请求。这是因为浏览器在第一次请求资源时,服务器会在响应头中添加相关缓存的响应头,以表明该资源的缓存策略。常见的强缓存响应头如下所述:Cache-ControlCache-Control响应头是用于控制强制缓存和协商缓存的缓存策略。该响应头中的指令如下:max-age:指定该资源在本地缓存的最长有效时间,以秒为单位。例如:Ca
本人是音乐爱好者,从小就特别喜欢那个随着音乐跳动的方框效果,就是这个:arduino上一大把对,我忍你很久了,我就想用mpy做,全网没有,行我自己研究。果然兴趣是最好的老师,我之前有篇博客专门讲音频,有兴趣的可以回顾一下。提到可视化频谱,必然绕不开fft,大学学过这玩意,当时一心玩,老师讲的一个字都么听进去,网上教程简略扫了一下,大该就是把时域转频域的工具,我大mpy居然没有fft函数,奶奶的,先放着。音频信息如何收集?第一种傻瓜式的ADC,模拟转数字,原始粗暴,第二种,I2S库,我之前博客有讲过,数据是PCM编码。然后又去学PCM编码,一学豁然开朗,舒服,以代码为例:audio_in=I2S
如何用IDEA2022创建并初始化一个SpringBoot项目?目录如何用IDEA2022创建并初始化一个SpringBoot项目?0. 环境说明1. 创建SpringBoot项目 2.编写初始化代码0. 环境说明IDEA2022.3.1JDK1.8SpringBoot1. 创建SpringBoot项目 打开IDEA,选择NewProject创建项目。 填写项目名称、项目构建方式、jdk版本,按需要修改项目文件路径等信息。 选择springboot版本以及需要的包,此处只选择了springweb。 此处需特别注意,若你使用的是jdk1
前言上一篇我们简要讲述了粒子系统是什么,如何添加,以及基本模块的介绍,以及对于曲线和颜色编辑器的讲解。从本篇开始,我们将按照模块结构讲解下去,本篇主要讲粒子系统的主模块,该模块主要是控制粒子的初始状态和全局属性的,以下是关于该模块的介绍,请大家指正。目录前言本系列提要一、粒子系统主模块1.阅读前注意事项2.参考图3.参数讲解DurationLoopingPrewarmStartDelayStartLifetimeStartSpeed3DStartSizeStartSize3DStartRotationStartRotationFlipRotationStartColorGravityModif