【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.hqwc.cn/news/416727.html

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

相关文章

element-ui 打包流程源码解析(下)

目录 目录结构和使用1&#xff0c;npm 安装1.1&#xff0c;完整引入1.2&#xff0c;按需引入 2&#xff0c;CDN3&#xff0c;国际化 接上文&#xff1a;element-ui 打包流程源码解析&#xff08;上&#xff09; 文章中提到的【上文】都指它 ↑ 目录结构和使用 我们从使用方式来…

2.C语言——控制语句

控制语句 1.分支语句/判断语句if 语句if...else 语句if...else if...else语句 switch语句 2.循环语句 while 语句 do...while 语句 for 语句 3.转向语句 break continue go to 1.分支语句/判断语句 if 语句 if(boolean_expression) { /* 如果布尔表达式为真将执行的语句 */ } …

使用WAF防御网络上的隐蔽威胁之SQL注入攻击

SQL注入攻击是一种普遍存在且危害巨大的网络安全威胁&#xff0c;它允许攻击者通过执行恶意的SQL语句来操纵或破坏数据库。 这种攻击不仅能够读取敏感数据&#xff0c;还可能用于添加、修改或删除数据库中的记录。因此&#xff0c;了解SQL注入攻击的机制及其防御策略对于保护网…

第33集《佛法修学概要》

请大家打开讲义第八十七页。我们讲到六度法门&#xff0c;这是菩萨道的六度。 佛教的修学&#xff0c;从浅入深&#xff0c;大致上可以分成三个主要的次第&#xff1a; 我们刚开始修学佛法的时候&#xff0c;第一个修学的重点&#xff0c;叫作“见山是山&#xff0c;见水是水…

254:vue+openlayers 加载HERE多种形式地图(v3软件版本)

第254个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中添加HERE地图(v3版本的软件),并且含多种的表现形式。包括地图类型,文字标记的设置、语言的选择、PPI的设定。 v3版本和v2版本有很大的区别,关键是引用方法上,请参考文章尾部的API链接。 直接复制…

STM32 GD32 瑞萨 psoc 等单片机 无线wifi蓝牙最佳解决方案

新联鑫威一系列低功耗高性价比sdio wifi/蓝牙combo的模块CYWL6208 , CYWL6312, CYW6209等可以搭配stm32 各种型号例如以下,支持sta/ap/apsta&#xff0c;双模蓝牙的应用&#xff0c;支持rt-thread, freertos, Azure RTOS, Linux, Android系统. 稳定强&#xff0c;功耗低&#x…

23号资源——电力系统程序集合已提供下载资源

23号资源&#xff1a;程序集合包含9个程序&#xff08;经典电力系统经济调度程序&#xff1b;2解决带储&#xff1b;3智能微电网PSO优化算法&#xff1b;微电网调度等等&#xff0c;见资源描述&#xff09;资源-CSDN文库https://download.csdn.net/download/LIANG674027206/887…

去掉element-ui的el-table的所有边框+表头+背景颜色

实例: 1.去掉table表头(加上:show-header"false") <el-table:data"tableData":show-header"false"style"width: 100%"> </el-table> 2.去掉table所有边框 ::v-deep .el-table--border th.el-table__cell, ::v-deep .el…

ARM多核调度器DSU

1. 背景 从A75开始&#xff0c;ARM提出了一个新的多核心管理系统单元&#xff0c;叫做DSU(DynamIQ Shared Unit)。DSU的核心功能是控制CPU内核&#xff0c;使其成簇Cluster使用&#xff0c;簇内每一个核心可以单独开关、调整频率/电压&#xff0c;能效表现更佳&#xff0c;甚至…

Idea 开发环境不断切换git代码分支导致冲掉别人代码

问题分析 使用git reflog查看执行命令&#xff0c;以下是发生事故的切换和提交动作 46f72622e1 HEAD{41}: commit: feat: 【Sales - 6.3】小程序端不登录也可以录入客户线索 c5e7d9f6e1 HEAD{42}: fetch origin feature/20240102_Sales6.3_xingang:feature/20240102_Sales6.3…

node.js(expree.js )模拟手机验证码功能及登录功能

dbconfig.js const mysql require(mysql) module.exports {// 数据库配置config: {host: localhost, // 连接地址port: 3306, //端口号user: root, //用户名password: wei630229, //密码database: exapp2, //数据库名}, // 连接数据库&#xff0c;使用mysql的连接池连接方式…

JMeter实操入门之登录

JMeter实操入门之登录 前言初级-无变量的登录线程组取样器-HTTP请求 进阶-定义变量的登录用户定义的变量获取JSON返回的数据-tokentoken设置全局变量 前言 安装及环境配置教程可移步&#xff1a;JMeter安装与配置环境 本篇文章针对小白进一步的认识及运用JMeter&#xff0c;围绕…