| 
//============================================================================
×
注册登录后可以在线提问,行业从业者将帮助您解答!您需要 登录 才可以下载或查看,没有账号?请用中文注册用户! 
  //================翼芯科技 DMX512接收数据=====================================
 //============================================================================
 //  此源码版权属 翼芯科技 全权享有,如欲引用,敬请署名并告知
 //          严禁随意用于商业目的,违者必究,后果自负
 //          公司网站 http://www.mcu-led.com
 //          公司论坛 http://www.cpu-led.com
 //          淘宝店:  http://cpu-led.taobao.com/  和  http://mcu-led.taobao.com/
 //          产品咨询 QQ :1322130074   电话:13715619122
 //程序说明:本程序用于实现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=0WM!=255WM++)
 {
 if(R_dat>WM) {R=ON;}
 else                  {R=OFF;}
 if(G_dat>WM) {G=ON;}
 else                  {G=OFF;}
 if(B_dat>WM) {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;    // 收到设备信息数据
 }
 }
 }
 
 
 |