资源描述
. .
实验 单片机与PC机串口通信(C51编程)实验
要求:
1、 掌握串行口的控制与状态寄存器SCON
2、 掌握特殊功能寄存器PCON
3、 掌握串行口的工作方式及其设置
4、 掌握串行口的波特率(bond rate)选择
任务:
1、实现PC机发送一个字符给单片机,单片机接收到后即在个位、十位数码管上进行显示,同时将其回发给PC机。要求:单片机收到PC机发来的信号后用串口中断方式处理,而单片机回发给PC机时用查询方式。
采用软件仿真的方式完成,用串口调试助手和KEIL C,或串口调试助手和PROTEUS分别仿真。
需要用到以下软件:KEIL,VSPD XP5(virtual serial ports driver xp5.1虚拟串口软件),串口调试助手,Proteus。
(1)虚拟串口软件、串口调试助手和KEIL C的联调
首先在KEIL里编译写好的程序。
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code SEG7[10]={0X3F,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管位值
uchar code ACT[4]={0XFE,0xfd,0xfb,0xf7};%数码管位选信号
uchar code as[]="Receving data:\0";%回送预置数据
uchar a=0x30,b;
//initiate,串口设置为波特率9600,
void init(void){
TMOD=0X20;
TH1=0XFD;
TL1=0XFD;
SCON=0X50;
TR1=1;
ES=1;
EA=1;
}
//DELAY,为数据管交替显示
void delay(uint k){
uint data i,j;
for(i=0;i<k;i++){
for(j=0;j<121;j++)
{;}
}
}
//main
void main(void){
uchar i;
init();
while(1){ //用数码管显示PC发给单片机的数据,并回送给PC
P1=SEG7[(a-0x30)/10];
P2=ACT[1];
delay(500);
P1=SEG7[(a-0x30)%10];
P2=ACT[0];
delay(500);
if(RI){
RI=0;
i=0;
while(as[i]!='\0'){
SBUF=as[i];
while(!TI){
;
}
TI=0;
i++;
}
SBUF=b;
while(!TI){
;
}
TI=0;
EA=1;
}
}
}
//INTERRUPT 4,将收到的信息进行转存
void serial_serve(void) interrupt 4
{
a=SBUF;
b=a;
EA=0;
}
打开VSPD,界面如下图所示:(注明:这个软件用来进行串口的虚拟实现。在其上可以下载,但使用期为2周)。
左边栏最上面的是电脑自带的物理串口。点右边的add pair,可以添加成对的串口。一对串口已经虚拟互联了,如果添加的是3、4,用3发送数据,4就可以接收数据,反过来也可以。
接下来的一步很关键。把KEIL和虚拟出来的串口绑定。现在把3和KEIL绑定。在KEIL中进入DEBUG模式。在最下面的MAND命令行,输入
mode 3 9600,0,8,1 %分别设置3的波特率、奇偶校验位、数据位、停止位
assign 3 <sin> sout%把单片机的串口和3绑定到一起。因为所用的单片机是
%AT89C51,只有一个串口,所以用SIN,SOUT,如果单片机有
%几个串口,可以选择S0OIN,S0OUT,S1IN,S1OUT。
(以上参数设置注意要和所编程序中设置一致!)
打开串口调试助手
可以看到虚拟出来的串口3、4,选择4,设置为波特率9600,无校验位、8位数据位,1位停止位(和3、程序里的设置一样)。打开4。
现在就可以开始调试串口发送接收程序了。可以通过KEIL发送数据,在串口调试助手中就可以显示出来。也可以通过串口调试助手发送数据,在KEIL中接收。
实验实现PC机发送一个字符给单片机,单片机接收到后将其回发给PC机。在调试助手上(模拟PC)发送数据,单片机收到后将收到的结果回送到调试助手上。
2、以下在Proteus和串口调试助手实现的结果:
将编译好的HEX程序加载到Proteus中,注意这里需要加上串口模块,用来进行串行通信参数的设置。
点击串口,可以对串口进行设置:
用串口调试助手发送数据,即可看到仿真结果。
实验参考程序源文件在exp2-m文件夹中。
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit duan=P2^2;
sbit wei=P2^3;
uchar code SEG7[10]={0X3F,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管位值
uchar code ACT[4]={0XFE,0xfd,0xfb,0xf7};//%数码管位选信号
uchar code as[]="Receving data:\0";//%回送预置数据
uchar a=0x30,b;
//initiate,串口设置为波特率9600,
void init(void){
TMOD=0X20;
TH1=0XFD;
TL1=0XFD;
SCON=0X50;
TR1=1;
ES=1;
EA=1;
}
//DELAY,为数据管交替显示
void delay(uint k){
uint data i,j;
for(i=0;i<k;i++){
for(j=0;j<121;j++)
{;}
}
}
//main
void main(void){
uchar i;
init();
while(1){//用数码管显示PC发给单片机的数据,并回送给PC
P1=0;
duan=1;
duan=0;
P1=ACT[1];
wei=1;
wei=0;
P1=SEG7[(a)/10];
duan=1;
duan=0;
delay(2);
P1=0;
duan=1;
duan=0;
P1=ACT[0];
wei=1;
wei=0;
P1=SEG7[(a)%10];
duan=1;
duan=0;
P1=0;
delay(2);
if(RI){
RI=0;
i=0;
while(as[i]!='\0'){
SBUF=as[i];
while(!TI){
;
}
TI=0;
i++;
}
SBUF=b;
while(!TI){
;
}
TI=0;
EA=1;
}
}
}
//INTERRUPT 4,将收到的信息进行转存
void serial_serve(void) interrupt 4
{
a=SBUF;
b=a;
EA=0;
}
. .word..
展开阅读全文