a2895812:
//**********************************************************//stc2051兼容ATMEL2051//16M晶振250k波特率//最简实验DMX512调光序//**********************************************************//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;//*******************************************************//协议程序 //******************************************************* 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--; }//实验程序谨慎使用!