51单片机串口通信的程序实现与Proteus仿真

一、51单片机的串口通信

关于51单片机串口通信的讲解的博客有很多,这里就不再详细讲解。下面给出程序
1.uart.h

#ifndef __UART__
#define __UART__

typedef unsigned char u8;

void UART_Init();
void UART_Send_Data(u8 byte);
u8 UART_Receive_Data();

#endif

2.uart.c

#include "reg52.h"
#include "uart.h"
//串口初始化,设置波特率为9600,使用定时器1,晶振频率11.0592Mhz
void UART_Init()
{
	//设置波特率9600
	TMOD|=0x20;  //定时器1工作于自动重装载模式
	TH1=0xfd;
	TH0=0xfd;
	TR1=1; //启动定时器1
	ET1=0; //禁止定时器1中断
	PCON&=0x7f; //设置SMOD=0,波特率不加倍
	SCON=0x50; //工作于方式1  8位无校验异步通信的收发模式,并清空收发中断标志位
	EA=1;  //总中断允许
	ES=0;//禁止串口收发中断(本程序中不使用串口中断)
}
void UART_Send_Data(u8 byte)
{
	SBUF=byte;
	while(!TI);//等待串口数据发送完毕
	TI=0;//将发送中断标志位清0,为下次发送数据做准备
}
u8 UART_Receive_Data()
{
	u8 temp;
	while(!RI);//等待串口接收到数据(RI被置1)
	temp=SBUF;
	RI=0;//清空接收中断标志位,为下次接收做准备
	return temp;
}

串口数据收发既可以用中断的方式实现,也可以通过测试SCON寄存器的TI和RI位来实现。在完成一个字节的数据发送时,TI位被硬件置1,且必须由软件清0后才能继续发送下一个字节。而在接收到一个字节的数据后,RI被硬件置1,必须由软件清0后才能继续接收数据。在UART_Receive_Data()中,我们通过一个循环来等待RI位被置1,也就是等待外部设备将数据发送给单片机,一旦接收到了数据,我们就可以把接收到的数据返回。而 UART_Send_Data()也是类似的。

二、串口通信的Proteus仿真

首先编写一个主函数,完成将接收到的数据原样送回的功能,作为我们的测试程序。
main.c

#include "reg52.h"
#include "uart.h"
void main()
{
	u8 i;
	UART_Init();
	while(1)
	{
			UART_Send_Data(UART_Receive_Data());
	}
}

①将编译生成的.HEX文件载入Proteus的单片机中,方法是:双击单片机,在出现的对话框中找到
在这里插入图片描述这一栏
选择生成的.hex文件。
②在刚才的单片机设置的对话框中找到在这里插入图片描述这一栏
将单片机时钟频率设置为11.0592MHz。这一步非常关键,因为上面的程序中使用的是9600的波特率,如果设置成了其他频率(比如常用的12MHz),会使实际的波特率与9600相差较大,超出允许的误差范围,使串口接收到错误的数据,如果你在后续中发现串口收到一堆乱码,很有可能是这一步没有设置。

完成以上两步后,这里介绍两种方式进行串口通信的仿真。

方式1

proteus中提供了Virtual Terminal,它实际上就是一个串口监视器,可以利用它直接向单片机的串口发送数据,也可以接受来自单片机串口的数据。
在左侧模式选择栏选择虚拟仪器模式在这里插入图片描述
选择虚拟终端51单片机串口通信的程序实现与Proteus仿真_第1张图片
与单片机的串口连接。(单片机的TX接虚拟终端的RX,单片机的RX接虚拟仪器的TX)51单片机串口通信的程序实现与Proteus仿真_第2张图片
双击虚拟终端,进行如图设置(与单片机程序中的通信速率、格式一致)
51单片机串口通信的程序实现与Proteus仿真_第3张图片
运行仿真,会弹出一个黑色对话框。(如果没有的话,在菜单栏的DEBUG-Virtual Terminal下可以打开)

输入一个数字1,发现屏幕上出现了一个1。说明确实完成了前面main函数中接收数据并原样返回给的功能。这里你可能要问,屏幕上显示的1不是我输入的1吗?为什么说这里显示的1是单片机的串口在接收到‘1’之后返回的数据呢?因为Virtual Terminal默认是不会将你输入的字符显示在屏幕上的,如果把main函数中while(1)下的内容注释掉再编译后,你会发现无论你键盘上输入什么,Virtual Terminal上都不会显示出来。这就验证了Virtual Terminal默认情况下不会回显你输入的内容。
51单片机串口通信的程序实现与Proteus仿真_第4张图片
可以在虚拟终端的黑色方框内右击鼠标,勾选Echo Typed characters
51单片机串口通信的程序实现与Proteus仿真_第5张图片
此时在虚拟终端中输入一个1,你会发现屏幕上多了两个1。其中一个1是回显你输入的字符,另一个1则是由单片机串口发来的数据。

方式2

对于简单的验证单片机串口通信程序,上面的仿真方法已经足够。如果要模拟单片机与计算机的串口通信,可以用到COMPIM元件。进行如图连接(注意TX接TX,RX接RX)
51单片机串口通信的程序实现与Proteus仿真_第6张图片
COMPIM其实就是一个RS232串口的DB9连接器,用它可以模拟与计算机串口的连接。这个元件自动将单片机的TTL电平转换成了RS232电平,因此不必再用MAX232进行电平转换。(如果串口收到一堆乱码,需要注意是不是用了MAX232芯片,如果用了,去掉MAX232芯片,按上图连接即可解决乱码问题。)双击COMPIM设置其属性如下
51单片机串口通信的程序实现与Proteus仿真_第7张图片
这样就模拟了把单片机通过DB9连接器连接到计算机的COM3的过程。计算机上可能并没有这么多的COM口供我们使用,因此需要用软件虚拟出一对串口,这里用到了Virtual Serial Port软件。
51单片机串口通信的程序实现与Proteus仿真_第8张图片
点击右侧的Add Pair就可以生成一对虚拟的串口,这两个串口是连接在一起的。如果我们使用串口调试助手,打开COM3发送1个字符,再用串口调试助手打开COM4,就会接收到一个同样的字符。这也就证明了通过Virtual Serial Port生成的一对虚拟串口是连接在一起的。(串口调试助手的软件有很多,主要用于查看串口接收到的数据,以及通过串口发送数据。)
这里,我虚拟了COM3口和COM4口。其中COM3口已经与上面的COMPIM连接了。此时打开串口调试助手软件,选择COM4口,如下设置
51单片机串口通信的程序实现与Proteus仿真_第9张图片
在发送窗口输入1,并发送
51单片机串口通信的程序实现与Proteus仿真_第10张图片
此时数据通过与COM4连接的COM3口,传送给了单片机,单片机又将1回送给COM4口,因此串口调试助手的接收窗口也收到一个1,说明成功仿真了上面编写的程序。
在这里插入图片描述

你可能感兴趣的:(51单片机串口通信的程序实现与Proteus仿真)