单片机与PC通信proteus与虚拟串口驱动软件以及串口.docx
《单片机与PC通信proteus与虚拟串口驱动软件以及串口.docx》由会员分享,可在线阅读,更多相关《单片机与PC通信proteus与虚拟串口驱动软件以及串口.docx(10页珍藏版)》请在冰豆网上搜索。
单片机与PC通信proteus与虚拟串口驱动软件以及串口
实验:
单片机与PC通信
(proteus与虚拟串口驱动软件以及串口调试助手的仿真)
实现内容:
设置单片机串行口为工作方式一,波特率为9600。
PC从串口发送字符1、2、3或4到单片机串行口,单片机接收到该字符后,首先在P2口显示字符,然后根据字符不同返回不同字符串,具体要求如下表:
表:
单片机与PC通信内容
PC发送字符
单片机返回
1
1:
WhatdoyouplantodothisFriday?
2
2:
Iplantogototheconcert.
3
3:
Whatareyoudoingnextweek?
4
4:
I'mthinkofgoingtomygrandma's.
其他字符
5:
Pleaseselectacharacter'1','2','3'or'4'!
一、proteus仿真图:
(此proteus仿真图可免费下载,下载网址:
)
1、
图1.1
2、注意:
(151单片机属性的时钟频率(clockfrequency)必为11.0592mhz,否则无法仿真。
请按下图设置AT89SC52
图1.2
3、在仿真图中P1即(元件名称:
COMPIN)模块为集成电平转换的串行通信接口(如下图)
(1)
图1.3
(2)设置参数如下
图1.4
4、虚拟串口驱动设置
在右侧选择端口一:
“COM3”端口二:
“COM4”,然后按“添加端口”,
此时左侧的Virtualports下出现:
图1.5
表示添加了COM3,COM4一对虚拟串行口,且已连接,故我们把单片机和PC选择COM3和COM4。
(如图1.4中的physicalport选项:
COM4;图中:
串口号COM3)。
接着再在右侧选择端口一:
“COM1”端口二:
“COM2”,则为下图,
图1.6
虚拟串口驱动设置完毕
5、串口调试助手设置
如图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
#definebyteunsignedchar
#defineucharunsignedchar
#definewordunsignedint
#defineuintunsignedint
#defineulongunsignedlong
#defineBYTEunsignedchar
#defineWORDunsignedint
#defineTRUE1
#defineFALSE0
voidtime(unsignedintucMs;
voidinitUart(void;
voidsendString(uchar*ucString;
voidmain(void
{
time(1;
initUart(;
IE=0x90;
while(TRUE{}
}
voidinitUart(void
{
SCON=0x50;//选择串口工作方式,打开接收允许
RCAP2H=(65536-(3456/96>>8;
RCAP2L=(65536-(3456/96%256;
T2CON=0x34;
//启动定时器T1
}
voidserial0_int(voidinterrupt4
{
ucharrChar;
ucharcodestr1[]="WhatdoyouplantodothisFriday?
";
ucharcodestr2[]="Iplantogototheconcert.";
ucharcodestr3[]="Whatareyoudoingnextweek?
";
ucharcodestr4[]="I'mthinkofgoingtomygrandma's.";
ucharcodestrdefault[]="Pleaseselectacharacter'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;
}
voidsendString(uchar*ucString
{
uchari,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;
}
voiddelay_5us(void
{
_nop_(;
_nop_(;
}
voiddelay_50us(void
{
unsignedchari;
for(i=0;i<4;i++;
{
delay_5us(;
}
}
voiddelay_100us(void
{
delay_50us(;
delay_50us(;
}
voidtime(unsignedintucMs
{
unsignedcharj;
while(ucMs>0
{
for(j=0;j<10;j++;
delay_100us(;
ucMs--;
}
}