51_串口通信 仿真+例程

基于51单片机的知识总结,使用protues和keil共同学习。
我使用的是protues7.8 和 keil4,需要软件的联系我。
源码及protues仿真:https://download.csdn.net/download/sinat_33734313/11853192

串口通信-232

protues电路仿真

仿真元器件

DB9接口:COMPIM

仿真电路以及使用软件截图

51_串口通信 仿真+例程_第1张图片
51_串口通信 仿真+例程_第2张图片
51_串口通信 仿真+例程_第3张图片
51_串口通信 仿真+例程_第4张图片

硬件说明

1.DB9接口
1.1 COMPIM组件内部,自带232-TTL的电平转换功能,因此不需要再使用电平转换芯片。
1.2 双击COMPIM组件,填写程序对应的串口信息。
1.3 使用虚拟串口软件进行模拟。

程序

/*-------------------------------------------
FileName:main.c
Function: 串口通信
Description:
---------------------------------------------
Author: Ethan Chen
Date: 2019-10-11
-------------------------------------------*/

#include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器

typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;

u8 receiveData[20];
u8 RXLen = 0;
/*******************************************************************************
* 函数名         :UsartInit()
* 函数功能		   :设置串口
* 输入           : 无
* 输出         	 : 无
*******************************************************************************/
void UsartInit()
{
	SCON=0x50;			//设置为工作方式1
	TMOD=0x20;			//设置计数器工作方式2
	PCON=0x80;			//波特率加倍
	TH1=0xF3;			//计数器初始值设置,注意波特率是4800的
	TL1=0xF3;
	ES=1;				//打开接收中断
	EA=1;				//打开总中断
	TR1=1;				//打开计数器
}

void Usart_HandleMessage(void)
{
	static u8 LastRXLen = 0;
	static u8 time = 0;
	
	if( RXLen == 0 )	return;
	
	if( LastRXLen != RXLen )
	{
		LastRXLen = RXLen;
	}
	else
	{
		time++;
		if( time >= 10 )
		{
			time = 0;
			LastRXLen = 0;
			if( receiveData[0] == 'S' && receiveData[1] == 'E' && receiveData[2] == 'T' )
			{
				u8 TXBuf[3];
				u8 i;
				TXBuf[0] = 'G';
				TXBuf[1] = 'E';
				TXBuf[2] = 'T';
				for( i=0; i<RXLen; i++)
				{
					SBUF = TXBuf[i];
					while(!TI);
				}
				RXLen = 0;
			}
		}
	}
	return;
}

/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void main()
{
	UsartInit();  //	串口初始化
	while(1)
	{
		Usart_HandleMessage();
	}		
}

/*******************************************************************************
* 函数名         : Usart() interrupt 4
* 函数功能		  : 串口通信中断函数
* 输入           : 无
* 输出         	 : 无
*******************************************************************************/
void Usart() interrupt 4
{
	if( RI )
	{
		receiveData[RXLen++]=SBUF;//出去接收到的数据
		RI = 0;//清除接收中断标志位
	}
	if( TI )
	{
		TI = 0;
	}
}

串口通信-485

protues电路仿真

仿真元器件

DB9接口:COMPIM
MAX487

仿真电路以及使用软件截图

51_串口通信 仿真+例程_第5张图片
51_串口通信 仿真+例程_第6张图片
51_串口通信 仿真+例程_第7张图片
51_串口通信 仿真+例程_第8张图片

硬件说明

1.DB9接口
1.1 COMPIM组件内部,自带232-TTL的电平转换功能,因此需要多加一个MAX487将485电平转为TTL连接COMPIM。
1.2 双击COMPIM组件,填写程序对应的串口信息。
1.3 使用虚拟串口软件进行模拟。

程序

/*-------------------------------------------
FileName:main.c
Function: 串口通信
Description:485
---------------------------------------------
Author: Ethan Chen
Date: 2019-10-11
-------------------------------------------*/

#include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器
#include "string.h"
typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;

sbit RS485DIR=P1^0;	  //RS485DIR=0为接收状态  RS485DIR=1为发送状态

u8 receiveData[20];
u8 RXLen = 0;

/*******************************************************************************
* 函 数 名         : delay
* 函数功能		   : 延时函数,i=1时,大约延时10us
*******************************************************************************/
//void delay(u16 i)
//{
//	while(i--);	
//}

/*******************************************************************************
* 函数名         :UsartInit()
* 函数功能		   :设置串口
* 输入           : 无
* 输出         	 : 无
*******************************************************************************/
void UsartInit()
{
	SCON=0X50;			//设置为工作方式1
	TMOD=0X20;			//设置计数器工作方式2
	PCON=0X80;			//波特率加倍
	TH1=0XF3;				//计数器初始值设置,注意波特率是4800的
	TL1=0XF3;
	ES=1;						//打开接收中断
	EA=1;						//打开总中断
	TR1=1;					//打开计数器
	RS485DIR=0;
}

void Usart_HandleMessage(void)
{
	static u8 LastRXLen = 0;
	static u8 time = 0;
	
	if( RXLen == 0 )	return;
	
	if( LastRXLen != RXLen )
	{
		LastRXLen = RXLen;
	}
	else
	{
		time++;
		if( time >= 10 )
		{
			time = 0;
			LastRXLen = 0;
			if( receiveData[0] == 'S' && receiveData[1] == 'E' && receiveData[2] == 'T' )
			{
				u8 TXBuf[3];
				u8 i;
				
				TXBuf[0] = 'G';
				TXBuf[1] = 'E';
				TXBuf[2] = 'T';
				for( i=0; i<RXLen; i++)
				{
					RS485DIR=1;
					SBUF=TXBuf[i];//将接收到的数据放入到发送寄存器
					while(!TI);			 //等待发送数据完成
				}
				RXLen = 0;
				memset(&receiveData[0], 0, sizeof(receiveData));
			}
		}
	}
	return;
}

/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void main()
{	
	UsartInit();  //	串口初始化
	while(1)
	{
		Usart_HandleMessage();
	}
}

/*******************************************************************************
* 函数名         : Usart() interrupt 4
* 函数功能		  : 串口通信中断函数
* 输入           : 无
* 输出         	 : 无
*******************************************************************************/
void Usart() interrupt 4
{
	if( RI )
	{
		receiveData[RXLen++]=SBUF;//出去接收到的数据
		RI = 0;//清除接收中断标志位
	}
	
	if( TI )
	{
		TI = 0;
		RS485DIR=0;
	}	
}

你可能感兴趣的:(#,51仿真+实验源码)