DMX512解码程序不能识别地址编码器,请高手看看哪里的问题//程序说明:本程序用于实现LDMX512为接收,DMX512信号自动识别,当无DMX512信号时,
//执行自检程序(七彩跳变)
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define ON 1
#define OFF 0
sbit R = P1^0 ;
sbit G = P3^7 ;
sbit Y = P3^4 ;
sbit COM=P3^0 ;
sbit EN_485= P1^7;//MAX485使能口
sbit Work_LED = P1^6;//LED指示灯
sbit DX= 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 { 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; Work_LED=0; Delay(10);break;
case 2: G=ON; R=Y=OFF; Work_LED=1;Delay(10);break;
case 3: Y=ON; G=R=OFF; Work_LED=0;Delay(10);break;
case 4: R=G=ON; Y=OFF; Work_LED=1; Delay(10);break;
case 5: G=Y=ON; R=OFF; Work_LED=0;Delay(10);break;
case 6: Y=R=ON; G=OFF; Work_LED=1;(10);break;
case 7: Y=ON; G=R=ON; Work_LED=0;Delay(10);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=0X00; //不倍频,晶振24M
AUXR|=0X40; //T1工作在1T模式*12
TMOD=0X20; //T1工作于8位自动重装模式
TH1 =0XFD; //波特率20833*12=250K
TL1 =0XFD;
TR1=1; //开定时器1
IP=1; //设置串口中断为最高优先级
ES=1; //开UART中断
EA=1; //开总中断
/*WDT_CONTR= 0x3d; *///狗 分频? 16M?? 0.67s
cnt=3; //3通道
EN_485=0; //MAX485收发选择 EN_485=1发, EN_485=0收
P1M1=0X00; //P1口设为推挽输出
P1M0=0XFF;
P3M1=0X00; //P3口设为推挽输出 7为普通IO
P3M0=0XFF;
//==================?
COM=0;
P1=0;
Work_LED=0;
R=G=Y=ON;
Delay(10);
Work_LED=1;
while(1)
{
DMX512_ok=0;
DMX_channel=145;
//WDT_CONTR= 0x3d;
RGB();
if(!DMX512_ok)
IP=1;
{
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 = 1; start_ok = 0; cnt=3; Head_ok=0; }
}
if(Address == DMX_channel+1 ) //G 地址比较
{
G_dat = SBUF; //取出数据
cnt--;
if(!cnt) { Address = 1; start_ok = 0; cnt=3; Head_ok=0; }
}
if( Address == DMX_channel+2 ) //G 地址比较
{
B_dat = SBUF; //取出数据
cnt--;
if(!cnt) { Address = 1; start_ok = 0; cnt=3; Head_ok=0; }
}
if(++Address>=512) // 地址溢出
{
Address = 1; start_ok = 0; cnt=3; Head_ok=0; //到此512个比较完
}
}
else
{
if(!RB8) //判断收到的第九位数据,只有在DMX送出>88us低电平的中断信号时(也叫同步码,起始码,),RB8才会为0
{
start_ok=1; //收到起始位
Address=1; //0-255共256个通道
}
else if(start_ok)
{
Head_ok=1; // 收到设备信息数据
}
}
}
}