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