单片机与PC通信-(proteus与虚拟串口驱动软件以及串口调试助手的仿真)
- 格式:docx
- 大小:405.58 KB
- 文档页数:13
实验:单片机与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) {