以前搞过,见下面(部分):
//*****************UART中断子函数********************
//***************************************************
void uart_int0(void) interrupt 4
{
if(f_dmx==1) //如果是dmx模式,则执行下面内容
{
uchar iv;
databuff=SBUF;
RI=0;
if(RB8==0)
{
CHK_SIGN=0; //清接允许接收数据标志位
if(databuff==0) //接收到的数据为0时,说明接收到起始信号
{
DMX_SIGN=0; //允许接收起始代码(低电平有效)
ADDR_CON=0; //地址位记数器复位
RECDAT=0; //数据接收个数控制 起始后清零
return;
}
else //没有接收到起始信号,则
{
DMX_SIGN=1; //暂停接收起始代码
return;
}
}
else
{
if(CHK_SIGN==0)
{
if(DMX_SIGN==0)
{
DMX_SIGN=1;
if(databuff==0)
{
CHK_SIGN=1; //收到起始代码 CHK_SIGN=1表示可以接受下面的数据
return;
}
}
return; //没有接收到起始代码
}
if(CHK_SIGN==1) //收到起始代码后,则
{
ADDR_CON++; //地址计数器加1
if(ADDR_CON>=address) //判断当前地址号计数器是否属于本机地址
{
Dmxdata_temp[RECDAT]=SBUF; //接收数据
RECDAT++; //准备接收下一个数据
if(RECDAT>=7)
{
CHK_SIGN=0; //接收完毕暂停,等待下一个启动信号
iv=0;
for(iv=0;iv<7;iv++) //iv的大小限制了后面的非本地址的内容无效
{
if(Dmxdata[iv]!=Dmxdata_temp[iv]) //把接收到的所有DMX数据copy给数组Dmxdata[iv]
{
Dmxdata[iv]=Dmxdata_temp[iv];
f_dmx_update=1; //DMX数据更新标志位
}
}
}
}
return;
}
}
}
else
{
if((f_dimming==1)|(f_change==1)|(f_fade==1)|(f_sound==1))
{
RI=0;
return; //要是调光或者彩变或者渐变或者声控的话,则不接受
}
else receive_data_from_master(); //本机处于从功能模式,则接收主机的内容(注:不是DMX512控制台内容)
}
}
|