单片机交流
直播中

手托初梦

9年用户 804经验值
擅长:可编程逻辑 嵌入式技术
私信 关注
[问答]

如何对51单片机的串口通信进行Proteus仿真?

怎样去编写51单片机的串口通信的程序?
如何对51单片机的串口通信进行proteus仿真

回帖(1)

李晨灵

2021-7-19 12:45:49
一、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.0592Mhzvoid 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,它实际上就是一个串口监视器,可以利用它直接向单片机的串口发送数据,也可以接受来自单片机串口的数据。
在左侧模式选择栏选择虚拟仪器模式

选择虚拟终端

与单片机的串口连接。(单片机的TX接虚拟终端的RX,单片机的RX接虚拟仪器的TX)

双击虚拟终端,进行如图设置(与单片机程序中的通信速率、格式一致)

运行仿真,会弹出一个黑色对话框。(如果没有的话,在菜单栏的DEBUG-Virtual Terminal下可以打开)
输入一个数字1,发现屏幕上出现了一个1。说明确实完成了前面main函数中接收数据并原样返回给的功能。这里你可能要问,屏幕上显示的1不是我输入的1吗?为什么说这里显示的1是单片机的串口在接收到‘1’之后返回的数据呢?因为Virtual Terminal默认是不会将你输入的字符显示在屏幕上的,如果把main函数中while(1)下的内容注释掉再编译后,你会发现无论你键盘上输入什么,Virtual Terminal上都不会显示出来。这就验证了Virtual Terminal默认情况下不会回显你输入的内容。

可以在虚拟终端的黑色方框内右击鼠标,勾选Echo Typed characters

此时在虚拟终端中输入一个1,你会发现屏幕上多了两个1。其中一个1是回显你输入的字符,另一个1则是由单片机串口发来的数据。
方式2
对于简单的验证单片机串口通信程序,上面的仿真方法已经足够。如果要模拟单片机与计算机的串口通信,可以用到COMPIM元件。进行如图连接(注意TX接TX,RX接RX)

COMPIM其实就是一个RS232串口的DB9连接器,用它可以模拟与计算机串口的连接。这个元件自动将单片机的TTL电平转换成了RS232电平,因此不必再用MAX232进行电平转换。(如果串口收到一堆乱码,需要注意是不是用了MAX232芯片,如果用了,去掉MAX232芯片,按上图连接即可解决乱码问题。)双击COMPIM设置其属性如下

这样就模拟了把单片机通过DB9连接器连接到计算机的COM3的过程。计算机上可能并没有这么多的COM口供我们使用,因此需要用软件虚拟出一对串口,这里用到了Virtual Serial Port软件。

点击右侧的Add Pair就可以生成一对虚拟的串口,这两个串口是连接在一起的。如果我们使用串口调试助手,打开COM3发送1个字符,再用串口调试助手打开COM4,就会接收到一个同样的字符。这也就证明了通过Virtual Serial Port生成的一对虚拟串口是连接在一起的。(串口调试助手的软件有很多,主要用于查看串口接收到的数据,以及通过串口发送数据。)
这里,我虚拟了COM3口和COM4口。其中COM3口已经与上面的COMPIM连接了。此时打开串口调试助手软件,选择COM4口,如下设置

在发送窗口输入1,并发送

此时数据通过与COM4连接的COM3口,传送给了单片机,单片机又将1回送给COM4口,因此串口调试助手的接收窗口也收到一个1,说明成功仿真了上面编写的程序。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分