//============================================================================ //================翼芯科技 DMX512接收数据===================================== //============================================================================ // 此源码版权属 翼芯科技 全权享有,如欲引用,敬请署名并告知 // 严禁随意用于商业目的,违者必究,后果自负 // // //程序说明:本程序用于实现LDMX512为接收,DMX512信号自动识别,当无DMX512信号时, //执行自检程序(七彩跳变),IC插到U9位置. //文件名称:main.C //日期: 2011/02/20 //版本: 1.0 //============================================================================= #include<stc11f0x.h> #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; //MAX485使能口 sbit Work_LED = P3^3; //LED指示灯 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; DMX_channel=0; 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; // 收到设备信息数据 } } } } |
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |