#include <STC12C5A60S2.H>
#include <intrins.h>
#define FOSC 24000000L //系统频率
#define BAUD 250000 //串口波特率
unsigned int ms;
unsigned char num,num1,num2,num3;
//unsigned char send_data[]={0x00,0xf0,0x82,0x10,0x00,0x00,0x00,0x00}; //1.总调光 2.总频闪 3.功能选择0-39DMX,40-79跳变,80-119渐变,120-159脉变,160-199流水 4.功能速度 5.R 6.G 7.B 8.W
unsigned char send_data[]={0xf0,0x00,0x00,0x00,0xf0,0x00,0x00,0xf0};
void init();
void yanshi(ms);
void Delay88us(); //@24.000MHz
void Delay8us(); //@24.000MHz
void Delay4us(); //@24.000MHz
void DMX512_SendData(); //发送数据
void effect_1(); //红渐变绿
void effect_2(); //渐灭
void init() //250000bps@24.000MHz
{
PCON &= 0x7F; //波特率不倍速
SCON = 0xD0; //9位数据,可变波特率
AUXR |= 0x40; //定时器时钟1T模式
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式
TH1 = TL1 = 0xfd; //(256-FOSC/32/BAUD)
TR1 = 1;
P0=0xff;
P1=0xff;
P2=0xff;
yanshi(500);
}
void yanshi(ms) //@24.000MHz
{
unsigned int t;
for(t=ms;t>0;t--)
{
unsigned char i, j;
_nop_();
_nop_();
i = 24;
j = 84;
do
{
while (--j);
} while (--i);
}
}
void Delay88us() //@24.000MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 3;
j = 9;
do
{
while (--j);
} while (--i);
}
void Delay8us() //@24.000MHz
{
unsigned char i;
i = 45;
while (--i);
}
void DMX512_SendData()
{
unsigned int k;
P31 = 1; //MTBP
// _nop_();
P31 = 0; //break
Delay88us();
P31 = 1; //MAB
Delay8us();
TB8 = 1; //SC
SBUF = 0x00;
while (!TI);
TI=0;
//-------------------------------
for(k=0;k<8;k++)
{
TB8=1;
SBUF=send_data[k];
while(!TI);
TI=0;
}
//-------------------------------
// for(k=0;k<512-8;k++)
// {
// TB8=1;
// SBUF=0x00;
// while(!TI);
// TI=0;
// }
P31=1;
}
void effect_1()
{
unsigned char n;
if(send_data[4]>=send_data[5])
{
send_data[0]=0xf0;
send_data[1]=0x00;
send_data[2]=0x00;
send_data[3]=0x00;
send_data[4]=0xf0;
send_data[5]=0x00;
send_data[6]=0x00;
send_data[7]=0x10;
DMX512_SendData();
// send_data[8]={0xf0,0x00,0x00,0x00,0xf0,0x00,0x00,0xf0};
for(n=send_data[5];send_data[4]>0&send_data[5]<256;)
{
send_data[4]=send_data[4]-1;
send_data[5]=send_data[5]+1;
DMX512_SendData();
yanshi(8);
}
}
else
{
send_data[0]=0xf0;
send_data[1]=0x00;
send_data[2]=0x00;
send_data[3]=0x00;
send_data[4]=0x00;
send_data[5]=0xf0;
send_data[6]=0x00;
send_data[7]=0x10;
DMX512_SendData();
}
}
void effect_2() //渐灭
{
unsigned char n;
if(send_data[0]>1)
{
send_data[0]=0xf0;
send_data[1]=0x00;
send_data[2]=0x00;
send_data[3]=0x00;
send_data[4]=0xf0;
send_data[5]=0x00;
send_data[6]=0x00;
send_data[7]=0xf0;
DMX512_SendData();
for(n=send_data[0];n>0;n--)
{
send_data[0]=n;
DMX512_SendData();
yanshi(9);
}
}
else
{
send_data[0]=0x00;
send_data[1]=0x00;
send_data[2]=0x00;
send_data[3]=0x00;
send_data[4]=0x00;
send_data[5]=0x00;
send_data[6]=0x00;
send_data[7]=0x00;
DMX512_SendData();
}
// send_data[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
}
void Max232() interrupt 4 //232数据串口
{
}
void main()
{
init();
while(1)
{
// DMX512_SendData();
// while(1);
while(!P10)
{
effect_1(); //红渐变绿 OK
}
while(!P11)
{
effect_2(); //渐灭 OK
}
}
}