组态王与单片机通信实例.doc
文本预览下载声明
*?组态协议: 字头 设备地址 标志 数据地址 数据字节数 数据… 异或 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码* //如得0x4b,对应Ascll为0x34和0x42.*?CR:0x0d。*///////////?读格式为:字头?设备地址?标志 数据地址?数据字节数 异或?CR //?写格式:?字头?设备地址?标志?数据地址 数据字节数 数据… 异或?CR#include?reg52.h#define??uchar?unsigned?char#define??CTH0???0xfe#define??CTL0???0x0csbit?led1=P2^7;//定义LED.sbit?led2=P2^6;sbit?led3=P2^5;sbit?led4=P2^4;//unsigned?char?i10=0;??//收数据标//unsigned?int?j=0;?? //动态显示数据用unsigned?char?i=0; ? //动态显示用 int??j=0; ////调试用unsigned?char?k=0; ////调试用1~100. //unsigned?char?k4=0; //K4为发送的数据?;K6为组态下传数据标志。k6=0;int?k2=0; //接收死机保护。uchar??duan_tabled[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//需要显示的段选码char?pp1[22]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a}; ?//接收上位机读写暂存char?pp2[10]={0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d};??//数据发送暂存uchar?pp3[8]={0x40,0x00,0x00,0x2a,0x2a,0x00,0x00,0x0d}?;?//uchar?pp4[8]={0x40,0x00,0x00,0x23,0x23,0x37,0x36,0x0d}?;?//delay(unsigned?int?i)??//延时子程序。{unsigned?int?j=0;for(;j=i;j++);;;}?void?Init() ??//初始化{ // TMOD=0x01;???TMOD=0X21; //设置T1为方式2?????? TH0=CTH0;??????????????????????????????????????????????????//1MS??? TL0=CTL0;??? ET0=1;??? TR0=1;EX0=1;IT0=1;TH1=0Xfd; //设置波特率为9600TL1=0Xdf;SCON=0X50; //设置串口位方式1PCON=0X00;// SPCTL=0x4d;TR1=1; ?? //定时器1开始计数ES=1;??EA=1;}void??timer0()?interrupt?1?//显示中断;前两位调试用,???//第三位显示——接收上位机读写暂存——的第几位.{ ???//第四位显示对比。TH0=CTH0;TL0=CTL0;i++;???if(i==5){ ? ?P0=duan_tabled[pp1[21]%10];?//第二位?显示上面传下来的数据的个位?P1=0xfd;}if(i==10){ ? P0=duan_tabled[pp1[21]/10];// ?
显示全部