【51单片机系列】单片机与PC进行串行通信

一、单片机与PC机串行通信的设计

工业现场的测控系统中,常使用单片机进行监测点的数据采集,然后单片机通过串口与PC通信,把采集的数据串行传送到PC机上,再在PC机上进行数据处理。

PC机配置的都是RS-232标准串口,为D型9针插座,输入/输出为RS-232电平。D型9针插头引脚如下:

D型9针插头引脚

如下表为RS-232C的D型9针插头的引脚定义。

引脚号功能符号方向
1数据暂替检测DCD输入
2接收数据RXD输入
3发送数据TXD输出
4数据终端就绪DTR输出
5信号地GND
6数据通信设备准备好DSR输入
7请求发送RTS输出
8清除发送CTS输入
9振铃指示RI输入

由于两者电平不匹配,因此必须把单片机输出的TTL电平转换为RS-232电平。

单片机与PC的接口如下图所示。图中的转换芯片为MAX232,接口连接只用了3条线,即RS-232插座中的2引脚、3引脚与5引脚。

单片机与PC机的RS-232串行通信接口

二、单片机向PC发送数据示例

要求单片机通过串行口的TXD引脚向PC机串行发送8个数据字节。在proteus中使用两个串行口虚拟终端观察串行口线上出现的串行传输数据。

两个虚拟终端窗口为VT1和VT2,其中窗口VT1显示的数据表示单片机串口发送给PC机的数据,窗口VT2显示的数据表示由PC机经RS-232串口模型COMPIM接收到的数据,由于使用了串口模型COMPIM,从而省去了PC机的模型。

proteus仿真原理图如下:

单片机向PC发送数据的proteus仿真电路图

需要注意要设置虚拟终端的波特率与代码中设置的波特率保持一致。经过MAX232转换后电平是相反的,设置VT2属性中的【RX/TX Polarity】为【Inverted】。

软件设计,首先初始化串口通信,设置串口工作方式1,定时器工作方式2,波特率9600bps,波特率不加倍,代码如下:

void UsartInit()
{SCON=0x40;  // 设置串口工作方式1TMOD=0x20;  // 设置定时器T1工作方式2TH1=TL1=0xFD;  // 设置波特率为9600bps,波特率不倍增PCON=0x00;EA=1;TR1=1;
}

发送数据功能单独编写一个函数,如下:

void send(u8 dat)
{SBUF=dat;  // 将待发送数据写入发送缓冲器SBUFwhile(!TI);  // 等待串行口发送完毕_nop_();  // 空操作TI=0;  // 1个字节发送完成,清零TI
}

主函数中首先调用串口通信初始化函数,然后调用发送数据函数,调用8次后,如果不想再次发送数据进入while(1)循环。如下:

void main()
{u8 i;UsartInit();  // 串口通信初始化for(i=0;i<8;i++){send(sendBytes[i]);  // 发送数据delay();  // 每次发送完数据延时200ms}while(1);
}

其中sendBytes定义如下:

// 单片机发送给PC机的数据
u8 code sendBytes[]="12345678";

proteus仿真结果如下:

串口通信单片机向PC机发送消息

三、单片机接收PC机发送的数据使用示例

单片机接收PC机发送的串行数据,并把接收到的数据送P1口的8位LED显示。采用单片机的串行口模拟P机 串行口。proteus仿真原理图如下:

单片机接收PC机发送的串行数据的原理电路

软件设计,发送数据的代码如下:

