|
ED學(xué)習(xí)板之(STC)實(shí)驗(yàn)33-DMX512并行通信
//============================================================================
//================翼芯科技 DMX512接收數(shù)據(jù)=====================================
//============================================================================
// 此源碼版權(quán)屬 翼芯科技 全權(quán)享有,如欲引用,敬請(qǐng)署名并告知
// 嚴(yán)禁隨意用于商業(yè)目的,違者必究,后果自負(fù)
//
//
//程序說(shuō)明:本程序用于實(shí)現(xiàn)LDMX512為接收,DMX512信號(hào)自動(dòng)識(shí)別,當(dāng)無(wú)DMX512信號(hào)時(shí),
//執(zhí)行自檢程序(七彩跳變),IC插到U9位置.
//文件名稱(chēng):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路 接收和設(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ù)
- 隸屬模塊:無(wú)
- 函數(shù)屬性:無(wú)
- 參數(shù)說(shuō)明:無(wú)
- 返回說(shuō)明:無(wú)
- 注:.....
******************************************************************/
void Delay(uint ms)
{ uint a,b;
for(a=ms;a!=0;a--)
for(b=1210;b!=0;b--)
;
WDT_CONTR= 0x3d;
}
/******************************************************************
- 功能描述:PWM掃描
- 隸屬模塊:無(wú)
- 函數(shù)屬性:無(wú)
- 參數(shù)說(shuō)明:無(wú)
- 返回說(shuō)明:無(wú)
- 注:.....
******************************************************************/
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ù)
- 隸屬模塊:無(wú)
- 函數(shù)屬性:無(wú)
- 參數(shù)說(shuō)明:無(wú)
- 返回說(shuō)明:無(wú)
- 注:.....
******************************************************************/
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ù)
- 隸屬模塊:無(wú)
- 函數(shù)屬性:無(wú)
- 參數(shù)說(shuō)明:無(wú)
- 返回說(shuō)明:無(wú)
- 注:.....
******************************************************************/
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; //開(kāi)定時(shí)器1
PS=1; //設(shè)置串口中斷為最高優(yōu)先級(jí)
ES=1; //開(kāi)UART中斷
EA=1; //開(kāi)總中斷
WDT_CONTR= 0x3d; //開(kāi)看門(mén)狗 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;
DMX_channel=0;
WDT_CONTR= 0x3d;
RGB();
if(!DMX512_ok)
{
Tianbian(); //無(wú)信號(hào)
}
}
}
/******************************************************************
- 功能描述:串口中斷函數(shù),實(shí)現(xiàn)DMX512數(shù)據(jù)接收
- 隸屬模塊:無(wú)
- 函數(shù)屬性:無(wú)
- 參數(shù)說(shuō)明:無(wú)
- 返回說(shuō)明:無(wú)
- 注:.....
******************************************************************/
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ù)
}
}
}
}
|
|
|