原创 C51虚拟串口设计(二)

2007-11-23 17:15 1950 5 5 分类: 消费电子

这部分为接收部分:


/********************************************************************************/
/* 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;
    }
}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /4 下一条