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

2007-11-23 17:56 1853 5 5 分类: 消费电子

其他部分:


#define VM_XMIT_LEN         0x40
#define VM_XMIT_MSK         0x3F
#define VM_RXD              P3_2    //* 需要利用外部中断0
#define VM_TXD              P3_3


unsigned char data recv_vm_steps=0x0;
unsigned char data recv_vm_flags=0x0;
unsigned char data recv_vm_mdata=0x0;
unsigned char data recv_vm_sbuff=0x0;
unsigned char data xmit_vm_steps=0x0;
unsigned char data xmit_vm_flags=0x0;
unsigned char data xmit_vm_mdata=0x0;
unsigned char xmit_vm_buffer[VM_XMIT_LEN];
unsigned char xmit_vm_wr=0x0;
unsigned char xmit_vm_rd=0x0;
unsigned char recv_vm_buffer[VM_RECV_LEN];
unsigned char recv_vm_wr=0x0;


/********************************************************************************/
/* function : vm_io_initialize()                                                */
/* created  : hw-chen                                                           */
/* descript : 初始化虚拟串口                                                    */
/********************************************************************************/
void vm_io_initialize(void)
{   EX0=0x1;
    IT0=0x1;   //* 设置INT0为下降沿中断方式
    xmit_vm_steps=0x0;
    xmit_vm_flags=0x0;
    xmit_vm_mdata=0x0;
    xmit_vm_wr   =0x0;
    xmit_vm_rd   =0x0;
    recv_vm_wr   =0x0;
    recv_vm_steps=0x0;
    recv_vm_flags=0x0;
    recv_vm_mdata=0x0;
}


/********************************************************************************/
/* fun_name : timer_0_initialize()                                              */
/* descript : called by main initialize                                         */
/* version  : v1.00                                                             */
/* created  : hw-chen                                                           */
/*   1200的波特率,每位数据需要833.3US,每位数据的中间采样,起始位的中间只有一半   */
/*   的时间,定时器为416.667US,然后其他位都是833.3US                             */
/*   起始位:VALUE=65536-50000000x0.0004167/12=0xF938-0x10                       */
/*   其它位:VALUE=65536-50000000x0.0008333/12=0xF270-0x10                       */
/*   由于不是自动加载,需要减去系统的压栈和中断响应周期,查看汇编需要16指令周期   */
/********************************************************************************/
void timer_0_initialize(void)
{   TMOD &= 0xF0;   //* TMOD: timer 0, mode 1, 16-bit load
    TMOD |= 0x01;   //* 模式1,16位模式
    TR0   = 0x0;
}


/********************************************************************************/
/* function : timer_2_initialize()                                              */
/* created  : hw-chen                                                           */
/* descript :                                                                   */
/*    由于采用VM串口的发送定时器,1200的波特率,每位定时0.8333MS=0.0008333S       */
/*    VALUE="65536-"(oscxtime(s))/12=65536-50000000 x0.0008333/12(=3472 )         */
/*    定时器2处于16位自动加载模式,不会产生定时误差                              */
/********************************************************************************/
void timer_2_initialize(void)
{   RCAP2H= 0xF2;
    RCAP2L= 0x70;
    TR2   = 0x01;
    ET2   = 0x01;
}


/********************************************************************************/
/* function : extern_0_interrupt()                                              */
/* created  : hw-chen                                                           */
/* descript :                                                                   */
/********************************************************************************/
void extern_0_interrupt(void) interrupt 0 using 1
{   vm_start_bit_check_start();
}


/********************************************************************************/
/* function : timer_0_interrupt()                                               */
/* created  : hw-chen                                                           */
/* descript : 用作VM串口接收处理                                                */
/********************************************************************************/
void timer_0_interrupt(void) interrupt 1 using 1
{   recv_mdata_isr_process();
}


/********************************************************************************/
/* function : timer_2_interrupt()                                               */
/* created  : hw-chen                                                           */
/* descript : 用作VM串口发送处理                                                */
/*      0.8333MS定时器                                                          */
/********************************************************************************/
void timer_2_interrupt(void) interrupt 5 using 1
{   TF2=0;                      //* 需要自己清楚中断标记
    xmit_mdata_isr_process();   //* 处理VM的ISR发送细节
}


/********************************************************************************/
/* function : main()                                                            */
/* created  : hw-chen                                                           */
/* descript :                                                                   */
/********************************************************************************/
void main(void)
{   timer_0_initialize();
    vm_io_initialize();
    timer_2_initialize();
    EA =0x1;
    ET2=0x1;
    IT0=0x1;
    ET0=0x1;
    EX0=0x1;   //* 打开外部VM-RXD管脚的中断
    uart_printf("*********************************\r\n");
    uart_printf("* VM UART start ...             *\r\n");
    uart_printf("*********************************\r\n");
    while(1){
    xmit_SBUF_mdata_process();  //* 发送SBUF的数据
    recv_SBUF_mdata_process();  //* 接收SBUF的数据
    }
}

PARTNER CONTENT

文章评论0条评论)

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