实验6 单片机与PC机间的串行通信

  • 格式:doc
  • 大小:145.00 KB
  • 文档页数:6

实验6 单片机与PC机间的串行通信

一、实验目的

1、掌握电平转换器件RS-232的使用方法;

2、掌握Proteus VSM虚拟终端(VITUAL TERMINAL)的使用;

3、掌握单片机与PC机间的串行通信软硬件设计方法。

二、实验内容

实现利用虚拟终端仿真单片机与PC机间的串行通信。PC机先发送从键盘输入的数据,单片机接收后回发给PC机。单片机同时将收到的30~39H间的数据转换成0~9的数字显示,其他字符的数据直接显示为其ASCII码。

单片机和PC机进行通信时,要求使用的波特率、传送的位数等相同。要能够进行数据传送也必须首先测试双方是否可以可靠通信。可在PC机和单片机上各编制非常短小的程序,具体可分成PC机串行口发送接收程序、单片机串行口发送程序和单片机串行口发送接收程序。这三个程序能运行通过,即可证明串行口工作正常。

PC机串行口发送接收程序设置串行口为波特率9600、8位数据、1位停止位、无奇偶校验的简单设置。从键盘接收的字符可从串行口发送出去,从串行口接收的字符在屏幕上显示。通过让串行口发送线和接收线短接可测试微机串行口,通过让串行口和单片机系统相接,使用此程序可进一步测试单片机的串行通信状况。具体程序用BASIC编制,简单易懂。直接输入即可运行。程序RS232.

三、实验电路原理图

图7-1 单片机与PC机间电路原理图

四、 实验步骤

1、在PROTEUS中画好电路原理图。

2、串口模型属性设置

串口模型属性设置为:波特率―4800;数据位―8;奇偶校验―无;停止位-1,如图7-2所示。

图7-2 串口模型属性设置

3、虚拟终端属性设置

PCT代表计算机发送数据,PCR用来监视PC接收到的数据,它们的属性设置完全一样,如图7-3所示。SCMT和SCMR分别是单片机的数据发送和接收终端,用来监视单片机发送和接收的数据,它们的属性设置也完全一样,如图7-4所示。单片机和PC机双方的波特率、数据位、停止位和检验位等要确保和串口模型的设置一样,并且同单片机程序中串口的设置一致。

图7-3 PC机虚拟终端属性设置

图7-4 单片机虚拟终端属性设置

要注意到PC机虚拟终端与单片机虚拟终端在RX/TX Polarity属性的设置是相反的,因为信号在经过器件MAX232时要反相。

4、将HEX文件写入电路图中的单片机,在Proteus ISIS界面中的PCT虚拟终端上单击右键,在弹出的快捷菜单中选择“Echo Typed Characters”项;

鼠标指针在PCT终端窗口单击,该窗口出现闪烁的光标,从键盘输入数字“8”,在PCS终端窗口中就出现“8”,表明PC机发送数据“8”,按照设计好的程序,单片机将接收到“8”,所以在单片机接收虚拟终端SCMR上会显示“8”,同时又将数字“8”送显到数码管上。接下来,单片机又将该数回发给PC机,因此在单片机发送终端SCMT上也显示“8”,PC机接收到数据后在接收终端PCR上同样显示“8”,结果如图7-5所示。根据程序设计,当在键盘上输入0~9以外的字符时,单片机输出到数码管上显示的则是该字符的ASCII码,如图7-6所示。

图7-5 程序运行结果1

图7-6 程序运行结果2

五、 实验源代码

程序框图:

1、汇编程序:

ORG 30H

START: MOV SP,#60H

MOV SCON,#B ;设定串行方式:

;8位异步,允许接收

MOV TMOD,#20H ;设定计数器1为模式2 ORL PCON,#B ;波特率加倍

MOV TH1,#0F3H ;设定波特率为4800

MOV TL1,#0F3H

SETB TR1 ;计数器1开始计时

AGAIN: JNB RI,$ ;等待接收完成

CLR RI ;清接收标志

MOV A,SBUF ;接收数据送缓冲区

MOV SBUF,A ;发送收到的数据

JNB TI,$ ;等待发送完成

CLR TI ;清发送标志

SJMP AGAIN

END

2、Cx51程序:

#include

#define uchar unsigned char

#define uint unsigned int

void display(uchar b);

main()

{

uchar a;

TMOD=0x20;

TL1=0xf3;

TH1=0xf3;

SCON=0x50;

PCON=0x80;/*设置串行口方式*/

TR1=1;

while(1)

{

while(RI==0){}

RI=0;

a=SBUF;

display(a);

SBUF=a;

while(TI==0)

TI=0;

}

}

void display(uchar b)

{

if((b>=0x30)&(b<=0x39))

{

b=b-0x30;

} P1=b;

}