快捷搜索:  汽车  科技

51单片机独立按键控制led灯亮度(利用51单片机实现DMX512协议控制LED灯)

51单片机独立按键控制led灯亮度(利用51单片机实现DMX512协议控制LED灯)接收端:A比B高200mv以上即认为是逻辑“1”;逻辑“0”以两线间压差为-(2~6)V表示;2.1.电气特性DMX512采用EIA-485标准。发送端:逻辑“1”以两线间压差 (2~6)V表示;

DMX512协议

1.协议简介

DMX是Digital MultipleX的缩写 意为多路数字传输。DMX512 控制协议是美国舞台灯光协会(USITT)于1990年发布的灯光控制器与灯具设备进行数据传输的工业标准 全称是 USITT DMX512(1990) 包括电气特性、 数据协议、 数据格式等方面的内容。

2.电气特性和物理层

2.1.电气特性

DMX512采用EIA-485标准。

发送端:逻辑“1”以两线间压差 (2~6)V表示;

逻辑“0”以两线间压差为-(2~6)V表示;

接收端:A比B高200mv以上即认为是逻辑“1”;

A比B低200mv以上即认为是逻辑“0”。

2.2.拓扑结构

如图1所示为EIA-485电路拓扑结构,一条EIA-485数据链路包括一个差分线驱动设备(D)和多个差分接收终端(R)。

51单片机独立按键控制led灯亮度(利用51单片机实现DMX512协议控制LED灯)(1)

图1基于485的 DMX512拓扑结构

2.3.DMX512 端口及数据链路

因为是采用485差分信号传输,因此DMX512端口一般采用3针或5针接口,相对应的导线则为1对或2对双绞线,导线同时应采用箔片或编织筛包裹。XLR针口分配如下表1所示,其中辅助数据链路可以不用。

51单片机独立按键控制led灯亮度(利用51单片机实现DMX512协议控制LED灯)(2)

基于EIA-485传输距离理论上可以达到1200m,建议控制在800m以内,若要加长传输距离,则需考虑中继器。DMX512数据链路的终接方式应消除信号环路和信号反射,否则可能导致正确设计的系统出现误操作。采用结终端电阻的方式可以消除信号反射,DMX512标准要求,终端电阻应放置在数据 和数据-信号针之间,阻抗范围120Ω 5%~120Ω-10%。

3.数据协议格式及传输

DMX512 协议规定数据以数据包的形式通过异步通讯的方式进行传输。每个数据包由若干数据帧组成 每帧数据包括1 位低电平起始位、8 位数据位和2 位高电平停止位。DMX512协议要求数据传输的波特率为250kbps 亦即每位的传输时间为4us 每帧数据的传输时间为44us 它支持多达512 帧数据传输 每帧数据与相应的控制支路相对应。

数据包的传送要符合一定的格式和时序要求,每个包需要发送2~513个字节数据(由总线设备来确定)。为了使接收器能够分辨出第一帧数据 每一个数据包以一个不短于88us 的低电平信号为起始信号 即所谓的BREAK信号 接收器接收到BREAK信号就准备接收随后而来的数据帧; 紧接着BREAK信号之后是不短于8us 的高电平信号MAB (Mark after Break) ; 之后就是数据帧。在DMX512协议中 MAB之后的第一帧数据被称为SC(Start code) 即起始字节,在协议中规定其为零 但在实际应用中可以由生产厂家自己确定其具体的值 以传递特殊消息。SC标明其后面的数据是8位控制信号数据帧。

一个数据包发送完成后,可以发送MT BP。MT BP (Mark Time Between Packets)标志着一个完整的信息包发送完毕 是下一个信息包即将开始的 “空闲位” 高电平有效数据帧之间可以有时间间隔 也可以没有; 同样 数据包之间可以有时间间隔 也可以没有。DMX512协议规定BREAK信号、MAB信号的最短时间 并规定BREAK信号、MAB信号、数据帧之间及数据包之间的时间间隔的最大值不得超过1s 否则做出错处理 但是DMX512 协议并未对出错处理做任何规定。DMX512协议所规定的数据格式如图2所示,各信号的定时时间如表2所示


51单片机独立按键控制led灯亮度(利用51单片机实现DMX512协议控制LED灯)(3)

图2中,虚线框内为一个数据帧的格式,S为1个比特起始位(低电平),E为2比特的停止位(高电平),D0~D7为8个比特的控制数据,其电平组合从 00000000~11111111 共有 256 个状态(对应十进制数的0~255) 控制灯光的亮度时 可产生256个亮度等级 00000000 (0)对应灯光最暗 11111111(255)对应灯光最亮。信息包中,第1帧对应第1回路的灯具,第2帧对应第2回路灯具

原理图如下:

51单片机独立按键控制led灯亮度(利用51单片机实现DMX512协议控制LED灯)(4)