/*实现功能:串口通信,单片机与PC机通信,单片机接收PC机发送的数据。	使用一个单片机模拟PC机[2024-01-15] zoya
*/#include <reg52.h>
#include <intrins.h>typedef unsigned char u8;
typedef unsigned int u16;u8 sendBytes=0xFE;// 延时函数,单位ms
void delay(u16 i)
{u8 j;for(;i>0;i--){for(j=0;j<125;j++);}
}// 串口通信初始化函数
void UsartInit()
{SCON=0x40;  // 串口工作方式1,只发送不接收TMOD=0x20;  // 定时器工作方式2TH1=TL1=0xFD;  // 设置波特率为9600bps,波特率不倍增PCON=0x00;TR1=1;  // 启动计数
}void main()
{u8 i;UsartInit();while(1){for(i=0;i<7;i++){// 发送数据SBUF = sendBytes;while(!TI);_nop_();TI=0;delay(200);sendBytes=_crol_(sendBytes,1);}for(i=0;i<7;i++){// 发送数据SBUF = sendBytes;while(!TI);_nop_();TI=0;delay(200);sendBytes=_cror_(sendBytes,1);}}
}

接收数据的代码如下:

/*实现功能:串口通信,单片机与PC机通信,单片机接收PC机发送的数据。	接收PC机数据[2024-01-15] zoya
*/
#include <reg52.h>typedef unsigned char u8;
typedef unsigned int u16;#define GPIO_LED P1void UsartInit()
{SCON=0x50;  // 串口工作方式1,接收数据TMOD=0x20;  // 定时器T1工作方式2TH1=TL1=0xFD;  // 波特率9600bps,不倍增PCON=0x00;TR1=1;  // 启动计数
}
void main()
{u8 tmp;UsartInit();while(1){while(!RI);  // 等待接收数据结束RI=0;tmp=SBUF;GPIO_LED=tmp;}
}

仿真结果:

串口通信单片机接收PC机发送的数据

四、PC机与单片机或与多个单片机的串行通信

一台PC机与若干台单片机可构成小型分布式测控系统,如下图所示,该系统在许多实时的工业控制和数据采集系统中,可以充分发挥单片机功能强、抗干扰性好、面向控制等优点,同时又可利用PC机弥补单片机在数据处理和人机对话等方面的不足。

PC机与若干台单片机构成的分布式测控系统

在应用系统中,一般是以PC机作为主机,定时扫描以AT89S52单片机为核心的前沿单片机,以便采集数据或发送控制信息。

在这样的系统中,以AT89S52单片机为核心的智能式测量和控制仪表(从机)既能独立地完成数据处理和控制任务,又可将数据传送给PC机(主机)。PC机将这些数据进行处理,或显示,或打印,同时将各种控制命令传送给各从机,以实现集中管理和最优控制。

要组成上图的分布式测控系统,首先要解决的是PC机与单片机之间的串行通信接口问题。

下面以采用RS-485接口的串行多机通信为例,说明PC机与数台AT89S52单片机进行多机通信的接口电路设计方案。PC机配有RS-232串行标准接口,可通过电路板卡转换成RS-485串行接口,AT89S52单片机本身具有全双工的串行口,该串行口加上驱动电路后就可以实现RS-485接口的串行通信。

PC机与数台AT89S52单片机进行多机通信的RS-485串行通信接口电路如下所示:

PC机与AT89S52单片机串行通信接口电路

上图中,AT89S52单片机的串行口通过75176芯片驱动后就可以转换成RS-485标准接口,根据RS-485标准接口的电器特性,从机数量不多于32个。PC机与AT89S52单片机之间的串行通信采用主从方式,PC机为主机,各AT89S52为从机,由PC机来确定与哪个单片机进行通信。

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

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

相关文章

Docker-Confluence部署记录

启动 docker container run -v $(pwd):/var/atlassian/application-data/confluence/ --nethost -d --nameconfluence_720_20240120 confluence/confluence:7.2.0新建mysql数据库 导入破解包 atlassian-agent 参考-Confluence 破解方式&#xff08;Linux&#xff09; 按流程破…

JS中的File(四):文件流Streams API使用详解

目录 一、流的原理 二、流的分类 1、可读流&#xff08;ReadableStream&#xff09; 3、转换流&#xff08;TransformStream&#xff09; 三、流中的Request和Response对象 四、综合应用 PS&#xff1a;涉及到一些基本的文件操作和格式内容知识&#xff0c;可以进入我的主…

书生·浦语大模型实战营第四次课堂笔记

先来看看参考作业 哈哈到这才想起来写笔记 倒回去看发现要求将不要葱姜蒜换成自己的名字和昵称&#xff01; 好好好我就是不配玩&#xff08;换成管理员也不行&#xff01;&#xff09; 诶怎么能进这个环境&#xff1f;要进双系统ubuntu&#xff1f; 现在看视频发现原来是…

k8s------Pod、Label、NameSpace

一、Pod: Kubernetes中的最小调度对象 1.1 说明 Pod(容器组)是k8s创建和调度的最小单元。一个Pod封装多个容器(container)、存储资源(volume)、一个独立网络ip和管理控制容器运行方式。 Pod可以单独运行一个容器&#xff0c;也可以兼容多个容器运行&#xff0c;多个容器共享…

周五的胡思乱想

众所周知 csdn 在程序员的心目中是比较逊色的, 因为博客水平的参差不齐, 大部分人也都是用来作为自己的笔记方便未来复制。这样就导致这里的文章都是点到为止&#xff0c;没有去深究问题的根本原因&#xff0c;大家也都是复制一下解决方案就关闭的页面。或许这就是 csdn 的价值…

使用 ClassFinal 对SpringBoot jar加密加固并进行机器绑定

写在前面&#xff1a;各位看到此博客的小伙伴&#xff0c;如有不对的地方请及时通过私信我或者评论此博客的方式指出&#xff0c;以免误人子弟。多谢&#xff01;如果我的博客对你有帮助&#xff0c;欢迎进行评论✏️✏️、点赞&#x1f44d;&#x1f44d;、收藏⭐️⭐️&#…

Linux搭建dns主从服务器

一、实验要求 配置Dns主从服务器&#xff0c;能够实现正常的正反向解析 二、知识点 1、DNS简介 DNS&#xff08;Domain Name System&#xff09;是互联网上的一项服务&#xff0c;它作为将域名和IP地址相互映射的一个分布式数据库&#xff0c;能够使人更方便的访问互联网。…

Microsoft365域名DNS设置

DNS 基础 项目2023/09/227 个参与者DNS 基础 - Microsoft 365 admin | Microsoft Learn 反馈 本文内容 观看&#xff1a;域和 DNS&#xff1a;概述什么是域名&#xff1f;了解 DNS 记录类型DNS 如何工作&#xff1f; 显示另外 4 个 如果找不到要查找的内容&#xff0c;请…

1.php开发-个人博客项目文章功能显示数据库操作数据接收

&#xff08;2022-day12&#xff09; #知识点 1-php入门&#xff0c;语法&#xff0c;提交 2-mysql 3-HTMLcss ​ 演示案例 博客-文章阅读功能初步实现 实现功能&#xff1a; 前端文章导航&#xff0c;点入内容显示&#xff0c;更改ID显示不同内容 实现步骤&#xff1…

java8 列表通过 stream流 根据对象属性去重的三种实现方法

java8 列表通过 stream流 根据对象属性去重的三种实现方法 一、简单去重 public class DistinctTest {/*** 没有重写 equals 方法*/SetterGetterToStringAllArgsConstructorNoArgsConstructorpublic static class User {private String name;private Integer age;}/*** lombo…

LeetCode.2788. 按分隔符拆分字符串

题目 题目链接 分析 题目的意思是给我们一个字符串数组和一个分隔符&#xff0c;让我们按照分隔符把字符串数组分割成新的字符串数组。 看到这个描述&#xff0c;这不就是直接就是利用 按照分隔符分割字符串的系统库函数split()&#xff0c;这个函数的意思就是 把一个字符串…

JDBC编程详细教程与示例源码

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl JDBC概述 为了在Java语言中提供对数据库访问的支持&#xff0c;Sun公司于1996年提供了一套访问数据库的标准Java类库JDBC。JDBC的全称是Java数据库连接(Java Database Conn…

使用条件操作执行控制图

Condition Action Behavior 此示例显示了具有多个分段的转换路径中的简单条件操作的行为。该图表使用传出转换的隐式排序 起初&#xff0c;chart处于休眠状态。状态A处于活动状态。条件C_one和C_two为false。事件E_one发生并唤醒chart&#xff0c;该图表通过层次结构从根向下…

第5章 运算符重载

运算符概述 纯单目运算符&#xff0c;只能有一个操作数&#xff0c;包括&#xff1a;!、~、sizeof、new、delete 等 纯双目运算符&#xff0c;只能有两个操作数&#xff0c;包括&#xff1a;[]、->、% 、 等 三目运算符&#xff0c;有三个操作数&#xff0c;如“ ? : ” 既…

C#,字符串匹配(模式搜索)有限自动机(Finite Automata)算法的源代码

一、有限状态自动机 图中两个圆圈&#xff0c;也叫节点&#xff0c;用于表示状态&#xff0c;从图中可以看成&#xff0c;它有两个状态&#xff0c;分别叫0和1。从每个节点出发&#xff0c;都会有若干条边。当处于某个状态时&#xff0c;如果输入的字符跟该节点出发的某条边的内…

go语言(八)---- map

map的声明方式有以下三种。 package mainimport "fmt"func main() {//第一种声明方式//声明map1是一个map类型&#xff0c;key是String&#xff0c;value是Stringvar myMap1 map[string] stringif myMap1 nil {fmt.Println("myMap1 是一个空map")}//在使…

idea中使用git提交代码报 Nothing To commit No changes detected

问题描述 在idea中右键&#xff0c;开始将变更的代码进行提交的时候&#xff0c;【Commit Directory】点击提交的时候 报 Nothing To commit No changes detected解决方案 在这里点击Test 看看是不是能下面显示git版本&#xff0c;不行的话 会显示一个 fix的字样&#xff0c;行…

阿里云ECS使用docker搭建mysql服务

目录 1.确保正确安装好docker 2.安装mysql镜像 3.创建容器&#xff08;设置端口映射、目录映射&#xff09; 1.确保正确安装好docker 安装教程&#xff1a; 阿里云ECS(CentOS镜像)安装docker-CSDN博客https://blog.csdn.net/qq_62262918/article/details/135686614?spm10…

Android平台Unity下如何通过WebCamTexture采集摄像头数据并推送至RTMP服务器或轻量级RTSP服务

技术背景 我们在对接Unity下推送模块的时候&#xff0c;遇到这样的技术诉求&#xff0c;开发者希望在Android的Unity场景下&#xff0c;获取到前后摄像头的数据&#xff0c;并投递到RTMP服务器&#xff0c;实现低延迟的数据采集处理。 在此之前&#xff0c;我们已经有了非常成…

如何下载OpenStreetMap(OSM)最新数据

OpenStreetMap&#xff08;OSM&#xff09;是一个开源的地图项目&#xff0c;旨在创建和提供免费、可自由使用、可编辑的地图数据和地图服务。以下是关于OpenStreetMap的一些关键信息&#xff1a; 社区驱动&#xff1a; OpenStreetMap是由一个全球性的志愿者社区共同创建和维护…