单片机与PC通信-(proteus与虚拟串口驱动软件以及串口调试助手的仿真)

  • 格式:docx
  • 大小:405.58 KB
  • 文档页数:13

下载文档原格式

  / 13
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验:单片机与PC通信

(proteus与虚拟串口驱动软件以及串口调试助手的仿真)

实现内容:

设置单片机串行口为工作方式一,波特率为9600。PC从串口发送字符1、2、3或4到单片机串行口,单片机接收到该字符后,首先在P2口显示字符,然后根据字符不同返回不同字符串,具体要求如下表:

一、proteus仿真图:(此proteus仿真图可免费下载,下载网址:)

1、

图1.1

2、注意:(1)51单片机属性的时钟频率(clock frequency)必为11.0592mhz,否则无法仿真。

请按下图设置AT89SC52

图1.2

3、在仿真图中P1即(元件名称:COMPIN)模块为集成电平转换的串行通信接口(如下图)

(1)

图1.3

(2)设置参数如下

图1.4

在右侧选择端口一:“COM3”端口二:“COM4”,然后按“添加端口”,此时左侧的Virtual ports下出现:

图1.5

表示添加了COM3,COM4一对虚拟串行口,且已连接,故我们把单片机和PC选择COM3和COM4。(如图1.4中的physical port选项:COM4;图中:串口号COM3)。接着再在右侧选择端口一:“COM1”端口二:“COM2”,则为下图,

图1.6

虚拟串口驱动设置完毕

如图1.7

图1.7

6、

(1)将“程序”在Keil软件中编译生成“HEX”文件,加载到仿真图中的AT89C52中,启动仿真

图1.9

(2)按下图1.7中串口调试助手的“连接”按钮,在串口调试助手的”发送窗口”,依次输入1、2、3、4和5,发送后可以看到单片机返回的字符串一次显示在接收窗口。

如下图所示

实验程序

#include

#include

#include

#include

#include

#include

#define byte unsigned char

#define uchar unsigned char

#define word unsigned int

#define uint unsigned int

#define ulong unsigned long

#define BYTE unsigned char

#define WORD unsigned int

#define TRUE 1

#define FALSE 0

void time(unsigned int ucMs);

void initUart(void);

void sendString(uchar *ucString);

void main(void)

{

time(1);

initUart();

IE=0x90;

while(TRUE){}

}

void initUart(void)

{

SCON =0x50; //选择串口工作方式,打开接收允许RCAP2H=(65536-(3456/96))>>8;

RCAP2L=(65536-(3456/96))%256;

T2CON=0x34;

//启动定时器T1

}

void serial0_int(void) interrupt 4

{

uchar rChar;

uchar code str1[]="What do you plan to do this Friday?";

uchar code str2[]="I plan to go to the concert.";

uchar code str3[]="What are you doing next week?";

uchar code str4[]="I'm think of going to my grandma's.";

uchar code strdefault[]="Please select a character '1','2','3'or '4'!";

EA=0;

RI=0;

rChar=SBUF;

P2=rChar;

switch(rChar)

{

case '1':

SBUF='1';while(TI==0) {} TI=0;

SBUF=':';while(TI==0) {} TI=0;

sendString(str1);

break;

case '2':

SBUF='2';while(TI==0) {} TI=0;

SBUF=':';while(TI==0) {} TI=0;

sendString(str2);

break;

case '3':

SBUF='3';while(TI==0) {} TI=0;

SBUF=':';while(TI==0) {} TI=0;

sendString(str3);

break;

case '4':

SBUF='4';while(TI==0) {} TI=0;

SBUF=':';while(TI==0) {} TI=0;

sendString(str4);

break;

default:

SBUF='d';while(TI==0) {} TI=0;

SBUF=':';while(TI==0) {} TI=0;

sendString(strdefault);

break;

}

EA=1;

}

void sendString(uchar *ucString)

{

uchar i,stringLength=strlen(ucString);

REN=0;

for(i=0;i

{

SBUF=ucString[i];while(TI==0); TI=0;

}

SBUF=0x0d;while(TI==0) ; TI=0;

SBUF=0x0a;while(TI==0) ; TI=0;

SBUF=0x0a;while(TI==0) ; TI=0;

REN=1;

}

void delay_5us(void)

{

_nop_() ;

_nop_() ;

}

void delay_50us(void)

{

unsigned char i;

for(i=0;i<4;i++);

{

delay_5us();

}

}

void delay_100us(void)

{