目录
简单来说,通信就是传递信息;我把信息发给你,你把信息发给我,这就是通信;但是我如何把信息准确传递给你,方式有很多。
在硬件领域,通信的方式也有很多种,从简单的串口通信,到I2C,SPI,CAN,MIPI等,不同的通信总线,对应的协议也不同;但通信的本质有相同之处;
- 按照数据传送方式可分为串行通信和并行通信;
- 按照通信的数据同步方式,可分为异步通信和同步通信;
- 按照数据的传输方向又可分为单工、半双工和全双工通信
计算机与外界的信息交换称为通信,通信传送的基本方式可分为并行通信和串行通信两种;
并行通信:将数据字节的各位用多条数据线同时进行传送,如系统总线;
- 优点:控制简单,传输速度快;
- 缺点:由于传输线较多,长距离传送时成本高;抗干扰能力差,固接受方的各位同时接收存在困难;
串行通信:将数据字节分成一位一位的形式,在一条传输线上逐位传送
- 优点:传输线少,长距离传送时,成本低;抗干扰能力强,适合长距离传送;
- 缺点:控制复杂,传输速度慢;
同步通信:同步通信是一种连续传送数据的通信方式,一次通信传送多个字符数据,称为一帧信息。
- 特点:数据传输速率较高;其缺点是通信双方必须建立准确的位定时信号,也就是发送时钟和接收时钟保持严格同步;
- 同步字符:传送数据前,传送同步字符进行联络;
- 信息帧:包含同步字符,数据场,校验字符;
- 数据场:多个数据字节之间没有间隙,连续发送;
异步通信:在异步通信中,数据通常是以字符或字节为单位组成数据帧进行传送的。收、发端各有一套彼此独立,互不同步的通信机构,由于收发数据的帧格式相同,因此可以相互识别接收到的数据信息
- 特点:不要求收发双方时钟的严格一致,实现容易,设备开销较小,但每个字符要附加2~3位用于起止位,各帧之间还有间隔,因此传输效率不高。
- 起始位:起始位必须是持续一个比特时间的逻辑0电平,标志传输一个字符的开始,接收方可用起始位使自己的接收时钟与发送方的数据同步;
- 数据位:数据位紧跟在起始位之后,是通信中的真正有效信息;数据位的位数可以由通信双方共同约定;传输数据时先传送字符的低位,后传送字符的高位;
- 校验位:奇偶校验位仅占一位,用于进行奇校验或偶校验,奇偶检验位不是必须有的。如果是奇校验,需要保证传输的数据总共有奇数个逻辑高位;如果是偶校验,需要保证传输的数据总共有偶数个逻辑高位。
- 停止位:停止位可以是是1位、1.5位或2位,可以由软件设定;它一定是逻辑1电平,标志着传输一个字符的结束;
- 空闲位:空闲位是指从一个字符的停止位结束到下一个字符的起始位开始,表示线路处于空闲状态,必须由高电平来填充;
串行通信的传送方式有三种,分别是单工、半双工和全双工。
单工: 数据传输只支持数据在一个方向上传输;
半双工: 允许数据在两个方向上传输,但某一时刻只允许数据在一个方向上传输,实际上是一种切换方向的单工通信,不需要独立的接收端和发送端,两者可合并为一个端口;
全双工: 允许数据同时在两个方向上传输,因此全双工通信是两个单工方式的结合,需要独立的接收端和发送端。
串口通信(Serial Communication),是指外设和计算机间通过数据信号线地线等按位进行传输数据的一种通信方式,属于串行通信方式。串口是一种接口标准,它规定了接口的电气标准,没有规定接口插件电缆以及使用的协议。
51单片机内部自带UART(Universal Asynchronous Receiver Transmitter,通用异步收发器),可实现单片机的串口通信。
简单双向串口通信有两根通信线(发送端TXD和接收端RXD),交叉连接,并且共GND,如图:

电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有如下三种:
- TTL电平:+5V表示1,0V表示0
- RS232电平:-3~-15V表示1,+3~+15V表示0
- RS485电平:两线压差+2~+6V表示1,-2~-6V表示0(差分信号)

此外,还有CAN、USB等;
有两个物理上独立的接收、发送缓冲器SBUF,它们占用同一地址99H ;接收器是双缓冲结构 ;发送缓冲器,因为发送时CPU是主动的,不会产生重叠错误


