lxqlzj 发表于 2012-2-3 14:46:37

(LED学习板)实验33-DMX512并行通信

//============================================================================
//================翼芯科技 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 uintunsigned int

#define ON1
#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信号标志
ucharcnt;                                                      //

ucharR_dat,G_dat,B_dat ;   //RGB三路数据
uint   DMX_channel;                //DMX三路的起始地址
ucharPWM;


/******************************************************************
- 功能描述:延时函数
- 隶属模块:无
- 函数属性:无
- 参数说明:无         
- 返回说明:无
- 注:.....
******************************************************************/
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的溢出率)/32REN=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;    // 收到设备信息数据
            }
      }
   }
   
页: [1]
查看完整版本: (LED学习板)实验33-DMX512并行通信