单片机与组态王的通信实例Word文档格式.docx

上传人:b****7 文档编号:21828827 上传时间:2023-02-01 格式:DOCX 页数:12 大小:310.26KB
下载 相关 举报
单片机与组态王的通信实例Word文档格式.docx_第1页
第1页 / 共12页
单片机与组态王的通信实例Word文档格式.docx_第2页
第2页 / 共12页
单片机与组态王的通信实例Word文档格式.docx_第3页
第3页 / 共12页
单片机与组态王的通信实例Word文档格式.docx_第4页
第4页 / 共12页
单片机与组态王的通信实例Word文档格式.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

单片机与组态王的通信实例Word文档格式.docx

《单片机与组态王的通信实例Word文档格式.docx》由会员分享,可在线阅读,更多相关《单片机与组态王的通信实例Word文档格式.docx(12页珍藏版)》请在冰豆网上搜索。

单片机与组态王的通信实例Word文档格式.docx

(5)组态王置

根据自己屏幕选择演示项目中的一个

找到设备->

DDE,双击“新建...”

选择:

智能模块(上面的图中看不到)->

单片机->

通用单片机ASCII->

串口

起个名字,然后选择串口号,我们选择com4

这一步选择地址,需要为自己的单片机设备确定一个地址,这有点麻烦。

需要看一看地址帮助,这里简单说明一下。

如果在同一个串口上连接多个单片机设备,那么就需要确定究竟与哪一个设备通信,这就需要有个地址,这是上面我取的地址2.0中的2的由来,而小数点后面可取0/1,按kingview的介绍是打包还是不打包。

我还没有理解打包是什么,所以先取0.

现在“设备”下面多出来了com4,并且在右侧多出了一个“我的单片机”的图标,这是我为自己的单片机设备起的名字。

右击该图标,在弹出的快捷菜单中选择“测试我的单片机”,打开对话框。

在这里选择通信参数,为简单起见,我们将校验选为“无”,其他按图上选择,然后单击“设备测试”进入到设备测试页面。

增加一个寄存器,寄存器X后面加个0,数据类型选择“BYTE,SHORT,FLOAT”三者之一。

我们选择BYTE,选择添加。

OK,至此kingview也设置好了。

下面就是编程了。

1.通讯口设置:

通讯方式:

RS-232,RS-485,RS-422均可。

波特率:

由单片机决定(2400,4800,9600and19200bps)。

字节数据格式:

由单片机决定。

起始位

数据位

校验位

停止位

注意:

在组态王中设置的通讯参数如波特率,数据位,停止位,奇偶校验必须与单片机编程中的通讯参数一致

2.在组态王中定义设备地址的格式

格式:

##.#

前面的两个字符是设备地址,范围为0-255,此地址为单片机的地址,由单片机中的程序决定;

后面的一个字符是用户设定是否打包,“0”为不打包、“1”为打包,用户一旦在定义设备时确定了打包,组态王将处理读下位机变量时数据打包的工作。

3.在组态王中定义的寄存器格式

寄存器名称

dd上限

dd下限

数据类型

Xdd

65535

FLOAT/BYTE/UINT

斜体字dd代表数据地址,此地址与单片机的数据地址相对应。

在组态王中定义变量时,一个X寄存器根据所选数据类型(BYTE,UINT,FLOAT)的不同分别占用一个、两个,四个字节,定义不同的数据类型要注意寄存器后面的地址,同一数据区内不可交叉定义不同数据类型的变量。

为提高通讯速度建议用户使用连续的数据区。

3.组态王与单片机通讯的命令格式:

读写格式(除字头、字尾外所有字节均为ASCII码)

字头

设备地址

标志

数据地址

数据字节数

数据…

异或

CR

说明;

字头:

1字节1个ASCII码,40H

设备地址:

1字节2个ASCII码,0—255(即0---0x0ffH)

标志:

1字节2个ASCII码,bit0~bit7,

bit0=0:

读,bit0=1:

写。

bit1=0:

不打包。

bit3bit2=00,数据类型为字节。

bit3bit2=01,数据类型为字。

bit3bit2=1x,数据类型为浮点数。

数据地址:

2字节4个ASCII码,0x0000~0xffff

数据字节数:

1字节2个ASCII码,1—100,实际读写的数据的字节数。

数据…:

为实际的数据转换为ASCII码,个数为字节数乘2。

异或:

异或从设备地址到异或字节前,异或值转换成2个ASCII码

CR:

0x0d。

----------------------------------------------------------

有了这些资料,程序就不难编写了。

先测试一下。

到proteus中,全速运行,这就打开了串口窗口。

在kingview中单击“读取”(见上一篇的最后一个图),可以看到如下字串:

@02E000000176

这个数据字串与地址,数据类型等有关,解读如下:

变量名

类型

数据字节

X0

BYTE

@

02

E0

0000

01

76

X1

02

0001

77

XO

SHORT

A4

0000

75

74

FLOAT

EC

04

00

如果切换成HEX显示,则可以看到字头和字

如:

@02A400010274

HEX显示为:

403032413430303031303237340D

其中取异或的,不包括字头40H,即从30H开始的10个字符,异或算出来后,转换成ASCII码成为其后的2个字符,即0D前的两个字符。

以上面的数字为例,异或算出来为74H,转换成ASCII码为37H和34H。

不多说啦,上一个写好的程序:

#include"

reg52.h"

/*11.0592M

19200bps

*/

typedefunsignedcharuchar;

typedefunsignedintuint;

/*定时器2的波特率:

fosc/32*(65536-(rcap2hrcap2l))

按此,可得波特率是19。

2时,要求65536-(rcap2hrcap2l)=18

即(rcap2hrcap2l)=65518

voidserial_init(){

SCON=0x50;

/*mode1:

8-bitUART,enablereceiver*/

C_T2=0;

/*Timer2runinginTimermode*/

RCLK="

1"

;

TCLK="

RCAP2H=0xff;

RCAP2L=0xee;

TR2=1;

/*enableTimer2run*/

ES=1;

REN="

EA="

SM2=1;

/*SM2=1时收到的第9位为1才置位RI标志*/

}

/*通过串行口发送数据*/

voidUartSend(ucharDat)

{SBUF=Dat;

for(;

{if(TI)

break;

}

TI=0;

}

ucharRecBuf[12];

bitRecOk="

0"

//一次接收工作结束

voidRecive()interrupt4

{

staticbitStartRec="

//如果收到的首个字符是40H,则该值取0

staticucharCount="

//计数器

ucharRecDat;

RecDat=SBUF;

//取得SBUF中的数据

if(!

StartRec)//新的一次接收开始

{

if(RecDat==0x40)//首字符正确

{

StartRec=1;

//开始新的一次接收工作

}

else

RecBuf[Count]=RecDat;

Count++;

if(RecDat==0x0d)

StartRec=0;

//准备下一次接收

Count=0;

//计数器清零

RecOk=1;

//一次接收正确

RI=0;

voidUartSends(ucharBuff[],ucharLen)

{uchari;

for(i=0;

i<

Len;

i++)

{UartSend(Buff[i]);

voidmDelay(uintDelayTim)

uchari;

DelayTim>

0;

DelayTim--)

123;

i++);

ucharSendBuf[10]={0x40,0x30,0x33,0x30,0x31,0x36,0x35,0x30,0x31,0x0d};

voidmain()

ucharRecCount="

ucharSendCount="

ucharxorDat;

ucharcTmp1,cTmp2;

ucharcTmp;

ucharSendDat="

//这个是程序中准备传递给kingview的,可以自行更改。

serial_init();

//定时器,串口初始化

){

if(RecOk)//一次完整的接收

RecOk=0;

//本次接收后的应答处理完毕

xorDat=RecBuf[0];

for(i=1;

10;

i++)

xorDat^=RecBuf[i];

//异或

cTmp1=xorDat&

0xf0;

//取高4位

cTmp1>

>

=4;

//右移4次移到低4位

cTmp1+=0x30;

cTmp2=xorDat&

0x0f;

//取低4位

cTmp2+=0x30;

if((cTmp1==RecBuf[10])&

&

(cTmp2==RecBuf[11]))

{SendBuf[1]=RecBuf[0];

SendBuf[2]=RecBuf[1];

//地址与接收到的地址相同

//SendBuf[3]=SendBuf[4]=//发送的字节数

cTmp=SendDat;

cTmp&

=0xf0;

cTmp>

//右移4位

SendBuf[5]=0x30+cTmp;

=0x0f;

SendBuf[6]=0x30+cTmp;

//发送的值

//////以下计算异或码

xorDat=SendBuf[1];

for(i=2;

7;

xorDat^=SendBuf[i];

SendBuf[7]=cTmp1;

SendBuf[8]=cTmp2;

//做异或运算

UartSends(SendBuf,10);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1