当前位置: 首页 > ai >正文

嵌入式第四十六天(51单片机(通信))

一.串行通信与并行通信
1. 
- 串行通信:数据一位一位地依次传输,只需要一条或很少的几条传输线,适合长距离传输,但传输速度相对较慢。例如,计算机的串口(COM口)通信就是串行通信。

2.
- 并行通信:数据的各位同时传输,需要多条传输线(一般为8的倍数,如8位、16位、32位等),传输速度快,但传输线多,成本高,适合短距离高速传输。例如,计算机内部的总线(如PCI总线)、打印机的并行口通信都属于并行通信。

3.

常见传行通信协议

  • UART:异步全双工,使用TX(发送)和RX(接收)两条线,常见于单片机与PC通信。
  • SPI:同步全双工,主从设备通过SCLK(时钟)、MOSI(主发从收)、MISO(主收从发)和SS(片选)交互。
  • I2C:同步半双工,利用SDA(数据线)和SCL(时钟线)支持多设备总线连接。
  • 串行与并行通信的对比

    对比项串行通信并行通信
    传输方式逐位传输多位同时传输
    线路复杂度低(线少)高(线多)
    抗干扰能力强(适合长距离)弱(短距离)
    典型协议UART、SPI、I2C并行总线(如LPT)

    通过合理选择协议和配置参数(如波特率、数据位),串行通信可灵活适配不同场景需求。

二.单工、半双工、全双工通信
1. 
- 单工通信:数据只能沿一个固定方向传输,发送方只能发送,接收方只能接收。例如,广播电台的广播就是单工通信,电台只能发送信号,收音机只能接收信号。

2.
- 半双工通信:数据可以双向传输,但同一时间只能沿一个方向传输,不能同时双向传输。例如,对讲机通信就是半双工通信,一方说话时,另一方只能听,等一方说完,另一方才能说。

3.
- 全双工通信:数据可以同时双向传输,发送方和接收方可以同时发送和接收数据。例如,电话通信就是全双工通信,双方可以同时说话和听对方说话。


三.串口通信及通信时序

1.
- 串口通信:即串行接口通信,是指采用串行通信方式进行数据传输的通信方式,通过串行端口(如RS - 232、RS - 485等接口)来实现设备间的数据交互。

2.
- 串口通信时序(以异步串口为例):通常包括起始位、数据位、校验位(可选)、停止位。通信开始时,先发送一个起始位(低电平),表示数据传输的开始;接着发送数据位(一般为5 - 8位),数据位是要传输的实际数据;然后可选择发送校验位(用于校验数据传输是否正确);最后发送停止位(高电平,一般为1位、1.5位或2位),表示数据传输的结束。


四. 串口通信速率相关


- 串口通信的速率由波特率决定,波特率是指单位时间内传输的码元个数。


- 常见的波特率有300、600、1200、2400、4800、9600、19200、38400、57600、115200等。


五. 同步通信与异步通信

1.
- 同步通信:发送方和接收方使用同一时钟信号来同步数据的传输,在传输数据时,会先发送同步字符或同步信号,使双方的时钟保持同步,然后再传输数据块。

2.
- 异步通信:发送方和接收方不使用同一时钟信号,而是通过在数据中加入起始位、停止位等方式来实现数据的同步传输,每次传输一个字符(或字节)的数据。
- 串口通信属于异步通信。


六. TTL、RS - 232、RS - 485

1.
- TTL(Transistor - Transistor Logic):是一种晶体管 - 晶体管逻辑电平标准,高电平通常为+5V(或+3.3V等),低电平为0V。主要用于数字电路内部的逻辑电平表示,传输距离较短,一般在几米以内。

2.
- RS - 232:是一种串行通信接口标准,规定了通信的电气特性、机械特性等。采用负逻辑,逻辑“1”为- 3V~- 15V,逻辑“0”为+3V~+15V。适合短距离(约15米以内)的串行通信,在计算机串口通信等领域曾广泛应用。

3.
- RS - 485:也是一种串行通信接口标准,采用差分传输方式(用两根线之间的电压差来表示逻辑电平),抗干扰能力强,传输距离远(可达上千米),并且支持多节点(最多可连接32个或更多节点)通信,常用于工业控制、智能楼宇等需要长距离、多节点通信的场景。

七.简单代码示例(uart)

