这部分为接收部分:
/********************************************************************************/
/* function : vm_start_bit_check_start() */
/* created : hw-chen */
/* descript : 设置VM开始位检测 */
/********************************************************************************/
void vm_start_bit_check_start(void)
{ EX0=0x0; //* 需要关闭外部VM-RXD管脚的中断
recv_vm_steps=0x0;
recv_vm_flags=0x0;
recv_vm_mdata=0x0;
TR0=0x00;
TH0=0xF9; //* 只需要一半的时间
TL0=0x48;
TR0=0x01;
}
/********************************************************************************/
/* function : recv_mdata_isr_process() */
/* created : hw-chen */
/* descript : 开始接收数据 */
/********************************************************************************/
void recv_mdata_isr_process(void)
{ TR0=0x00;
TH0=0xF2;
TL0=0x80;
TR0=0x01;
recv_vm_steps++;
switch(recv_vm_steps)
{
case 0x1:
if((VM_RXD)){
IE0=0x0; //* 必须清除这个标记
TR0=0x0; //* 禁止定时器
EX0=0x1; //* 打开外部VM-RXD管脚的中断
}
break;
case 0x2:
if((VM_RXD))
recv_vm_mdata|=0x1;
else
recv_vm_mdata&=0xFE;
break;
case 0x3:
if((VM_RXD))
recv_vm_mdata|=0x2;
else
recv_vm_mdata&=0xFD;
break;
case 0x4:
if((VM_RXD))
recv_vm_mdata|=0x4;
else
recv_vm_mdata&=0xFB;
break;
case 0x5:
if((VM_RXD))
recv_vm_mdata|=0x8;
else
recv_vm_mdata&=0xF7;
break;
case 0x6:
if((VM_RXD))
recv_vm_mdata|=0x10;
else
recv_vm_mdata&=0xEF;
break;
case 0x7:
if((VM_RXD))
recv_vm_mdata|=0x20;
else
recv_vm_mdata&=0xDF;
break;
case 0x8:
if((VM_RXD))
recv_vm_mdata|=0x40;
else
recv_vm_mdata&=0xBF;
break;
case 0x9:
if((VM_RXD))
recv_vm_mdata|=0x80;
else
recv_vm_mdata&=0x7F;
break;
case 0xA:
if((VM_RXD)){
recv_vm_flags=0x1;
}
recv_vm_sbuff=recv_vm_mdata;
IE0=0x0; //* 必须清除这个标记
TR0=0x0; //* 停止定时器
EX0=0x1; //* 打开外部VM-RXD管脚的中断
break;
default:
IE0=0x0; //* 必须清除这个标记
TR0=0x0; //* 停止定时器
EX0=0x1; //* 打开外部VM-RXD管脚的中断
break;
}
}
文章评论(0条评论)
登录后参与讨论