当前位置:   article > 正文

【51单片机系列】单片机与PC进行串行通信_51单片机串口通信的接收与发送

51单片机串口通信的接收与发送

一、单片机与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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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

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

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

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

其中sendBytes定义如下:

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

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);
		}
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63

接收数据的代码如下:

/*
	实现功能:串口通信,单片机与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;
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

仿真结果:

串口通信单片机接收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机来确定与哪个单片机进行通信。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/755378
推荐阅读
相关标签
  

闽ICP备14008679号