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)。
图1基于485的 DMX512拓扑结构
2.3.DMX512 端口及数据链路
因为是采用485差分信号传输,因此DMX512端口一般采用3针或5针接口,相对应的导线则为1对或2对双绞线,导线同时应采用箔片或编织筛包裹。XLR针口分配如下表1所示,其中辅助数据链路可以不用。
基于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所示
图2中,虚线框内为一个数据帧的格式,S为1个比特起始位(低电平),E为2比特的停止位(高电平),D0~D7为8个比特的控制数据,其电平组合从 00000000~11111111 共有 256 个状态(对应十进制数的0~255) 控制灯光的亮度时 可产生256个亮度等级 00000000 (0)对应灯光最暗 11111111(255)对应灯光最亮。信息包中,第1帧对应第1回路的灯具,第2帧对应第2回路灯具
原理图如下:
//============================================================================
//================ 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; // 收到设备信息数据
}
}
}
}