100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 51单片机串口通信的程序实现与Proteus仿真

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

时间:2022-10-19 21:02:35

相关推荐

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.0592Mhzvoid UART_Init(){//设置波特率9600TMOD|=0x20; //定时器1工作于自动重装载模式TH1=0xfd;TH0=0xfd;TR1=1; //启动定时器1ET1=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,说明成功仿真了上面编写的程序。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。