#include <reg52.h>
#include "delay.h"
#include <string.h>
#include <stdio.h>
#include "digtub.h"xdata char recv_buffer[64];
int pos = 0;void init_uart(void)
{unsigned char t;t = SCON;t &= ~(3 << 6);t |= (1 << 6) | (1 << 4);SCON = t;PCON |= (1 << 7);IE |= (1<<7)|(1<<4);t = TMOD;t &= ~(3 << 4);t |= (2 << 4);t &= ~(3 << 6);TMOD = t;TH1 = 208;TL1 = 208;TCON |= (1 << 6);
}void send_char(char ch)
{//P2 = 0;SBUF = ch;while((SCON & (1 << 1)) == 0);SCON &= ~(1 << 1);
}void send_buffer(const char *p,int len)
{while(len--){send_char(*p++);		}
}void uart_recv_hander(void) interrupt 4
{if((SCON & (1<<0)) != 0){//P2 = SBUF;recv_buffer[pos++] = SBUF;SCON &= ~(1<<0);}
}int digiter_num = 0;
#define Hz200 63035
#define Hz400 64285
#define Hz800 64910
#define Hz2000 65285
unsigned int n = Hz200;void init_timer0(void)
{TMOD &= ~(3<<2);TMOD &= ~(3<<0);TMOD |= (1<<0);TH0 = n >> 8;TL0 = n;//TCON |= (1<<4);IE |= (1<<7)|(1<<1);
}void timer1_hander(void) interrupt 1
{P2 ^= (1<<1);TH0 = n >> 8;TL0 = n;
}unsigned char sumOfTheArray(unsigned char *p,int len)
{unsigned char sum = 0;int i;for(i = 0;i < len;++i){sum += p[i];}return sum;
}void parse(void)
{if((unsigned char)recv_buffer[0] == 0xAA && (unsigned char)recv_buffer[pos - 1] == 0x0D){if((unsigned char)recv_buffer[1] == 0x01){if(sumOfTheArray(recv_buffer,5) == (unsigned char)recv_buffer[5]){unsigned char order;order = recv_buffer[2];switch(order){case 0x01:P2 = 0;break;case 0x02:digiter_num = (unsigned char)recv_buffer[3];break;default:init_timer0();init_key();while(1){int ret;ret = key_pressed();if(ret == 0){TCON &= ~(1<<4);		}if(ret == 1){n = Hz200;TCON |= (1<<4);}if(ret == 2){n = Hz400;TCON |= (1<<4);}if(ret == 3){n = Hz800;TCON |= (1<<4);}if(ret == 4){n = Hz2000;TCON |= (1<<4);}}break;}}}}
}int main(void)
{//xdata char buffer[64];//int a,b,c,d,e,f,g;//int *p = NULL;init_uart();/*while(1){//send_char('A');a = sizeof(int);b = sizeof(short);c = sizeof(long);d = sizeof(float);e = sizeof(double);f = sizeof(char);g = sizeof(p);sprintf(buffer,"size1 = %d\n",a);send_buffer(buffer,strlen(buffer));sprintf(buffer,"size2 = %d\n",b);send_buffer(buffer,strlen(buffer));sprintf(buffer,"size3 = %d\n",c);send_buffer(buffer,strlen(buffer));sprintf(buffer,"size4 = %d\n",d);send_buffer(buffer,strlen(buffer));sprintf(buffer,"size5 = %d\n",e);send_buffer(buffer,strlen(buffer));sprintf(buffer,"size6 = %d\n",f);send_buffer(buffer,strlen(buffer));sprintf(buffer,"size7 = %d\n",g);send_buffer(buffer,strlen(buffer));delay(0x9FFF);	}*//*while(1){if(pos != 0){delay(0xFFFF);if(strcmp(recv_buffer,"Hello") == 0){send_buffer("Hi",7);}else if(strcmp(recv_buffer,"China") ==0){send_buffer("NB",2);}//send_buffer(recv_buffer,pos);pos = 0;memset(recv_buffer,0,sizeof(recv_buffer));}} */while(1){if(pos != 0){delay(0xFFFF);parse();pos = 0;memset(recv_buffer,0,sizeof(recv_buffer));}show_number(digiter_num);}return 0;
}

http://www.xdnf.cn/news/20080.html

相关文章:

  • 2025年你需要了解的大型语言模型部署工具
  • 配置WSL2的Ubuntu接受外部设备访问
  • 课前准备--基因组(WGS/WES)联合单细胞获取突变信息
  • 分析KLA-Tencor公司膜厚THK产品
  • Python 算数运算练习题
  • 应对技术选型与技术债务以及架构设计与业务需求的关系
  • 概率与数理统计公式及结论汇总
  • 从策略到实效|Adobe Target 实战应用与成功案例
  • uni-app iOS 文件调试常见问题与解决方案:结合 itools、克魔、iMazing 的实战经验
  • 用spring框架实现简单的MVC业务
  • 远程协作下的项目失控:不是信任危机,而是感知缺失
  • 7种流行Prompt设计模式详解:适用场景与最佳实践
  • 快速、归并、堆、希尔、ArrayList排序
  • pyinstaller
  • SQL decode() 函数
  • Python爬虫实战:研究Axes Grid模块,构建旅游平台酒店数据采集和分析系统
  • VNC连接服务器实现远程桌面-针对官方给的链接已经失效问题
  • Linux 综合练习
  • LTE CA和NR CA的区别和联系
  • 第七章 Cesium 3D 粒子烟花效果案例解析:从原理到完整代码
  • CSS Position 属性
  • Pspice仿真电路:(三十六)变压器仿真
  • 本科论文抽检档案整理:Python批量文件查找、打包、改名
  • 【uniapp】打包为h5在保留头部标题的同时配置网站标题不跟随页面路由更新
  • CVPR 2025|无类别词汇的视觉-语言模型少样本学习
  • RikkaHub:安卓原生AI聊天新体验
  • 【设计模式】UML 基础教程总结(软件设计师考试重点)
  • 十一、标准化和软件知识产权基础知识
  • 认识 Flutter
  • 告别 OpenAI SDK:如何使用 Python requests 库调用大模型 API(例如百度的ernie-4.5-turbo)