您当前的位置:五五电子网电子知识单片机-工控设备STC单片机(用STC89C51RC/RD+实现多串口 正文
用STC89C51RC/RD+实现多串口

用STC89C51RC/RD+实现多串口

点击数:7644 次   录入时间:03-04 11:39:48   整理:http://www.55dianzi.com   STC单片机(
#define rs_TEST_L rs_TEST & 0x00FF            //低位 

//发送起始位所需定时器总计数  
#define rs_START_BIT 0xFFFF - (Fosc/12/Baud) + 0x28
#define rs_START_BIT_H rs_START_BIT >> 8      //发送起始位所需定时器计数高位   
#define rs_START_BIT_L rs_START_BIT & 0x00FF  //发送起始位所需定时器计数低位  

#define rs_RECEIVE_MAX   128                  //最大接收长度 
INT8U idata rs232buffer[rs_RECEIVE_MAX];      //收、发缓冲区
INT16U ReceivePoint;                       //接收数据存储指针 

void soft_rs232_interrupt( void );

#ifdef TIMER_0
    void timer0 (void) interrupt 1 using 3
    {
        if (rs_RXD == 0 | rs_shift_count > 0)
        { soft_rs232_interrupt(); }
        else
        {
            rs_timerH = rs_TEST_H;
            rs_timerL = rs_TEST_L;
        }
    }
#endif

#ifdef TIMER_1
    void timer1 (void) interrupt 3 using 3
    {
        if (rs_RXD == 0 | rs_shift_count > 0)
        { soft_rs232_interrupt(); }
        else
        {
            rs_timerH = rs_TEST_H;
            rs_timerL = rs_TEST_L;
        }
    }
#endif
/***************************************/

void soft_rs232_init (void)            //串口初始化 
{
    TCON_ENABLE_TIMER = 0;             //停止定时器 
    TMOD &= TMOD_AND_WORD;
    TMOD |= TMOD_TIME_MODE;
    rs_RXD = 1;                        //接收脚置成高电平 
    rs_TXD = 1;                        //发射脚置成高电平 
    IP_PTx = 1;                        //置中断优先级为高 
    IE_ETx = 1;                        //允许定时器中断   
}

void soft_receive_init()               //监测起始位 
{
    TCON_ENABLE_TIMER = 0;             //停止定时器 
    rs_timerH = rs_TEST_H;
    rs_timerL = rs_TEST_L;
    rs_shift_count = 0;
    TCON_ENABLE_TIMER = 1;             //启动定时器 
}


void soft_receive_enable()             //允许接收 
{
    rs_f_RI_enable = 1;                //允许接收 
    rs_f_TI_enable = 0;                //禁止发送  
    soft_receive_init();               //监测起始位, RXD 下降沿触发接收字节过程.    
}

void soft_send_enable (void)        //允许发送 
{
    TCON_ENABLE_TIMER = 0;             //停止定时器 
    rs_f_TI_enable = 1;                //允许发送 
    rs_f_RI_enable = 0;                //禁止接收 

    rs_shift_count = 0;                //清移位计数器 
    rs_f_TI   = 1;                     //发送一个字符完毕标志 
    TCON_ENABLE_TIMER = 1;             //启动定时器
}

void soft_rs232_interrupt( void )
{
    /************************ 接收 ****************************/
    if (rs_f_RI_enable == 1)
    {
        if (rs_shift_count == 0)        //移位计数器==0, 表示检测到起始位的起点  
        {
            if ( rs_RXD == 1 )
            {
                soft_receive_enable (); //起始位错, 从新开始  
            }
            else
            {
                //下次中断在数据位或停止位中的某时刻发生   
                rs_timerL += rs_FULL_BIT_L + 0x10;
                rs_timerH = rs_FULL_BIT_H;
                rs_shift_count++;             
                rs_BUF = 0;             //清移位缓冲变量  
            }
        }
        else
        {
            rs_timerL += rs_FULL_BIT_L; //下次中断在数据位或停止位中发生   
            rs_timerH = rs_FULL_BIT_H;

上一页  [1] [2] [3] [4]  下一页


本文关键字:暂无联系方式STC单片机(单片机-工控设备 - STC单片机(