1.串口控制寄存器SCON
- SM0/SM1:工作方式选择位;
- SM2:多机通讯控制位;方式2/3中使用,控制接收数据;SM2=1,只有当RB8=1才能激活R1,接收数据;
- REN:允许串行接收位;REN=1,启动串行口接收数据;REN=0,禁止接收;
- TB8:在方式2或方式3中,是发送数据的第9位,可以用软件规定其作用;可以用作数据基偶校验位,或在多机通信中,作为地址帧/数据帧的标志位;
- RB8:在方式2或方式3中,是发送数据的第9位,可以用软件规定其作用;可以用作数据基偶校验位;在方式1时,若SM2=0,则RB8是接收到的停止位;
- TI:发送中断标志位;在方式0时,当串行发送第8位数据结束时,或在其他方式,串行发送停止位的开始时,由内部硬件使TI置1,向CPU发送中断申请;在中断服务程序中,必须用软件将其清0,取消此中断申请
- RI:接收专断标志位;在方式0时,当串行发送第8位数据结束时,或在其他方式,串行接收停止位的中间时,由内部硬件使RI置1,向CPU发送中断申请;在中断服务程序中,必须用软件将其清0,取消此中断申请;
2.电源控制寄存器PCON
只有一位SMOD和串口工作相关,其他位是电源控制相关;那为什么和串口相关的控制位,会放到PCON去呢,原因是串口控制位超过了8位,刚好电源的控制位用不到8位,所以...
- SMOD:波特率倍增位;在串口方式1/2/3时,波特率与SMOD有关,当SMOD=1,波特率加倍;复位时,SMOD=0;
模式1:模式1是10位数据的异步通信口,其中1位起始位,8位数据位,1位停止位,TXD和RXD分别为数据的发送和接收引脚;其传输波特率是可变的,对于51单片机,波特率由定时器1的溢出率决定;通常我们在做单片机与单片机串口通信,单片机与计算机串口通信,计算机与计算机串口通信时,基本都选择模式1,其传输一帧的数据格式如下:
模式1传输一帧的数据共10位,1位起始位(0),8位数据位,最低位在前,最高位在后,1位停止位(1),帧与帧之间可以有空闲,也可以无空闲,模式1数据输出和输入时序图如下:
波特率:模式1的波特率是可变的,波特率=2^SMOD/32*溢出率;
- 当单片机工作在12T模式时,定时器1的溢出率=SYSclk/12/(256-TH1)
- 当单片机工作在6T模式时,定时器1的溢出率=SYSclk/6/(256-TH1)
溢出率:单位时间(秒)内定时器/计数器1回0溢出的次数,即定时器/计数器1的溢出率=定时器/计数器1的溢出次数/秒
在具体操作串行口之前,需要对单片机的一些与串口有关的特殊功能寄存器进行初始化设置,主要是设置产生波特率的定时器1,串行口控制,和中断控制,具体步骤如下:
- 配置TMOD寄存器:确定定时器的工作模式(T2);
- 配置TCON寄存器:定时器的控制开关;
- 计数器初值配置:装载TH1,TL1;
- 配置SCON寄存器:确定串行口工作模式;
- 中断配置:串行口在中断方式时,要进行中断设置(配置IE,I);
//*串口初始化 void UART_Init() { //*TMOD配置:设置定时器模式, TMOD&=0x0F; TMOD|=0x20; //*TCON配置 TR1=1; //打开定时器 //*计数器配置 TH1=0xF3; //设置定时器初始值 1111 0011 TL1=0xF3; //设置定时器重装值 1111 0011 /******************************************** 波特率计算: 1.二进制的OxF3=十进制的243; 2.每隔256溢出一次,256-243=13(每计13个数就溢出1次) 3.12MHz的晶振,每1us计一次数,以上计13个数就会溢出,也就需要13us 4.溢出率=1/13us=0.07692MHz 5.波特率=溢出率/16=0.00480769MHz=4807Hz 6.波特率加倍=波特率*2=9614Hz **********************************************/ //*SCON配置 波特率9600hz SCON=0x50; //设置串口工作模式1,SCON=0101 0000 PCON=0x80; //设置波特率,SMOD=1,波特率加倍;PCON=1000 0000 //*中断配置 ES=1; //打开串行口中断 EA=1; //打开总中断 }
功能需求:串口向电脑发送递增的16进制数据(单片机每隔一段时间通过串口向电脑发送数据)
程序设计:首先,将串口有关的特殊功能寄存器进行初始化设置(初始化);其次,定义串口需要发送的字节(子函数);最后,通过主函数实现想要的效果
#include <REGX51.H>
#include "Delay.h"
unsigned char Sec;//全局变量
//*串口初始化函数
/********************************************
因定时器1在工作模式2时,为8位自动重装方式,我们进中断后无事可做,
因此,无需打开定时器1的中断,更无需写定时器1的中断服务程序
**********************************************/
void UART_Init()
{
TMOD&=0x0F;
TMOD|=0x20;
TR1=1;
TH1=0xF3;
TL1=0xF3;
ET1=0;
SCON=0x40;
PCON|=0x80;
}
//*子函数
void UART_SendByte(unsigned char Byte)
{
SBUF=Byte; //把Byte的值赋给缓存SBUF
while(TI==0); //确认发送控制器TI标志位的状态,只有当TI不等于0时,才会跳出循环
TI=0; //清除发送完成标志位
}
//*主函数
void main()
{
UART_Init();
while(1)
{
UART_SendByte(Sec);
Sec++;
Delay(1000);//延时1s
}
}
功能需求:电脑向单片机发送数据,同时控制LED灯亮灭
程序设计:首先,将串口有关的特殊功能寄存器进行初始化设置(初始化);其次,定义串口需要发送的数据(子函数);最后,通过主函数和中断服务程序,实现想要功能
#include <REGX51.H>
//*串口初始化函数
void UART_Init()
{
TMOD&=0x0F;
TMOD|=0x20;
TR1=1;
TH1=0xF3;
TL1=0xF3;
ET1=0;
SCON=0x50;
PCON|=0x80;
ES=1;
EA=1;
}
//*子函数
void UART_SendByte(unsigned char Byte)
{
SBUF=Byte; //把Byte的值赋给缓存SBUF
while(TI==0); //确认发送控制器TI标志位的状态,只有当TI不等于0时,才会跳出循环
TI=0; //清除发送完成标志位
}
//*主函数
void main()
{
UART_Init();
while(1)
{
}
}
//*中断函数
void UART_Routine() interrupt 4
{
if(RI==1) //接收中断
{
P2=~SBUF;//将P2口赋值为~SBUF,控制LED亮灭
UART_SendByte(SBUF);//单片机接收电脑发送的数据
RI=0; //清除接收完成标志位
}
} 我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,
说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时
MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO
功能需求:主机使用一个串口,与两个从机进行双向通信,主机向从机发送数据,从机能够返回数据,由于结构限制,主机与从机之间只有3根线(电源、地、数据线),并且从机上没有设物理的电源开关,需要通过与主机连接的数据线来控制开机,总结如下:1、数据线只有1根2、能够双向通信3、主机能够控制从机开机4、主机可以单独向1个从机发数据,也可以同时向两个从机发送数据根据需求,设计出如下电路:工作原理分析:VCC_24V_IN、GND、LINE_L(LINE_R)三根线接线连接到从机,电源开启电路是从机内部的电源控制。开机的逻辑:*主机先上电,LINE_L因为主机的R1上拉而有高电平,使Q6导通,Q5的G极电压被
本人是音乐爱好者,从小就特别喜欢那个随着音乐跳动的方框效果,就是这个:arduino上一大把对,我忍你很久了,我就想用mpy做,全网没有,行我自己研究。果然兴趣是最好的老师,我之前有篇博客专门讲音频,有兴趣的可以回顾一下。提到可视化频谱,必然绕不开fft,大学学过这玩意,当时一心玩,老师讲的一个字都么听进去,网上教程简略扫了一下,大该就是把时域转频域的工具,我大mpy居然没有fft函数,奶奶的,先放着。音频信息如何收集?第一种傻瓜式的ADC,模拟转数字,原始粗暴,第二种,I2S库,我之前博客有讲过,数据是PCM编码。然后又去学PCM编码,一学豁然开朗,舒服,以代码为例:audio_in=I2S
我有一个RaspberryPiTFT7"触摸屏显示器,我想创建一个简单的应用程序来显示和输出系统数据(即CPU使用率、温度等)。我注意到目前常见的实现方法是使用pygame库输出到显示器连接到的帧缓冲区/dev/fb1。我想执行相同的操作,但使用Ruby,因为我更熟悉这门语言。有人可以为我指明正确的方向,让我知道如何开始吗?我查看了rubygame和gosu库,它们似乎能够做我想做的事情,即绘制屏幕,但我找不到任何关于如何将输出定向到的信息帧缓冲区本身。 最佳答案 rubycorelib有一个IO您应该能够使用该类将输出定向
目录SPI总线SPI总线概述 SPI总线分类SPI优点及缺点SPI接口硬件原理SPI四种工作模式 74HC595应用74HC595芯片概述74HC595封装及管脚功能74HC595工作原理 编辑 74HC595串行转并行点亮LED灯 程序实现 Proteus运行结构示意图SPI总线SPI总线概述 SPI(SerialPeripheralinterface):串行外围设备接口 用途:用来在微控制器与外围设备芯片之间实现数据交换 特点:高速、全双工、同步 SPI总线分类四线制全双工SPI(同时收发)MISO 主机输入/从机输出MOSI 主机输出/从机输入SCLK 串行时钟CS或
文章目录1简介2绪论2.1课题背景与目的3系统设计详细设计描述3.2硬件部分温度测量电路其他电路部分3.3软件部分主程序子系统程序温湿度程序流程键盘显示子程序3.4实现效果3.5部分相关代码4最后1简介Hi,大家好,这里是丹成学长,今天向大家介绍一个单片机项目基于单片机的智能温控农业大棚系统大家可用于课程设计或毕业设计单片机-嵌入式毕设选题大全及项目分享:https://blog.csdn.net/m0_71572576/article/details/1254090522绪论2.1课题背景与目的近年来我国的温室控制取得了长足的进步,首先在温室群控制方面,进行了初步的探索和理论研究,其次在温室
一、概述在之前的一篇博文中,记录了AT24C01、AT24C02芯片的读写驱动,先将之前的相关文章include一下:1.IIC驱动:4位数码管显示模块TM1637芯片C语言驱动程序2.AT24C01/AT24C02读写:AT24C01/AT24C02系列EEPROM芯片单片机读写驱动程序本文记录分享AT24C04、AT24C08、AT24C16芯片的单片机C语言读写驱动程序。二、芯片对比介绍型号容量bit容量byte页数字节/页器件寻址位可寻址器件数WordAddress位数/字节数备注AT24C044k5123216A2A149/1WordAddress使用P0位AT24C088k1024