//============================================================================ //================ DMX512接收数据===================================== //============================================================================ #include #define uchar unsigned char #define uint unsigned int #define ON 1 #define OFF 0 sbit R = P1^7 ; sbit G = P1^6 ; sbit Y = P1^5 ; sbit COM = P3^7 ; sbit EN_485 = P3^4; sbit Work_LED = P3^3; sbit TXD = P3^1; uint Address; // Set_R Set_G Set_B ; //3路 接收和设置地址 bit start_ok Head_ok; bit DMX512_ok; //DMX512信号标志 uchar cnt; // uchar R_dat G_dat B_dat ; //RGB三路数据 uint DMX_channel; //DMX三路的起始地址 uchar PWM; /****************************************************************** - 功能描述:延时函数 - 隶属模块:无 - 函数属性:无 - 参数说明:无 - 返回说明:无 - 注:..... ******************************************************************/ void Delay(uint ms) { uint a b; for(a=ms;a!=0;a--) for(b=1210;b!=0;b--) ; WDT_CONTR= 0x3d; } /****************************************************************** - 功能描述:PWM扫描 - 隶属模块:无 - 函数属性:无 - 参数说明:无 - 返回说明:无 - 注:..... ******************************************************************/ void RGB(void) { uchar x; for(x=255;x!=0;x--) for(PWM=0;PWM!=255;PWM ) { if(R_dat>PWM) {R=ON;} else {R=OFF;} if(G_dat>PWM) {G=ON;} else {G=OFF;} if(B_dat>PWM) {Y=ON;} else {Y=OFF;} } } /****************************************************************** - 功能描述:七彩跳变函数 - 隶属模块:无 - 函数属性:无 - 参数说明:无 - 返回说明:无 - 注:..... ******************************************************************/ void Tianbian(void) { uchar x=1 y; do { switch(x) { case 1: R=ON; G=Y=OFF; Delay(5); break; case 2: G=ON; R=Y=OFF; Delay(5); break; case 3: Y=ON; G=R=OFF; Delay(5); break; case 4: R=OFF; G=Y=ON; Delay(5); break; case 5: G=OFF; R=Y=ON; Delay(5); break; case 6: Y=OFF; G=R=ON; Delay(5); break; case 7: Y=ON; G=R=ON; Delay(5); break; default: x=1; break; } if(y >100) {y=0;x ;} }while(!DMX512_ok); } /****************************************************************** - 功能描述:主函数 - 隶属模块:无 - 函数属性:无 - 参数说明:无 - 返回说明:无 - 注:..... ******************************************************************/ void main(void) { SCON=0xD0; //UART工作于方式3 波特率为(1 SMOD)·(定时器1的溢出率)/32 REN=1接收允许 PCON=0x0; //不倍频 晶振24M AUXR|=0X40; //T1工作在1T模式*12 TMOD=0x20; //T1工作于8位自动重装模式 TH1 =0xFD; //波特率20833*12=250K TL1 =0xFD; TR1=1; //开定时器1 PS=1; //设置串口中断为最高优先级 ES=1; //开UART中断 EA=1; //开总中断 WDT_CONTR= 0x3d; //开看门狗 64分频 16M 0.67s cnt=3; //3通道 EN_485=0; //MAX485收发选择 EN_485=1发 EN_485=0收 /**************************************************************/ P1M1=0X00; //P1口设为推挽输出 P1M0=0XFF; P3M1=0X00; //P3口设为推挽输出 P3.7为普通IO P3M0=0XFE; /**************************************************************/ COM=0; P1=0; Work_LED=0; R=G=Y=OFF; Delay(10); while(1) { DMX512_ok=0; //DMX512信号标志 DMX_channel=0; //DMX三路的起始地址 WDT_CONTR= 0x3d; RGB(); if(!DMX512_ok) { Tianbian(); //无信号 } } } /****************************************************************** - 功能描述:串口中断函数 实现DMX512数据接收 - 隶属模块:无 - 函数属性:无 - 参数说明:无 - 返回说明:无 - 注:..... ******************************************************************/ void Rec(void) interrupt 4 { if(RI==1) { RI=0; if(Head_ok) //收到头码就可以收数据码 { DMX512_ok=1; if( Address == DMX_channel ) //R 地址比较 { R_dat = SBUF; //取出数据 cnt--; if(!cnt) { Address = 0; start_ok = 0; cnt=3; Head_ok=0; } } /**************************************************************/ if(Address == DMX_channel 1 ) //G 地址比较 { G_dat = SBUF; //取出数据 cnt--; if(!cnt) { Address = 0; start_ok = 0; cnt=3; Head_ok=0; } } /**************************************************************/ if( Address == DMX_channel 2 ) //G 地址比较 { B_dat = SBUF; //取出数据 cnt--; if(!cnt) { Address = 0; start_ok = 0; cnt=3; Head_ok=0; } } /**************************************************************/ if( Address>=512) // 地址溢出 { Address = 0; start_ok = 0; cnt=3; Head_ok=0; //到此512个比较完 } } else { if(!RB8)// //判断收到的第九位数据,只有在DMX送出>88us低电平的中断信号时(也叫同步码,起始码,),RB8才会为0 { start_ok=1; //收到起始位 Address=0; //0-255共256个通道 } else if(start_ok) { Head_ok=1; // 收到设备信息数据 } } } }

猜您喜欢: