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

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

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

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

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

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

1

圖1基于485的 DMX512拓?fù)浣Y(jié)構(gòu)
2.3.DMX512 端口及數(shù)據(jù)鏈路 因?yàn)槭遣捎?85差分信號(hào)傳輸,因此DMX512端口一般采用3針或5針接口,相對(duì)應(yīng)的導(dǎo)線則為1對(duì)或2對(duì)雙絞線,導(dǎo)線同時(shí)應(yīng)采用箔片或編織篩包裹。XLR針口分配如下表1所示,其中輔助數(shù)據(jù)鏈路可以不用。

2

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

3

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

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

原理圖如下:

0
回復(fù)
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信號(hào)標(biāo)志
uchar  cnt;                                                      //

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

/******************************************************************
- 功能描述:延時(shí)函數(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)·(定時(shí)器1的溢出率)/32  REN=1接收允許
     PCON=0x0;              //不倍頻,晶振24M 
     AUXR|=0X40;            //T1工作在1T模式*12         
     TMOD=0x20;             //T1工作于8位自動(dòng)重裝模式
     TH1 =0xFD;             //波特率20833*12=250K
     TL1 =0xFD;        

     TR1=1;                      //開定時(shí)器1
     PS=1;                  //設(shè)置串口中斷為最高優(yōu)先級(jí)
     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信號(hào)標(biāo)志
	DMX_channel=0;	   //DMX三路的起始地址
	WDT_CONTR= 0x3d;
	RGB();
	if(!DMX512_ok)
	{
		Tianbian();  //無信號(hào)
	}
  }
}

/******************************************************************
- 功能描述:串口中斷函數(shù),實(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個(gè)比較完
			}                             
		}  
		else
		{                      
			if(!RB8)//             //判斷收到的第九位數(shù)據(jù),只有在DMX送出>88us低電平的中斷信號(hào)時(shí)(也叫同步碼,起始碼,),RB8才會(huì)為0
			{ 
				start_ok=1;   //收到起始位
				Address=0;    //0-255共256個(gè)通道                       
			}
			 
			else if(start_ok)
			{
				Head_ok=1;    // 收到設(shè)備信息數(shù)據(jù)
			}
		}
	} 
} 
 
0
回復(fù)
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信號(hào)標(biāo)志ucharcnt;//ucharR_dat,G_dat,B_dat;//RGB三路數(shù)據(jù)uintDMX_channel;//DMX三路的起始地址ucharPWM;/******************************************************************-功能描述:延時(shí)函數(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)·(定時(shí)器1的溢出率)/32REN=1接收允許PCON=0x0;//不倍頻,晶振24MAUXR|=0X40;//T1工作在1T模式*12TMOD=0x20;//T1工作于8位自動(dòng)重裝模式TH1=0xFD;//波特率20833*12=250KTL1=0xFD;TR1=1;//開定時(shí)器1PS=1;//設(shè)置串口中斷為最高優(yōu)先級(jí)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信號(hào)標(biāo)志DMX_channel=0;//DMX三路的起始地址WDT_CONTR=0x3d;RGB();if(!DMX512_ok){Tianbian();//無信號(hào)}}}/******************************************************************-功能描述:串口中斷函數(shù),實(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個(gè)比較完}}else{if(!RB8)////判斷收到的第九位數(shù)據(jù),只有在DMX送出>88us低電平的中斷信號(hào)時(shí)(也叫同步碼,起始碼,),RB8才會(huì)為0{start_ok=1;//收到起始位Address=0;//0-255共256個(gè)通道}elseif(start_ok){Head_ok=1;//收到設(shè)備信息數(shù)據(jù)}}}}
此貼已被推薦到論壇首頁置頂頭條~樂工繼續(xù)!
0
回復(fù)
2014-06-26 14:39
@電源網(wǎng)-娜娜姐
此貼已被推薦到論壇首頁置頂頭條~樂工繼續(xù)!
前段時(shí)間在帖子上看到有人在談?wù)撚脝纹瑱C(jī)來做DMX512協(xié)議去控制LED燈,這幾天剛好有點(diǎn)時(shí)間就寫了個(gè),有部分資料也來自網(wǎng)上
0
回復(fù)
2014-06-26 14:44
@yueyunno1
前段時(shí)間在帖子上看到有人在談?wù)撚脝纹瑱C(jī)來做DMX512協(xié)議去控制LED燈,這幾天剛好有點(diǎn)時(shí)間就寫了個(gè),有部分資料也來自網(wǎng)上
正打算做DMX512的燈具,及時(shí)雨呀,網(wǎng)上也有很多資料,但是程序?qū)懙们逦髁说幕臼菦]有的。
0
回復(fù)
2014-06-26 15:00
@電子夢(mèng)
正打算做DMX512的燈具,及時(shí)雨呀,網(wǎng)上也有很多資料,但是程序?qū)懙们逦髁说幕臼菦]有的。
擼主你這個(gè)程序應(yīng)該就是一個(gè)標(biāo)準(zhǔn)的DMX512程序吧,但是還有個(gè)問題,不帶地址設(shè)置呀,如果有20條燈連接在一起的話估計(jì)全部都是一種變化效果,20條燈會(huì)同時(shí)動(dòng)作。
0
回復(fù)
a2895812
LV.2
11
2014-06-26 15:08
@電子夢(mèng)
正打算做DMX512的燈具,及時(shí)雨呀,網(wǎng)上也有很多資料,但是程序?qū)懙们逦髁说幕臼菦]有的。
標(biāo)記個(gè),下班回去了我也找段DMX512協(xié)議的調(diào)光燈程序貼上來,很久以前寫的,非常亂,但是可以用??梢栽谄胀ˋTMEL的2051上使用。方式和樓主不太一樣,樓主的是中斷接收,我的是查詢接收;樓主的是主循環(huán)產(chǎn)生PWM,我的是定時(shí)器產(chǎn)生PWM。
0
回復(fù)
li9983456
LV.1
12
2014-06-28 08:34
@a2895812
標(biāo)記個(gè),下班回去了我也找段DMX512協(xié)議的調(diào)光燈程序貼上來,很久以前寫的,非常亂,但是可以用。可以在普通ATMEL的2051上使用。方式和樓主不太一樣,樓主的是中斷接收,我的是查詢接收;樓主的是主循環(huán)產(chǎn)生PWM,我的是定時(shí)器產(chǎn)生PWM。
哇!這里還有有個(gè)高山云的新帖子,得頂~
0
回復(fù)
xiao245896
LV.1
13
2014-06-28 08:37
@li9983456
哇!這里還有有個(gè)高山云的新帖子,得頂~
恩,就是得支持,感謝樓主分享這么多。
0
回復(fù)
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信號(hào)標(biāo)志ucharcnt;//ucharR_dat,G_dat,B_dat;//RGB三路數(shù)據(jù)uintDMX_channel;//DMX三路的起始地址ucharPWM;/******************************************************************-功能描述:延時(shí)函數(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)·(定時(shí)器1的溢出率)/32REN=1接收允許PCON=0x0;//不倍頻,晶振24MAUXR|=0X40;//T1工作在1T模式*12TMOD=0x20;//T1工作于8位自動(dòng)重裝模式TH1=0xFD;//波特率20833*12=250KTL1=0xFD;TR1=1;//開定時(shí)器1PS=1;//設(shè)置串口中斷為最高優(yōu)先級(jí)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信號(hào)標(biāo)志DMX_channel=0;//DMX三路的起始地址WDT_CONTR=0x3d;RGB();if(!DMX512_ok){Tianbian();//無信號(hào)}}}/******************************************************************-功能描述:串口中斷函數(shù),實(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個(gè)比較完}}else{if(!RB8)////判斷收到的第九位數(shù)據(jù),只有在DMX送出>88us低電平的中斷信號(hào)時(shí)(也叫同步碼,起始碼,),RB8才會(huì)為0{start_ok=1;//收到起始位Address=0;//0-255共256個(gè)通道}elseif(start_ok){Head_ok=1;//收到設(shè)備信息數(shù)據(jù)}}}}
了解一下 雖然都用不用
0
回復(fù)
2014-07-02 10:13
@phantasm
了解一下雖然都用不用
此貼已經(jīng)被推薦社區(qū)經(jīng)典!大家繼續(xù)~樓主加油!~
0
回復(fù)
a2895812
LV.2
16
2014-07-02 21:24
@a2895812
標(biāo)記個(gè),下班回去了我也找段DMX512協(xié)議的調(diào)光燈程序貼上來,很久以前寫的,非常亂,但是可以用??梢栽谄胀ˋTMEL的2051上使用。方式和樓主不太一樣,樓主的是中斷接收,我的是查詢接收;樓主的是主循環(huán)產(chǎn)生PWM,我的是定時(shí)器產(chǎn)生PWM。

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

//stc 2051 兼容ATMEL2051

//16M晶振 250k波特率

//最簡實(shí)驗(yàn)DMX512調(diào)光序

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

//P3_5 - P1 0-511 通道選擇 自動(dòng)更新

//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;  }  //啟動(dòng)串口  

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;  }  //啟動(dòng)串口      

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

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

  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; // 定時(shí)器0方式1 定時(shí)器1方式

TH1=0x80; //60個(gè)周期中斷一次

 TL0=0x80;

 TR1=1;

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

 do { do { start_bit();                   }     

   while(REN==0);}

while(1) ;}   

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

//定時(shí)器T0  16bit 

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

        void  t0_irq(void) interrupt 1 

   { t0_mark++;   

  time++;

 if (time>0x500) 

     { time=0x00;    

 data2=0x00;

 data3=0x00;

 data4=0x00; }     }

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

//定時(shí)器T1  方式2  自動(dòng)重裝, 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--;           }

//實(shí)驗(yàn)程序 謹(jǐn)慎使用!

0
回復(fù)
a2895812
LV.2
17
2014-07-02 21:25
@a2895812
//**********************************************************//stc2051兼容ATMEL2051//16M晶振250k波特率//最簡實(shí)驗(yàn)DMX512調(diào)光序//**********************************************************//P3_5-P10-511通道選擇自動(dòng)更新//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; } //啟動(dòng)串口  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; } //啟動(dòng)串口      for(a=add;a!=0x00;a--)   {while(RI==0);   RI=0; } //啟動(dòng)串口   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;//定時(shí)器0方式1定時(shí)器1方式8 TH1=0x80;//60個(gè)周期中斷一次 TL0=0x80; TR1=1; IE=0x8a; //允許允許T0中斷 do{ do{ start_bit();          }     while(REN==0);}while(1);}   //****************************************//定時(shí)器T0 16bit  //****************************************      void t0_irq(void)interrupt1   {t0_mark++;    time++; if(time>0x500)    {time=0x00;    data2=0x00; data3=0x00; data4=0x00;}   }//***************************************//定時(shí)器T1 方式2 自動(dòng)重裝,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--;      }//實(shí)驗(yàn)程序謹(jǐn)慎使用!
DMX512.txt 排版慘不忍睹  文件上傳吧,
0
回復(fù)
2014-07-18 17:03
@yueyunno1
前段時(shí)間在帖子上看到有人在談?wù)撚脝纹瑱C(jī)來做DMX512協(xié)議去控制LED燈,這幾天剛好有點(diǎn)時(shí)間就寫了個(gè),有部分資料也來自網(wǎng)上
你好  你這個(gè)是不是和上面的電路圖不匹配的呢?你那個(gè)R G B控制的引腳好像有點(diǎn)不對(duì)的呢?還問問你 想這種DMX一路的能傳輸多遠(yuǎn)的距離呢?是不是距離比較遠(yuǎn)的話就需要接連個(gè)DMX芯片一個(gè)作為輸入 一個(gè)作為輸出呢?
0
回復(fù)
a2895812
LV.2
19
2014-07-19 16:02
@辷噺一意
你好 你這個(gè)是不是和上面的電路圖不匹配的呢?你那個(gè)RGB控制的引腳好像有點(diǎn)不對(duì)的呢?還問問你想這種DMX一路的能傳輸多遠(yuǎn)的距離呢?是不是距離比較遠(yuǎn)的話就需要接連個(gè)DMX芯片一個(gè)作為輸入一個(gè)作為輸出呢?

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

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

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

P3_2 P3_3 P3_4是輸出 注意極性,應(yīng)接上拉電阻來驅(qū)動(dòng)三極管,再驅(qū)動(dòng)大功率三極管或者M(jìn)OSFET,注意極性。

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

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

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

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

很好,不錯(cuò)學(xué)習(xí)了

0
回復(fù)
tanik
LV.5
29
2018-05-22 14:34

 學(xué)習(xí)了,多謝樓主分享!

0
回復(fù)
hjx5548
LV.4
30
2018-09-29 10:30
@a2895812
//**********************************************************//stc2051兼容ATMEL2051//16M晶振250k波特率//最簡實(shí)驗(yàn)DMX512調(diào)光序//**********************************************************//P3_5-P10-511通道選擇自動(dòng)更新//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; } //啟動(dòng)串口  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; } //啟動(dòng)串口      for(a=add;a!=0x00;a--)   {while(RI==0);   RI=0; } //啟動(dòng)串口   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;//定時(shí)器0方式1定時(shí)器1方式8 TH1=0x80;//60個(gè)周期中斷一次 TL0=0x80; TR1=1; IE=0x8a; //允許允許T0中斷 do{ do{ start_bit();          }     while(REN==0);}while(1);}   //****************************************//定時(shí)器T0 16bit  //****************************************      void t0_irq(void)interrupt1   {t0_mark++;    time++; if(time>0x500)    {time=0x00;    data2=0x00; data3=0x00; data4=0x00;}   }//***************************************//定時(shí)器T1 方式2 自動(dòng)重裝,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--;      }//實(shí)驗(yàn)程序謹(jǐn)慎使用!
能否加個(gè)尋址,方便級(jí)連。
0
回復(fù)
sabrina9988
LV.7
31
2018-11-10 15:50
支持一下
0
回復(fù)
發(fā)
主站蜘蛛池模板: 亚洲手机在线播放 | 一区二区三区四区免费在线观看 | 国产91精品亚洲一区二区三区 | 亚洲精品97久久中文字幕无码 | 性高潮久久久久 | 国产片一区二区三区 | 梦想三国1-50集免费看 | 我的初次内射欧美成人影视 | 久久亚洲国产视频 | 狼群社区视频WWW国语 | 国产66精品久久久久999小说 | 蜜臀人妻精品一区二区免费 | 99久久精品免费看蜜桃的推荐词 | 日韩a级作爱片一二三区免费观看 | 国产h在线观看 | 四虎新影院2019址 | 麻豆区1免费 | 2019天天干天天操 | 在线一区视频 | 免费网站看v片在线a | 欧美xxxxx18| 精品无码一区二区的天堂 | 国产亚洲福利精品一区 | 亚洲精品一区二区另类图片 | 911色_911色sss主站色播 | 精品国产入口麻豆 | 日本在线播放一二三区 | 夜夜夜草视频 | 写作业写着写着就插了视频 | 亚洲成人高清av | 国产在线日韩欧美 | 亚洲男人的天堂在线 | 国产美女91视频 | 亚洲国产99在线精品一区二区 | 五月天狠狠色 | 欧美性free玩弄少妇 | 国产在线视精品在一区二区 | 国产成人综合日韩精品无码 | WWW射我里面在线观看 | 蜜臀人妻精品一区二区免费 | 成人手机在线视频 |