DMX512协议 1。协议简介 DMX是DigitalMultipleX的缩写,意为多路数字传输。DMX512控制协议是美国舞台灯光协会(USITT)于1990年发布的灯光控制器与灯具设备进行数据传输的工业标准,全称是USITTDMX512(1990),包括电气特性、数据协议、数据格式等方面的内容。 2。电气特性和物理层 2。1。电气特性 DMX512采用EIA485标准。 发送端:逻辑1以两线间压差(26)V表示; 逻辑0以两线间压差为(26)V表示; 接收端:A比B高200mv以上即认为是逻辑1; A比B低200mv以上即认为是逻辑0。 2。2。拓扑结构 如图1所示为EIA485电路拓扑结构,一条EIA485数据链路包括一个差分线驱动设备(D)和多个差分接收终端(R)。 图1基于485的DMX512拓扑结构 2。3。DMX512端口及数据链路 因为是采用485差分信号传输,因此DMX512端口一般采用3针或5针接口,相对应的导线则为1对或2对双绞线,导线同时应采用箔片或编织筛包裹。XLR针口分配如下表1所示,其中辅助数据链路可以不用。 基于EIA485传输距离理论上可以达到1200m,建议控制在800m以内,若要加长传输距离,则需考虑中继器。DMX512数据链路的终接方式应消除信号环路和信号反射,否则可能导致正确设计的系统出现误操作。采用结终端电阻的方式可以消除信号反射,DMX512标准要求,终端电阻应放置在数据和数据信号针之间,阻抗范围120512010。 3。数据协议格式及传输 DMX512协议规定数据以数据包的形式通过异步通讯的方式进行传输。每个数据包由若干数据帧组成,每帧数据包括1位低电平起始位、8位数据位和2位高电平停止位。DMX512协议要求数据传输的波特率为250kbps,亦即每位的传输时间为4us,每帧数据的传输时间为44us,它支持多达512帧数据传输,每帧数据与相应的控制支路相对应。 数据包的传送要符合一定的格式和时序要求,每个包需要发送2513个字节数据(由总线设备来确定)。为了使接收器能够分辨出第一帧数据,每一个数据包以一个不短于88us的低电平信号为起始信号,即所谓的BREAK信号,接收器接收到BREAK信号就准备接收随后而来的数据帧;紧接着BREAK信号之后是不短于8us的高电平信号MAB(MarkafterBreak);之后就是数据帧。在DMX512协议中,MAB之后的第一帧数据被称为SC(Startcode),即起始字节,在协议中规定其为零,但在实际应用中可以由生产厂家自己确定其具体的值,以传递特殊消息。SC标明其后面的数据是8位控制信号数据帧。 一个数据包发送完成后,可以发送MTBP。MTBP(MarkTimeBetweenPackets)标志着一个完整的信息包发送完毕,是下一个信息包即将开始的空闲位,高电平有效数据帧之间可以有时间间隔,也可以没有;同样,数据包之间可以有时间间隔,也可以没有。DMX512协议规定BREAK信号、MAB信号的最短时间,并规定BREAK信号、MAB信号、数据帧之间及数据包之间的时间间隔的最大值不得超过1s,否则做出错处理,但是DMX512协议并未对出错处理做任何规定。DMX512协议所规定的数据格式如图2所示,各信号的定时时间如表2所示 图2中,虚线框内为一个数据帧的格式,S为1个比特起始位(低电平),E为2比特的停止位(高电平),D0D7为8个比特的控制数据,其电平组合从0000000011111111共有256个状态(对应十进制数的0255),控制灯光的亮度时,可产生256个亮度等级,00000000(0)对应灯光最暗,11111111(255)对应灯光最亮。信息包中,第1帧对应第1回路的灯具,第2帧对应第2回路灯具 原理图如下: DMX512接收数据includedefineucharunsignedchardefineuintunsignedintdefineON1defineOFF0sbitRP17;sbitGP16;sbitYP15;sbitCOMP37;sbitEN485P34;sbitWorkLEDP33;sbitTXDP31;uintAddress;SetR,SetG,SetB;3路接收和设置地址bitstartok,Headok;bitDMX512ok;DMX512信号标志ucharcnt;ucharRdat,Gdat,Bdat;RGB三路数据uintDMXchannel;DMX三路的起始地址ucharPWM;功能描述:延时函数隶属模块:无函数属性:无参数说明:无返回说明:无注:。。。。。voidDelay(uintms){uinta,b;for(ams;a!0;a)for(b1210;b!0;b);WDTCONTR0x3d;}功能描述:PWM扫描隶属模块:无函数属性:无参数说明:无返回说明:无注:。。。。。voidRGB(void){ucharx;for(x255;x!0;x)for(PWM0;PWM!255;PWM){if(RdatPWM){RON;}else{ROFF;}if(GdatPWM){GON;}else{GOFF;}if(BdatPWM){YON;}else{YOFF;}}}功能描述:七彩跳变函数隶属模块:无函数属性:无参数说明:无返回说明:无注:。。。。。voidTianbian(void){ucharx1,y;do{switch(x){case1:RON;GYOFF;Delay(5);break;case2:GON;RYOFF;Delay(5);break;case3:YON;GROFF;Delay(5);break;case4:ROFF;GYON;Delay(5);break;case5:GOFF;RYON;Delay(5);break;case6:YOFF;GRON;Delay(5);break;case7:YON;GRON;Delay(5);break;default:x1;break;}if(y100){y0;x;}}while(!DMX512ok);}功能描述:主函数隶属模块:无函数属性:无参数说明:无返回说明:无注:。。。。。voidmain(void){SCON0xD0;UART工作于方式3波特率为(1SMOD)(定时器1的溢出率)32REN1接收允许PCON0x0;不倍频,晶振24MAUXR0X40;T1工作在1T模式12TMOD0x20;T1工作于8位自动重装模式TH10xFD;波特率2083312250KTL10xFD;TR11;开定时器1PS1;设置串口中断为最高优先级ES1;开UART中断EA1;开总中断WDTCONTR0x3d;开看门狗64分频16M0。67scnt3;3通道EN4850;MAX485收发选择EN4851发,EN4850收P1M10X00;P1口设为推挽输出P1M00XFF;P3M10X00;P3口设为推挽输出P3。7为普通IOP3M00XFE;COM0;P10;WorkLED0;RGYOFF;Delay(10);while(1){DMX512ok0;DMX512信号标志DMXchannel0;DMX三路的起始地址WDTCONTR0x3d;RGB();if(!DMX512ok){Tianbian();无信号}}}功能描述:串口中断函数,实现DMX512数据接收隶属模块:无函数属性:无参数说明:无返回说明:无注:。。。。。voidRec(void)interrupt4{if(RI1){RI0;if(Headok)收到头码就可以收数据码{DMX512ok1;if(AddressDMXchannel)R地址比较{RdatSBUF;取出数据cnt;if(!cnt){Address0;startok0;cnt3;Headok0;}}if(AddressDMXchannel1)G地址比较{GdatSBUF;取出数据cnt;if(!cnt){Address0;startok0;cnt3;Headok0;}}if(AddressDMXchannel2)G地址比较{BdatSBUF;取出数据cnt;if(!cnt){Address0;startok0;cnt3;Headok0;}}if(Address512)地址溢出{Address0;startok0;cnt3;Headok0;到此512个比较完}}else{if(!RB8)判断收到的第九位数据,只有在DMX送出88us低电平的中断信号时(也叫同步码,起始码,),RB8才会为0{startok1;收到起始位Address0;0255共256个通道}elseif(startok){Headok1;收到设备信息数据}}}}