99久久全国免费观看_国产一区二区三区四区五区VM_久久www人成免费看片中文_国产高清在线a视频大全_深夜福利www_日韩一级成人av

  • 回復
  • 收藏
  • 點贊
  • 分享
  • 發(fā)新帖

【原創(chuàng)】高山云教你之四----利用51單片機實現(xiàn)DMX512協(xié)議控制LED燈

利用51單片機實現(xiàn)DMX512協(xié)議控制LED燈

DMX512協(xié)議
1.協(xié)議簡介
DMX是Digital MultipleX的縮寫 ,意為多路數(shù)字傳輸。DMX512 控制協(xié)議是美國舞臺燈光協(xié)會(USITT)于1990年發(fā)布的燈光控制器與燈具設(shè)備進行數(shù)據(jù)傳輸?shù)墓I(yè)標準 ,全稱是 USITT DMX512(1990) ,包括電氣特性、 數(shù)據(jù)協(xié)議、 數(shù)據(jù)格式等方面的內(nèi)容。
2.電氣特性和物理層
2.1.電氣特性
DMX512采用EIA-485標準。
發(fā)送端:邏輯“1”以兩線間壓差+(2~6)V表示;
邏輯“0”以兩線間壓差為-(2~6)V表示;
接收端:A比B高200mv以上即認為是邏輯“1”;
		  A比B低200mv以上即認為是邏輯“0”。

2.2.拓撲結(jié)構(gòu)
如圖1所示為EIA-485電路拓撲結(jié)構(gòu),一條EIA-485數(shù)據(jù)鏈路包括一個差分線驅(qū)動設(shè)備(D)和多個差分接收終端(R)。

1

圖1基于485的 DMX512拓撲結(jié)構(gòu)
2.3.DMX512 端口及數(shù)據(jù)鏈路 因為是采用485差分信號傳輸,因此DMX512端口一般采用3針或5針接口,相對應的導線則為1對或2對雙絞線,導線同時應采用箔片或編織篩包裹。XLR針口分配如下表1所示,其中輔助數(shù)據(jù)鏈路可以不用。

2

基于EIA-485傳輸距離理論上可以達到1200m,建議控制在800m以內(nèi),若要加長傳輸距離,則需考慮中繼器。DMX512數(shù)據(jù)鏈路的終接方式應消除信號環(huán)路和信號反射,否則可能導致正確設(shè)計的系統(tǒng)出現(xiàn)誤操作。采用結(jié)終端電阻的方式可以消除信號反射,DMX512標準要求,終端電阻應放置在數(shù)據(jù)+和數(shù)據(jù)-信號針之間,阻抗范圍120Ω+5%~120Ω-10%。 3.數(shù)據(jù)協(xié)議格式及傳輸 DMX512 協(xié)議規(guī)定數(shù)據(jù)以數(shù)據(jù)包的形式通過異步通訊的方式進行傳輸。每個數(shù)據(jù)包由若干數(shù)據(jù)幀組成, 每幀數(shù)據(jù)包括1 位低電平起始位、8 位數(shù)據(jù)位和2 位高電平停止位。DMX512協(xié)議要求數(shù)據(jù)傳輸?shù)牟ㄌ芈蕿?50kbps, 亦即每位的傳輸時間為4us, 每幀數(shù)據(jù)的傳輸時間為44us, 它支持多達512 幀數(shù)據(jù)傳輸, 每幀數(shù)據(jù)與相應的控制支路相對應。數(shù)據(jù)包的傳送要符合一定的格式和時序要求,每個包需要發(fā)送2~513個字節(jié)數(shù)據(jù)(由總線設(shè)備來確定)。為了使接收器能夠分辨出第一幀數(shù)據(jù), 每一個數(shù)據(jù)包以一個不短于88us 的低電平信號為起始信號, 即所謂的BREAK信號, 接收器接收到BREAK信號就準備接受隨后而來的數(shù)據(jù)幀; 緊接著BREAK信號之后是不短于8us 的高電平信號MAB (Mark after Break) ; 之后就是數(shù)據(jù)幀。在DMX512協(xié)議中, MAB之后的第一幀數(shù)據(jù)被稱為SC(Start code), 即起始字節(jié),在協(xié)議中規(guī)定其為零, 但在實際應用中可以由生產(chǎn)廠家自己確定其具體的值, 以傳遞特殊消息。SC標明其后面的數(shù)據(jù)是8位控制信號數(shù)據(jù)幀。一個數(shù)據(jù)包發(fā)送完成后,可以發(fā)送MT BP。MT BP (Mark Time Between Packets)標志著一個完整的信息包發(fā)送完畢 ,是下一個信息包即將開始的 “空閑位”,高電平有效數(shù)據(jù)幀之間可以有時間間隔, 也可以沒有; 同樣, 數(shù)據(jù)包之間可以有時間間隔, 也可以沒有。DMX512協(xié)議規(guī)定BREAK信號、MAB信號的最短時間, 并規(guī)定BREAK信號、MAB信號、數(shù)據(jù)幀之間及數(shù)據(jù)包之間的時間間隔的最大值不得超過1s, 否則做出錯處理, 但是DMX512 協(xié)議并未對出錯處理做任何規(guī)定。DMX512協(xié)議所規(guī)定的數(shù)據(jù)格式如圖2所示,各信號的定時時間如表2所示

3

圖2中,虛線框內(nèi)為一個數(shù)據(jù)幀的格式,S為1個比特起始位(低電平),E為2比特的停止位(高電平),D0~D7為8個比特的控制數(shù)據(jù),其電平組合從 00000000~11111111 共有 256 個狀態(tài)(對應十進制數(shù)的0~255) ,控制燈光的亮度時 ,可產(chǎn)生256個亮度等級 ,00000000 (0)對應燈光最暗 ,11111111(255)對應燈光最亮。信息包中,第1幀對應第1回路的燈具,第2幀對應第2回路燈具,依此類推,第512幀對應第512回路燈具,燈具回路的地址在燈具上可設(shè)置。 DMX512協(xié)議是一種基于主從式的協(xié)議,能夠適應一對多的燈光控制系統(tǒng)。

全部回復(31)
正序查看
倒序查看
2014-06-25 15:32
DMX512這個好像就是基于RS485通信協(xié)議的一種方式吧,這種方式只能一點對多點,不過用來控制燈光也完全夠了,因為燈光是不用反饋數(shù)據(jù)的。
0
回復
2014-06-25 15:46
樂工回來啦,新帖果斷支持!~
0
回復
2014-06-25 15:52
@電源網(wǎng)-娜娜姐
樂工回來啦,新帖果斷支持!~
哈哈,回來了,也忙完了,感謝師長!
0
回復
2014-06-25 15:52

原理圖如下:

0
回復
2014-06-26 09:13
//============================================================================
//================         DMX512接收數(shù)據(jù)=====================================
//============================================================================   

#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路 接收和設(shè)置地址
bit    start_ok, Head_ok;
bit    DMX512_ok;                 //DMX512信號標志
uchar  cnt;                                                      //

uchar  R_dat,  G_dat,  B_dat ;     //RGB三路數(shù)據(jù)
uint   DMX_channel;                //DMX三路的起始地址
uchar  PWM;

/******************************************************************
- 功能描述:延時函數(shù)
- 隸屬模塊:無
- 函數(shù)屬性:無
- 參數(shù)說明:無         
- 返回說明:無
- 注:.....
******************************************************************/
void Delay(uint ms)
{ uint a,b;
        for(a=ms;a!=0;a--)
            for(b=1210;b!=0;b--)
                   ;
    WDT_CONTR= 0x3d; 
}

/******************************************************************
- 功能描述:PWM掃描
- 隸屬模塊:無
- 函數(shù)屬性:無
- 參數(shù)說明:無         
- 返回說明:無
- 注:.....
******************************************************************/
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;}
	}                  
}

/******************************************************************
- 功能描述:七彩跳變函數(shù)
- 隸屬模塊:無
- 函數(shù)屬性:無
- 參數(shù)說明:無         
- 返回說明:無
- 注:.....
******************************************************************/
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);
}

/******************************************************************
- 功能描述:主函數(shù)
- 隸屬模塊:無
- 函數(shù)屬性:無
- 參數(shù)說明:無         
- 返回說明:無
- 注:.....
******************************************************************/
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;                  //設(shè)置串口中斷為最高優(yōu)先級
     ES=1;                  //開UART中斷         
     EA=1;                                        //開總中斷

     WDT_CONTR= 0x3d;             //開看門狗         64分頻  16M   0.67s 

     cnt=3;                        //3通道
  
     EN_485=0;                        //MAX485收發(fā)選擇 EN_485=1發(fā), EN_485=0收
	/**************************************************************/	
     P1M1=0X00;                    //P1口設(shè)為推挽輸出
     P1M0=0XFF;
     P3M1=0X00;                    //P3口設(shè)為推挽輸出        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();  //無信號
	}
  }
}

/******************************************************************
- 功能描述:串口中斷函數(shù),實現(xiàn)DMX512數(shù)據(jù)接收
- 隸屬模塊:無
- 函數(shù)屬性:無
- 參數(shù)說明:無         
- 返回說明:無
- 注:.....
******************************************************************/
void Rec(void) interrupt 4             
{ 
	if(RI==1)  
	{ 
		RI=0; 
		if(Head_ok)                            //收到頭碼就可以收數(shù)據(jù)碼
		{
			DMX512_ok=1;
			if( Address == DMX_channel )       //R 地址比較            
			{ 
				R_dat = SBUF;                   //取出數(shù)據(jù) 
				cnt--;
				if(!cnt) 
				{ 
					Address = 0; 
					start_ok = 0; 
					cnt=3; 
					Head_ok=0;   
				}
			} 
	      /**************************************************************/		 
			if(Address == DMX_channel+1 )      //G 地址比較                        
			{ 
				G_dat = SBUF;                  //取出數(shù)據(jù) 
				cnt--;
				if(!cnt) 
				{ 
					Address = 0; 
					start_ok = 0; 
					cnt=3; 
					Head_ok=0;   
				}
			}
		 /**************************************************************/	
			if( Address == DMX_channel+2 )      //G 地址比較                        
			{ 
				B_dat = SBUF;                    //取出數(shù)據(jù) 
				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)//             //判斷收到的第九位數(shù)據(jù),只有在DMX送出>88us低電平的中斷信號時(也叫同步碼,起始碼,),RB8才會為0
			{ 
				start_ok=1;   //收到起始位
				Address=0;    //0-255共256個通道                       
			}
			 
			else if(start_ok)
			{
				Head_ok=1;    // 收到設(shè)備信息數(shù)據(jù)
			}
		}
	} 
} 
 
0
回復
2014-06-26 14:16
@yueyunno1
//============================================================================//================DMX512接收數(shù)據(jù)=====================================//============================================================================#include#defineucharunsignedchar#defineuintunsignedint#defineON1#defineOFF0sbitR=P1^7;sbitG=P1^6;sbitY=P1^5;sbitCOM=P3^7;sbitEN_485=P3^4;sbitWork_LED=P3^3;sbitTXD=P3^1;uintAddress;//Set_R,Set_G,Set_B;//3路接收和設(shè)置地址bitstart_ok,Head_ok;bitDMX512_ok;//DMX512信號標志ucharcnt;//ucharR_dat,G_dat,B_dat;//RGB三路數(shù)據(jù)uintDMX_channel;//DMX三路的起始地址ucharPWM;/******************************************************************-功能描述:延時函數(shù)-隸屬模塊:無-函數(shù)屬性:無-參數(shù)說明:無-返回說明:無-注:.....******************************************************************/voidDelay(uintms){uinta,b;for(a=ms;a!=0;a--)for(b=1210;b!=0;b--);WDT_CONTR=0x3d;}/******************************************************************-功能描述:PWM掃描-隸屬模塊:無-函數(shù)屬性:無-參數(shù)說明:無-返回說明:無-注:.....******************************************************************/voidRGB(void){ucharx;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;}}}/******************************************************************-功能描述:七彩跳變函數(shù)-隸屬模塊:無-函數(shù)屬性:無-參數(shù)說明:無-返回說明:無-注:.....******************************************************************/voidTianbian(void){ucharx=1,y;do{switch(x){case1:R=ON;G=Y=OFF;Delay(5);break;case2:G=ON;R=Y=OFF;Delay(5);break;case3:Y=ON;G=R=OFF;Delay(5);break;case4:R=OFF;G=Y=ON;Delay(5);break;case5:G=OFF;R=Y=ON;Delay(5);break;case6:Y=OFF;G=R=ON;Delay(5);break;case7:Y=ON;G=R=ON;Delay(5);break;default:x=1;break;}if(y++>100){y=0;x++;}}while(!DMX512_ok);}/******************************************************************-功能描述:主函數(shù)-隸屬模塊:無-函數(shù)屬性:無-參數(shù)說明:無-返回說明:無-注:.....******************************************************************/voidmain(void){SCON=0xD0;//UART工作于方式3波特率為(1+SMOD)·(定時器1的溢出率)/32REN=1接收允許PCON=0x0;//不倍頻,晶振24MAUXR|=0X40;//T1工作在1T模式*12TMOD=0x20;//T1工作于8位自動重裝模式TH1=0xFD;//波特率20833*12=250KTL1=0xFD;TR1=1;//開定時器1PS=1;//設(shè)置串口中斷為最高優(yōu)先級ES=1;//開UART中斷EA=1;//開總中斷WDT_CONTR=0x3d;//開看門狗64分頻16M0.67scnt=3;//3通道EN_485=0;//MAX485收發(fā)選擇EN_485=1發(fā),EN_485=0收/**************************************************************/P1M1=0X00;//P1口設(shè)為推挽輸出P1M0=0XFF;P3M1=0X00;//P3口設(shè)為推挽輸出P3.7為普通IOP3M0=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();//無信號}}}/******************************************************************-功能描述:串口中斷函數(shù),實現(xiàn)DMX512數(shù)據(jù)接收-隸屬模塊:無-函數(shù)屬性:無-參數(shù)說明:無-返回說明:無-注:.....******************************************************************/voidRec(void)interrupt4{if(RI==1){RI=0;if(Head_ok)//收到頭碼就可以收數(shù)據(jù)碼{DMX512_ok=1;if(Address==DMX_channel)//R地址比較{R_dat=SBUF;//取出數(shù)據(jù)cnt--;if(!cnt){Address=0;start_ok=0;cnt=3;Head_ok=0;}}/**************************************************************/if(Address==DMX_channel+1)//G地址比較{G_dat=SBUF;//取出數(shù)據(jù)cnt--;if(!cnt){Address=0;start_ok=0;cnt=3;Head_ok=0;}}/**************************************************************/if(Address==DMX_channel+2)//G地址比較{B_dat=SBUF;//取出數(shù)據(jù)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)////判斷收到的第九位數(shù)據(jù),只有在DMX送出>88us低電平的中斷信號時(也叫同步碼,起始碼,),RB8才會為0{start_ok=1;//收到起始位Address=0;//0-255共256個通道}elseif(start_ok){Head_ok=1;//收到設(shè)備信息數(shù)據(jù)}}}}
此貼已被推薦到論壇首頁置頂頭條~樂工繼續(xù)!
0
回復
2014-06-26 14:39
@電源網(wǎng)-娜娜姐
此貼已被推薦到論壇首頁置頂頭條~樂工繼續(xù)!
前段時間在帖子上看到有人在談?wù)撚脝纹瑱C來做DMX512協(xié)議去控制LED燈,這幾天剛好有點時間就寫了個,有部分資料也來自網(wǎng)上
0
回復
電子夢
LV.2
9
2014-06-26 14:44
@yueyunno1
前段時間在帖子上看到有人在談?wù)撚脝纹瑱C來做DMX512協(xié)議去控制LED燈,這幾天剛好有點時間就寫了個,有部分資料也來自網(wǎng)上
正打算做DMX512的燈具,及時雨呀,網(wǎng)上也有很多資料,但是程序?qū)懙们逦髁说幕臼菦]有的。
0
回復
2014-06-26 15:00
@電子夢
正打算做DMX512的燈具,及時雨呀,網(wǎng)上也有很多資料,但是程序?qū)懙们逦髁说幕臼菦]有的。
擼主你這個程序應該就是一個標準的DMX512程序吧,但是還有個問題,不帶地址設(shè)置呀,如果有20條燈連接在一起的話估計全部都是一種變化效果,20條燈會同時動作。
0
回復
a2895812
LV.2
11
2014-06-26 15:08
@電子夢
正打算做DMX512的燈具,及時雨呀,網(wǎng)上也有很多資料,但是程序?qū)懙们逦髁说幕臼菦]有的。
標記個,下班回去了我也找段DMX512協(xié)議的調(diào)光燈程序貼上來,很久以前寫的,非常亂,但是可以用。可以在普通ATMEL的2051上使用。方式和樓主不太一樣,樓主的是中斷接收,我的是查詢接收;樓主的是主循環(huán)產(chǎn)生PWM,我的是定時器產(chǎn)生PWM。
0
回復
li9983456
LV.1
12
2014-06-28 08:34
@a2895812
標記個,下班回去了我也找段DMX512協(xié)議的調(diào)光燈程序貼上來,很久以前寫的,非常亂,但是可以用。可以在普通ATMEL的2051上使用。方式和樓主不太一樣,樓主的是中斷接收,我的是查詢接收;樓主的是主循環(huán)產(chǎn)生PWM,我的是定時器產(chǎn)生PWM。
哇!這里還有有個高山云的新帖子,得頂~
0
回復
xiao245896
LV.1
13
2014-06-28 08:37
@li9983456
哇!這里還有有個高山云的新帖子,得頂~
恩,就是得支持,感謝樓主分享這么多。
0
回復
phantasm
LV.5
14
2014-07-01 22:17
@yueyunno1
//============================================================================//================DMX512接收數(shù)據(jù)=====================================//============================================================================#include#defineucharunsignedchar#defineuintunsignedint#defineON1#defineOFF0sbitR=P1^7;sbitG=P1^6;sbitY=P1^5;sbitCOM=P3^7;sbitEN_485=P3^4;sbitWork_LED=P3^3;sbitTXD=P3^1;uintAddress;//Set_R,Set_G,Set_B;//3路接收和設(shè)置地址bitstart_ok,Head_ok;bitDMX512_ok;//DMX512信號標志ucharcnt;//ucharR_dat,G_dat,B_dat;//RGB三路數(shù)據(jù)uintDMX_channel;//DMX三路的起始地址ucharPWM;/******************************************************************-功能描述:延時函數(shù)-隸屬模塊:無-函數(shù)屬性:無-參數(shù)說明:無-返回說明:無-注:.....******************************************************************/voidDelay(uintms){uinta,b;for(a=ms;a!=0;a--)for(b=1210;b!=0;b--);WDT_CONTR=0x3d;}/******************************************************************-功能描述:PWM掃描-隸屬模塊:無-函數(shù)屬性:無-參數(shù)說明:無-返回說明:無-注:.....******************************************************************/voidRGB(void){ucharx;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;}}}/******************************************************************-功能描述:七彩跳變函數(shù)-隸屬模塊:無-函數(shù)屬性:無-參數(shù)說明:無-返回說明:無-注:.....******************************************************************/voidTianbian(void){ucharx=1,y;do{switch(x){case1:R=ON;G=Y=OFF;Delay(5);break;case2:G=ON;R=Y=OFF;Delay(5);break;case3:Y=ON;G=R=OFF;Delay(5);break;case4:R=OFF;G=Y=ON;Delay(5);break;case5:G=OFF;R=Y=ON;Delay(5);break;case6:Y=OFF;G=R=ON;Delay(5);break;case7:Y=ON;G=R=ON;Delay(5);break;default:x=1;break;}if(y++>100){y=0;x++;}}while(!DMX512_ok);}/******************************************************************-功能描述:主函數(shù)-隸屬模塊:無-函數(shù)屬性:無-參數(shù)說明:無-返回說明:無-注:.....******************************************************************/voidmain(void){SCON=0xD0;//UART工作于方式3波特率為(1+SMOD)·(定時器1的溢出率)/32REN=1接收允許PCON=0x0;//不倍頻,晶振24MAUXR|=0X40;//T1工作在1T模式*12TMOD=0x20;//T1工作于8位自動重裝模式TH1=0xFD;//波特率20833*12=250KTL1=0xFD;TR1=1;//開定時器1PS=1;//設(shè)置串口中斷為最高優(yōu)先級ES=1;//開UART中斷EA=1;//開總中斷WDT_CONTR=0x3d;//開看門狗64分頻16M0.67scnt=3;//3通道EN_485=0;//MAX485收發(fā)選擇EN_485=1發(fā),EN_485=0收/**************************************************************/P1M1=0X00;//P1口設(shè)為推挽輸出P1M0=0XFF;P3M1=0X00;//P3口設(shè)為推挽輸出P3.7為普通IOP3M0=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();//無信號}}}/******************************************************************-功能描述:串口中斷函數(shù),實現(xiàn)DMX512數(shù)據(jù)接收-隸屬模塊:無-函數(shù)屬性:無-參數(shù)說明:無-返回說明:無-注:.....******************************************************************/voidRec(void)interrupt4{if(RI==1){RI=0;if(Head_ok)//收到頭碼就可以收數(shù)據(jù)碼{DMX512_ok=1;if(Address==DMX_channel)//R地址比較{R_dat=SBUF;//取出數(shù)據(jù)cnt--;if(!cnt){Address=0;start_ok=0;cnt=3;Head_ok=0;}}/**************************************************************/if(Address==DMX_channel+1)//G地址比較{G_dat=SBUF;//取出數(shù)據(jù)cnt--;if(!cnt){Address=0;start_ok=0;cnt=3;Head_ok=0;}}/**************************************************************/if(Address==DMX_channel+2)//G地址比較{B_dat=SBUF;//取出數(shù)據(jù)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)////判斷收到的第九位數(shù)據(jù),只有在DMX送出>88us低電平的中斷信號時(也叫同步碼,起始碼,),RB8才會為0{start_ok=1;//收到起始位Address=0;//0-255共256個通道}elseif(start_ok){Head_ok=1;//收到設(shè)備信息數(shù)據(jù)}}}}
了解一下 雖然都用不用
0
回復
2014-07-02 10:13
@phantasm
了解一下雖然都用不用
此貼已經(jīng)被推薦社區(qū)經(jīng)典!大家繼續(xù)~樓主加油!~
0
回復
a2895812
LV.2
16
2014-07-02 21:24
@a2895812
標記個,下班回去了我也找段DMX512協(xié)議的調(diào)光燈程序貼上來,很久以前寫的,非常亂,但是可以用。可以在普通ATMEL的2051上使用。方式和樓主不太一樣,樓主的是中斷接收,我的是查詢接收;樓主的是主循環(huán)產(chǎn)生PWM,我的是定時器產(chǎn)生PWM。

//**********************************************************

//stc 2051 兼容ATMEL2051

//16M晶振 250k波特率

//最簡實驗DMX512調(diào)光序

//**********************************************************

//P3_5 - P1 0-511 通道選擇 自動更新

//P3_2 P3_3 P3_4 R G B輸出。

//**********************************************************  

 #include   

 #define        uchar unsigned char

//**********************************************************

//定義全局變量給中斷程序使用。

//********************************************************** 

  uchar t0_mark=0x00,  data1=0x00, data2=0x00, data3=0x00,data4=0x00,

data5, data6, data7;  

 uchar da1=0x80, da2=0x80, da3=0x80,da4=0xff,mark=0x00,add=0x00; 

  unsigned  int   time;

//*******************************************************

//協(xié)議程序 

//*******************************************************  

 void start_bit(void) 

  { uchar a;     TR0=1;        while (P3_0==1);  

 // 等待傳輸暫停

 TR0=0;

TH0=0x00;

TL0=0x00;

TR0=1;

while  (P3_0==0); //等待端口變化

if(TL0>0x80||TH0>0x00)  //大于96微秒 

  { REN=1;time=0x00;while(RI==0);    

  data1=SBUF;  

if (mark==0x00)   

  { for( a=add; a!=0x00; a--){while(RI==0);   RI=0;  }  //啟動串口  

while(RI==0);  

  data5=SBUF;    

  RI=0;   

 while(RI==0);     

 data6=SBUF;     

 RI=0;    

 while(RI==0); 

   data7=SBUF;

  RI=0; 

 REN=0;   

 if(data1==0x00)  { data2=(data5&0xfc)>>2;   

  data3=(data6&0xfc)>>2; 

  data4=(data7&0xfc)>>2; }              }

else { for( a=0xff; a!=0x00; a--)

{   while(RI==0);   RI=0;  }  //啟動串口      

    for( a=add; a!=0x00; a--) 

  {while(RI==0);      RI=0;  }  //啟動串口  

  while(RI==0);   

   data5=SBUF;   

   RI=0;   

 while(RI==0);   

   data6=SBUF;  

    RI=0;   

 while(RI==0); 

   data7=SBUF; 

 RI=0;

  REN=0;   

 if(data1==0x00)  { data2=(data5&0xfc)>>2; 

    data3=(data6&0xfc)>>2; 

  data4=(data7&0xfc)>>2; }                 }

P1=0xff;           

     if(P3_5==0)            

    { mark=0x00;            add=P1; }        

     else  { mark=0xff;             add=P1; }   }  } 

  void main(void)   

{       P3=0x00;

 P3_0=1;

 P3_1=1;

 P3_5=1;     

 P1=0xff;

 if(P3_5==0)  

  { mark=0x00;  add=P1; }

else  { mark=0xff;        add=P1; }    

     SCON=0x88;

 ACC=PCON;

   ACC=ACC+0x80;

 PCON=ACC; //串口方式2 

  TMOD=0x21; // 定時器0方式1 定時器1方式

TH1=0x80; //60個周期中斷一次

 TL0=0x80;

 TR1=1;

 IE=0x8a;  //允許允許T0中斷

 do { do { start_bit();                   }     

   while(REN==0);}

while(1) ;}   

 //****************************************

//定時器T0  16bit 

 //****************************************

        void  t0_irq(void) interrupt 1 

   { t0_mark++;   

  time++;

 if (time>0x500) 

     { time=0x00;    

 data2=0x00;

 data3=0x00;

 data4=0x00; }     }

//***************************************

//定時器T1  方式2  自動重裝, PWM  200Hz

//***************************************

void  t1_irq(void) interrupt 3

{ if(da1==0x00)    

  {P3_2=0;  }   

  else  {da1--;         P3_2=1; 

}if(da2==0x00)    {P3_3=0;  } 

 else  {da2--;          P3_3=1;

}if(da3==0x00)    {P3_4=0;  }   

 else  {da3--;         P3_4=1;}

 if(da4==0x00)   

  { da1=data2;    da2=data3;da3=data4; da4=0x40;  }da4--;           }

//實驗程序 謹慎使用!

0
回復
a2895812
LV.2
17
2014-07-02 21:25
@a2895812
//**********************************************************//stc2051兼容ATMEL2051//16M晶振250k波特率//最簡實驗DMX512調(diào)光序//**********************************************************//P3_5-P10-511通道選擇自動更新//P3_2P3_3P3_4RGB輸出。//**********************************************************   #include   #define    ucharunsignedchar//**********************************************************//定義全局變量給中斷程序使用。//**********************************************************   uchart0_mark=0x00, data1=0x00,data2=0x00,data3=0x00,data4=0x00,data5,data6,data7;  ucharda1=0x80,da2=0x80,da3=0x80,da4=0xff,mark=0x00,add=0x00;   unsigned int time;//*******************************************************//協(xié)議程序 //*******************************************************   voidstart_bit(void)   {uchara;   TR0=1;     while(P3_0==1);  //等待傳輸暫停 TR0=0;TH0=0x00;TL0=0x00;TR0=1;while (P3_0==0);//等待端口變化if(TL0>0x80||TH0>0x00) //大于96微秒   {REN=1;time=0x00;while(RI==0);    data1=SBUF;  if(mark==0x00)    {for(a=add;a!=0x00;a--){while(RI==0);  RI=0; } //啟動串口  while(RI==0);   data5=SBUF;    RI=0;   while(RI==0);    data6=SBUF;    RI=0;    while(RI==0);   data7=SBUF; RI=0;  REN=0;   if(data1==0x00) {data2=(data5&0xfc)>>2;    data3=(data6&0xfc)>>2;   data4=(data7&0xfc)>>2;}       }else{for(a=0xff;a!=0x00;a--){  while(RI==0);  RI=0; } //啟動串口      for(a=add;a!=0x00;a--)   {while(RI==0);   RI=0; } //啟動串口   while(RI==0);    data5=SBUF;    RI=0;   while(RI==0);    data6=SBUF;    RI=0;   while(RI==0);   data7=SBUF;  RI=0; REN=0;   if(data1==0x00) {data2=(data5&0xfc)>>2;    data3=(data6&0xfc)>>2;   data4=(data7&0xfc)>>2;}         }P1=0xff;         if(P3_5==0)         {mark=0x00;      add=P1;}        else {mark=0xff;       add=P1;} } }   voidmain(void)  {    P3=0x00; P3_0=1; P3_1=1; P3_5=1;    P1=0xff; if(P3_5==0)   {mark=0x00; add=P1;}else {mark=0xff;    add=P1;}      SCON=0x88; ACC=PCON;   ACC=ACC+0x80; PCON=ACC;//串口方式2   TMOD=0x21;//定時器0方式1定時器1方式8 TH1=0x80;//60個周期中斷一次 TL0=0x80; TR1=1; IE=0x8a; //允許允許T0中斷 do{ do{ start_bit();          }     while(REN==0);}while(1);}   //****************************************//定時器T0 16bit  //****************************************      void t0_irq(void)interrupt1   {t0_mark++;    time++; if(time>0x500)    {time=0x00;    data2=0x00; data3=0x00; data4=0x00;}   }//***************************************//定時器T1 方式2 自動重裝,PWM 200Hz//***************************************void t1_irq(void)interrupt3{if(da1==0x00)    {P3_2=0; }    else {da1--;     P3_2=1; }if(da2==0x00)  {P3_3=0; }  else {da2--;     P3_3=1;}if(da3==0x00)  {P3_4=0; }   else {da3--;     P3_4=1;} if(da4==0x00)    {da1=data2;  da2=data3;da3=data4; da4=0x40; }da4--;      }//實驗程序謹慎使用!
DMX512.txt 排版慘不忍睹  文件上傳吧,
0
回復
2014-07-18 17:03
@yueyunno1
前段時間在帖子上看到有人在談?wù)撚脝纹瑱C來做DMX512協(xié)議去控制LED燈,這幾天剛好有點時間就寫了個,有部分資料也來自網(wǎng)上
你好  你這個是不是和上面的電路圖不匹配的呢?你那個R G B控制的引腳好像有點不對的呢?還問問你 想這種DMX一路的能傳輸多遠的距離呢?是不是距離比較遠的話就需要接連個DMX芯片一個作為輸入 一個作為輸出呢?
0
回復
a2895812
LV.2
19
2014-07-19 16:02
@辷噺一意
你好 你這個是不是和上面的電路圖不匹配的呢?你那個RGB控制的引腳好像有點不對的呢?還問問你想這種DMX一路的能傳輸多遠的距離呢?是不是距離比較遠的話就需要接連個DMX芯片一個作為輸入一個作為輸出呢?

我不知道你是不是在問我,我這個程序是在控臺上測試過的,是可以用的,DMX512協(xié)議規(guī)定在信號丟失多長時間后從設(shè)備應該自動關(guān)閉,這個程序里面也是有的,也就是說是按標準協(xié)議做的,但是測試不是完全,09年的時候剛出大學不久,水平有限,所以不建議使用這段程序。

管腳連接在程序的最前面我就標出來了,肯定和樓主的不兼容的,但只要按標名的管腳做外圍就可以用了,具體我也多嘴說一下吧。

485總線按標準485總線電路連接即可,和樓主的應該一樣,但也應該自己去看下485的標準接發(fā)。

P3_2 P3_3 P3_4是輸出 注意極性,應接上拉電阻來驅(qū)動三極管,再驅(qū)動大功率三極管或者MOSFET,注意極性。

P3_5  和P1口  總共9個腳接DIP開關(guān)來設(shè)置地址,可以設(shè)置0-511地址,如果設(shè)置地址為32,則紅色數(shù)據(jù)地址是32,綠色地址是33,藍色地址是34;依此類推。

程序很亂,我自己都看不懂了。。。但是真的可以工作,還被我拿去賣了錢的。。。。。

0
回復
changlun
LV.7
20
2014-07-28 14:29
哈哈~ 這個不錯。
0
回復
mht820413
LV.6
21
2014-08-09 09:23
@changlun
哈哈~這個不錯。
不懂但是也頂頂,會C的電源工程師,是未來的趨勢。電源也得智能化
0
回復
S112
LV.2
22
2014-09-10 11:37
@yueyunno1
原理圖如下:[圖片]
樂工,中斷接入ISSI 402-3G這個芯片,不知道了解不?
0
回復
jag6510
LV.3
23
2015-01-02 10:29
@mht820413
不懂但是也頂頂,會C的電源工程師,是未來的趨勢。電源也得智能化
頂頂頂
0
回復
yhy630
LV.2
24
2015-07-02 14:16
@a2895812
我不知道你是不是在問我,我這個程序是在控臺上測試過的,是可以用的,DMX512協(xié)議規(guī)定在信號丟失多長時間后從設(shè)備應該自動關(guān)閉,這個程序里面也是有的,也就是說是按標準協(xié)議做的,但是測試不是完全,09年的時候剛出大學不久,水平有限,所以不建議使用這段程序。管腳連接在程序的最前面我就標出來了,肯定和樓主的不兼容的,但只要按標名的管腳做外圍就可以用了,具體我也多嘴說一下吧。485總線按標準485總線電路連接即可,和樓主的應該一樣,但也應該自己去看下485的標準接發(fā)。P3_2P3_3P3_4是輸出注意極性,應接上拉電阻來驅(qū)動三極管,再驅(qū)動大功率三極管或者MOSFET,注意極性。P3_5 和P1口 總共9個腳接DIP開關(guān)來設(shè)置地址,可以設(shè)置0-511地址,如果設(shè)置地址為32,則紅色數(shù)據(jù)地址是32,綠色地址是33,藍色地址是34;依此類推。程序很亂,我自己都看不懂了。。。但是真的可以工作,還被我拿去賣了錢的。。。。。
謝謝樓主,要仔細研究一下.好好學習
0
回復
2016-02-20 19:34
還有好多不懂呢
0
回復
2016-02-21 15:22
看看 
0
回復
junfrom1989
LV.1
27
2016-03-14 14:49
@yueyunno1
前段時間在帖子上看到有人在談?wù)撚脝纹瑱C來做DMX512協(xié)議去控制LED燈,這幾天剛好有點時間就寫了個,有部分資料也來自網(wǎng)上
問一下 RB8是從哪里來的?

0
回復
zhck
LV.3
28
2017-09-30 17:12
@電子夢
正打算做DMX512的燈具,及時雨呀,網(wǎng)上也有很多資料,但是程序?qū)懙们逦髁说幕臼菦]有的。

很好,不錯學習了

0
回復
tanik
LV.5
29
2018-05-22 14:34

 學習了,多謝樓主分享!

0
回復
hjx5548
LV.4
30
2018-09-29 10:30
@a2895812
//**********************************************************//stc2051兼容ATMEL2051//16M晶振250k波特率//最簡實驗DMX512調(diào)光序//**********************************************************//P3_5-P10-511通道選擇自動更新//P3_2P3_3P3_4RGB輸出。//**********************************************************   #include   #define    ucharunsignedchar//**********************************************************//定義全局變量給中斷程序使用。//**********************************************************   uchart0_mark=0x00, data1=0x00,data2=0x00,data3=0x00,data4=0x00,data5,data6,data7;  ucharda1=0x80,da2=0x80,da3=0x80,da4=0xff,mark=0x00,add=0x00;   unsigned int time;//*******************************************************//協(xié)議程序 //*******************************************************   voidstart_bit(void)   {uchara;   TR0=1;     while(P3_0==1);  //等待傳輸暫停 TR0=0;TH0=0x00;TL0=0x00;TR0=1;while (P3_0==0);//等待端口變化if(TL0>0x80||TH0>0x00) //大于96微秒   {REN=1;time=0x00;while(RI==0);    data1=SBUF;  if(mark==0x00)    {for(a=add;a!=0x00;a--){while(RI==0);  RI=0; } //啟動串口  while(RI==0);   data5=SBUF;    RI=0;   while(RI==0);    data6=SBUF;    RI=0;    while(RI==0);   data7=SBUF; RI=0;  REN=0;   if(data1==0x00) {data2=(data5&0xfc)>>2;    data3=(data6&0xfc)>>2;   data4=(data7&0xfc)>>2;}       }else{for(a=0xff;a!=0x00;a--){  while(RI==0);  RI=0; } //啟動串口      for(a=add;a!=0x00;a--)   {while(RI==0);   RI=0; } //啟動串口   while(RI==0);    data5=SBUF;    RI=0;   while(RI==0);    data6=SBUF;    RI=0;   while(RI==0);   data7=SBUF;  RI=0; REN=0;   if(data1==0x00) {data2=(data5&0xfc)>>2;    data3=(data6&0xfc)>>2;   data4=(data7&0xfc)>>2;}         }P1=0xff;         if(P3_5==0)         {mark=0x00;      add=P1;}        else {mark=0xff;       add=P1;} } }   voidmain(void)  {    P3=0x00; P3_0=1; P3_1=1; P3_5=1;    P1=0xff; if(P3_5==0)   {mark=0x00; add=P1;}else {mark=0xff;    add=P1;}      SCON=0x88; ACC=PCON;   ACC=ACC+0x80; PCON=ACC;//串口方式2   TMOD=0x21;//定時器0方式1定時器1方式8 TH1=0x80;//60個周期中斷一次 TL0=0x80; TR1=1; IE=0x8a; //允許允許T0中斷 do{ do{ start_bit();          }     while(REN==0);}while(1);}   //****************************************//定時器T0 16bit  //****************************************      void t0_irq(void)interrupt1   {t0_mark++;    time++; if(time>0x500)    {time=0x00;    data2=0x00; data3=0x00; data4=0x00;}   }//***************************************//定時器T1 方式2 自動重裝,PWM 200Hz//***************************************void t1_irq(void)interrupt3{if(da1==0x00)    {P3_2=0; }    else {da1--;     P3_2=1; }if(da2==0x00)  {P3_3=0; }  else {da2--;     P3_3=1;}if(da3==0x00)  {P3_4=0; }   else {da3--;     P3_4=1;} if(da4==0x00)    {da1=data2;  da2=data3;da3=data4; da4=0x40; }da4--;      }//實驗程序謹慎使用!
能否加個尋址,方便級連。
0
回復
sabrina9988
LV.7
31
2018-11-10 15:50
支持一下
0
回復
發(fā)
主站蜘蛛池模板: 免费又黄又爽又猛大片午夜 | 激情偷乱人伦小说视频在线精 | 色欧美在线视频 | 日本午夜在线观看 | www.日本不卡 | 四虎成人免费视频在线播放 | 最好看的中文视频最好的中文 | 爽爽午夜影视窝窝看片 | 久久亚洲精品国产 | 狼群社区视频WWW国语 | 国产日韩综合一区在线观看 | 久草在线免费在线观看 | 不卡av免费在线观看 | 亚洲一区二区精品 | 国产精品第100页 | 日本三级午夜在线看激 | 年轻的朋友hd | AV无码岛国免费动作片 | 中国丰满大乳乳液 | 久久久www视频 | 亚洲国产成人精品福利在线观看 | 国产乱淫片视频 | 国产精品极品美女自在线观看免费 | 乱色国内精品视频在线 | 成人特黄a级毛片免费视频 色一乱一伦一图一区二区精品 | 欧美高清一区三区在线专区 | 玖玖精品国产 | 日韩高清二区 | 最近免费中文字幕中文高清 | 无码精品人妻一区二区三区涩爱 | 中文字幕乱码亚洲无线码 | 蜜臀色欲AV无码国产精品 | 国产一区二区不卡视频 | 免费一级好看的国产 | 国产特级黄色片 | 国产真实乱偷精品视频免 | 国产专区一区二区 | 一女三男做2爱A片免费 | 少妇穿牛仔裤一级av毛片 | 爱爱欧美 | 日韩精品免费看 |