微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > PC与单片机RS-232串口的通讯和控制

PC与单片机RS-232串口的通讯和控制

时间:12-03 来源:互联网 点击:

TI=0;

SBUF=D"; //向SBUF送字符“D”

while(TI==0);

TI=0;

delay(); //调用延时
delay();
}

}

将程序编译生成HEX文件后写入AT89S52。打开我上面用VB6编好那个程序,点击“接收数据”钮。如下图:

它的确按我预想的执行了。只要是节字数据,无论是数值还是字符代友都是可以进行发送的。这是C语言的优点。

另外我们顺便看一下原先用printf函数发送生成HEX和直接写SBUF来成HEX的差别:


上图的提示显示了生成的代码共用了1120个字节。这是用printf函数发送的。

下图是直接写SBUF后的编译提示信息:

哈!直接操作串口缓冲寄存器只用了89个字节。这是直接进行底层操作的优势。

上面的程序发送“A”“B”“C”“D”四个数据,因为没有发送回车符,所以一次次的字符都是连续显示的。我们再修改一下,把要发送的ABCD这四个数据再加两个代表回车的控制字符数据定义到一个字节数组中变量中,再改用循环的方式来发送,程序如下:

#include
#include
void delay(void) //定义一个延时子程序
{
unsigned int i;
for (i=65535;i>0;i--);
}

void main(void)
{
unsigned char buf[ ]={65,66,C,D,13,10}; //定义一个单字节数组最后两个数值13和10是回车符。
unsigned char i;
SCON=0x50; //串口方式1
TMOD=0x20; //定时器1,定时方式为2
PCON=0x80; //设定串口工作方式为1
TCON=0x40; //设定时器1开始计数
TH1=0xfd; //设定波特率为19200
TL1=0xfd; //
//TI=1;
TR1=1; //启动定时器
while(1)
{
for(i=0;i<6;i++)
{
SBUF=buf[i]; //向串口送出数据
while(TI==0);
TI=0;
}
delay(); //调用延时
delay();
}

}

下面是运行结果:


这样就和原先printf函数输出的效果一样了。

从上面程序我们知道了,如果我们想发送测量的数值数据,可以把用A/D模块获得的测量数据赋给buf[ ]数组里的变量,然后就可以进行发送处理了。字符直接用上面的发送方法就行了。

这样第三项工作也完成!(啊!累了,要歇歇,歇歇!

第四步:掌握PC端程序如何接收发送字符和数值型数据。

接下来我们来看看PC端的程序如何正常接收并处理收到的数据。字符没有问题,因为刚才就是显示的字符,但我主要是想看看采用字符方式接收对于0-255范围内那些非字符数值能否正常接收和处理。
打开VB6,调出我们原先编写的程序,在串口控件的属性中有个InputMode属性,如果是0就是以字符方式接收,如果是1就是以二进制方式接收。

原先我们就是用了缺省的字符方式。为了便于分析收到的数据,我们得分别修改一下单片机和PC里的程序,首先不能让单片机不停的发送,而是从PC机先向AT89S52发送一个字符“s”,AT89S52收到并确认是“s”字符后再发送一组数据,发完后停下,等待PC的下次请求。这样我们可以准确和稳定地看到这组数据的情况。

VB程序的修改如下:

我们在Command1+_Click事件的代码里添加了一行MSComm1.Output="s",也就是每当我按下“接收数据”钮时向AT89S52发送了一个"s"字符,然后清空文本框内容,然后启动定时器子程序Timer1每100毫秒检查一次有无收到数据,收到数据便显示出来。

对AT89S52内的程序做修改,程序循环检查有无收到数据,当的RI=1时便有数据收到,确认收到的数据为字符“s”时,便送出数组内数据。修改程序如下:
#include

void delay(void) //定义一个延时子程序
{
unsigned int i;
for (i=65535;i>0;i--);
}

void main(void)
{
unsigned char buf[]={65,66,C,D,E,F};//定义一个单字节数组
unsigned char i;
SCON=0x50; //串口方式1
TMOD=0x20; //定时器1,定时方式为2
PCON=0x80; //设定串口工作方式为1
TCON=0x40; //设定时器1开始计数
TH1=0xfd; //设定波特率为19200
TL1=0xfd; //
//TI=1;
TR1=1; //启动定时器
while(1)
{ if(RI==1) //如果接收到数据则进入以下操作
{if(SBUF==s) //如果收到的数据为“s”字符则进入发送操作
{
   for(i=0;i<6;i++)//循环发送出数组buf[ ]的6个数据
{
SBUF=buf[i]; //向串口送出数据
while(TI==0);
TI=0;
delay(); //调用延时子程序
}
RI=0;//上面的发送操作完毕后将标志RI清0等待PC下次请求
}
}
}
}
编译、生成HEX文件然后将文件写进AT89S52。我们运行VB6编写的Scom1程序。

现在我点击“接收数据”钮后,文本框内一个字符一个字符的依次显示出“ABCDEF”如下图:


当我再次点击“接收数据”钮时,文本框先清空,然后再重复上面的显示。达到我们的要求。PC机每请求一次,单片机就发送一次数据。

接下来我要做的是让文本框里不再显示“ABCDEF”这几个字符,而是

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top