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

news2024/12/25 12:21:39

一、单片机与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;  // 设置串口工作方式1
	TMOD=0x20;  // 设置定时器T1工作方式2
	TH1=TL1=0xFD;  // 设置波特率为9600bps,波特率不倍增
	PCON=0x00;
	EA=1;
	TR1=1;
}

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

void send(u8 dat)
{
	SBUF=dat;  // 将待发送数据写入发送缓冲器SBUF
	while(!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;  // 定时器工作方式2
	TH1=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 P1

void UsartInit()
{
	SCON=0x50;  // 串口工作方式1,接收数据
	TMOD=0x20;  // 定时器T1工作方式2
	TH1=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.coloradmin.cn/o/1389017.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

steam游戏搬砖项目还能火多久?

最近放假回到老家&#xff0c;见了不少亲戚朋友&#xff0c;大家不约而同都在感叹今年大环境不好&#xff0c;工作不顺&#xff0c;生意效益不好&#xff0c;公司状况不佳&#xff0c;反问我们生意如何&#xff1f;为了让他们心里好受一点&#xff0c;我也假装附和道:也不咋地&…

【项目经验】详解Puppeteer入门及案例

文章目录 一.项目需求及Puppeteer是什么&#xff1f;二.Puppeteer注意事项及常用的方法1.注意事项2.常用的方法*puppeteer.launch&#xff08;&#xff09;**browser.newPage()**page.goto()**page.on(request&#xff0c;&#xff08;&#xff09;> {}&#xff09;**page.e…

如何根据水利需求选择合适的遥测终端机

在水利信息化建设中&#xff0c;遥测终端机作为关键的设备之一&#xff0c;发挥着越来越重要的作用。如何根据实际的水利需求选择合适的遥测终端机&#xff0c;成为了众多企业和单位关注的焦点。本文将为您揭示遥测终端机的选择之道&#xff0c;助您在水利信息化建设中取得事半…

微信接入知识库定制化的AI会怎样?

想不想要一个更加了解你的chatgpt&#xff1f;或者想给chatgpt加入特定的知识库&#xff1f; LinkAI来帮你&#xff01; 通过LinkAI&#xff0c;无需openai的api key&#xff0c;直接使用chatgpt。无需考虑服务器代理配置&#xff0c;openai账号注册等&#xff01;自定义知识…

3.3.3 使用集线器的星形拓扑

3.3.3 使用集线器的星形拓扑 集线器的一些特点 3.3.4 以太网的信道利用率 多个站在以太网上同时工作就可能会发生碰撞当发生碰撞时&#xff0c;信道资源实际上是被浪费了。因此&#xff0c;当扣除碰撞所造成的信道损失后&#xff0c;以太网总的信道利用率并不能达到100% 3.…

多个table的选中问题

多个table的选中问题 场景&#xff1a;循环出来多个table&#xff0c;最后拿到所有选中的数据 出现的问题&#xff1a;比如先选择第一个table的某些数据&#xff0c;再去选另外的table&#xff0c;这样selection里面只有最后选中的table的数据。 解决方法&#xff1a;在sele…

接口interface--java学习笔记

认识接口 java提供了一个关键字interface&#xff0c;用这个关键字可以定义出一个特殊的结构&#xff1a;接口在接口里面定义的变量&#xff0c;不管加不加public static final修饰都默认为常量&#xff0c;必须赋初值在接口里面定义的方法&#xff0c;不管加不加public abstr…

Java实现高校大学生创业管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统公告模块2.2 创业项目模块2.3 创业社团模块2.4 政府政策模块2.5 创业比赛模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 系统公告表3.2.2 创业项目表3.2.3 创业社团表3.2.4 政策表 四、系统展示五、核心代码5.…

操作系统详解(5.2)——信号(Signal)的题目进阶

系列文章&#xff1a; 操作系统详解(1)——操作系统的作用 操作系统详解(2)——异常处理(Exception) 操作系统详解(3)——进程、并发和并行 操作系统详解(4)——进程控制(fork, waitpid, sleep, execve) 操作系统详解(5)——信号(Signal) 操作系统详解(5.1)——信号(Signal)的相…

linux终端上传github提示:更新被拒绝,因为远程仓库包含您本地尚不存在的提交

问题&#xff1a; 提示&#xff1a;更新被拒绝&#xff0c;因为远程仓库包含您本地尚不存在的提交。这通常是因为另外 提示&#xff1a;一个仓库已向该引用进行了推送。再次推送前&#xff0c;您可能需要先整合远程变更 提示&#xff1a;&#xff08;如 git pull ...&#xff…

走进Spring Boot 3.x时代(一)

目录 前言Spring Boot 2.x 时代Spring Boot 3.x 时代Spring Boot 3.x 新特性JDK调整平滑升级依赖调整最低环境要求配置属性兼容提高应用可观察性Jakarta EE升级的关键变更支持 GraalVM 原生镜像三方包升级Log4j2增强ConstructorBinding检测优化Micrometer 升级Micrometer Trac…

有哪些免费3D模型网站值得推荐?

设计师们经常需要一些免费的3D模型网站用来寻找各种类型的3D模型&#xff0c;如人物、动物、车辆、建筑、道具等&#xff0c;从而满足不同的设计需求以及设计灵感。那么有哪些免费3D模型网站值得推荐&#xff1a; ①建e网&#xff1a;建e网是一个提供3D模型下载的平台&#xff…

D20XB100-ASEMI开关电源桥堆D20XB100

编辑&#xff1a;ll D20XB100-ASEMI开关电源桥堆D20XB100 型号&#xff1a;D20XB100 品牌&#xff1a;ASEMI 封装&#xff1a;GBJ-5&#xff08;带康铜丝&#xff09; 平均正向整流电流&#xff08;Id&#xff09;&#xff1a;20A 最大反向击穿电压&#xff08;VRM&#…

【Python3】【力扣题】387. 字符串中的第一个唯一字符

【力扣题】题目描述&#xff1a; 【Python3】代码&#xff1a; 1、解题思路&#xff1a;遍历字符串&#xff0c;依次判断元素在字符串中的个数是否为1&#xff0c;第一个为1的返回该元素的索引号&#xff0c;若整个字符串都没有个数为1的&#xff0c;则返回-1。 知识点&#…

基于ssm的学籍管理系统论文

摘 要 当下&#xff0c;如果还依然使用纸质文档来记录并且管理相关信息&#xff0c;可能会出现很多问题&#xff0c;比如原始文件的丢失&#xff0c;因为采用纸质文档&#xff0c;很容易受潮或者怕火&#xff0c;不容易备份&#xff0c;需要花费大量的人员和资金来管理用纸质文…

vue+echarts 几个案例

普通柱状图 <template><!-- 容器默认宽高是0 如果不设置 页面不显示--><div ref"mychart" id"mychart"></div> </template><script> import * as echarts from "echarts" import axios from axiosexport …

致大家的一封信2024 — 对称性原理

紫光集团董事长李滨先生&#xff0c;作为融信产业联盟理事长每年都会为联盟成员发布一封新年信&#xff0c;与各联盟伙伴分享新一年的思考与感悟。今年&#xff0c;李滨先生围绕“对称性原理”进行了2024年的新年分享&#xff0c;并向大家带来新一年的美好祝福。 原文如下&…

python 二次封装Modbus库实现设备间Modbus通信

前言&#xff1a; 想想好久没有更博客了&#xff0c;今天忙中偷闲准备写一篇Modbus相关的分享。在进入工业领域之前我一直从事软件行业的测试工作&#xff0c;所以也没听过Modbus协议&#xff0c;但是自从进入西门子工作后正式进入了工业领域&#xff0c;所以对Modbus协议也就…

chromium+clangd快速代码跳转

在开发chromium的时候我们使用vscode工具进行开发&#xff0c;如果使用C插件发现很容就卡死计算机了。 所以我们使用clangd工具来查看chromium的代码。 一、安装 在vscode中安装还是很简单的。 输入cland&#xff0c;点击安装即可 二、生成编译数据库 代码编译完成后&…

javascript的变量存储机制和原理

前言 在了解javascript的变量存储机制之前需要了解javascript的数据类型&#xff0c;在js中&#xff0c;数据类型分为基本数据类型和引用数据类型。二者存在内存中&#xff0c;基本类型存在栈中&#xff0c;引用类型存储在堆里。 想查看javascript数据类型详细介绍请访问&…