基于51单片机的知识总结,使用protues和keil共同学习。
我使用的是protues7.8 和 keil4,需要软件的联系我。
源码及protues仿真:https://download.csdn.net/download/sinat_33734313/11853192
串口通信-232
protues电路仿真
仿真元器件
DB9接口:COMPIM
仿真电路以及使用软件截图
硬件说明
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
仿真电路以及使用软件截图
硬件说明
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;
}
}