⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart.c

📁 NEC527多功能电表完整源代码,包括LCD驱动,显示,计量,存储,整个527驱动程序!
💻 C
字号:
#pragma interrupt	INTSR6		MD_INTSR6
#pragma interrupt	INTST6		MD_INTST6
#pragma interrupt	INTSR0		MD_INTSR0
#pragma interrupt   INTST0         MD_INTST0
#include "includes.h"

unsigned char CommPortChose;
unsigned char _wait_time = 0;
unsigned char _baud_rate;
unsigned char _h_baud_rate = DEFAULT_H_BAUD_RATE;

void SetUart2BaudRate( void );

const unsigned char _mcu_br[ ] = 
{
    0x07, 0x68,  //300
    0x07, 0x34,  //600
    0x06, 0x34,  //1200
    0x06, 0x1A,  //2400
    0x05, 0x1A,  //4800
    0x04, 0x1A,  //9600
};


unsigned char JudgeUart0BaudRate( void )
{
    unsigned char i, brs = _baud_rate;
    for ( i = 0; i < 7; i++ )
    {
        if ( brs &0x02 )
        {
            return i;
        }

        brs >>= 1;
    }
    return 2;
}

/**************************************************************************/
/*                                                                        */
/**************************************************************************/

void SetUart0BaudRate( void )
{
    unsigned char br = JudgeUart0BaudRate() *2;
    CKSR6 = _mcu_br[ br ]; //这个是分频多少个2的次方
    BRGC6 = _mcu_br[ br + 1 ]; //这个是分频多少次方以后再分频多少次
}

/**************************************************************************/
/*                                                                        */
/**************************************************************************/

void Uart0StartToRx( void )
{
    ASIM6 = 0;
    RS485_RX_EN();
    _disable_interrupt();
    ASIM6 = ( BIT4 | BIT3 | BIT2 | BIT0 ); //偶校验 8位数据
    ASICL6 = 0x16;
    SetUart0BaudRate();
    SRIF6 = 0; //清中断接收标志
    SRMK6 = 0;
    STMK6 = 1; //接收中断关掉
    SRPR6 = 1; //中断优先级	
    ASIM6 |= ( BIT7 | BIT5 ); //充许操作充许接收
    _enable_interrupt();
}

/**************************************************************************/
/*                                                                        */
/**************************************************************************/

void Uart0StartToSend( void )
{
    RS485_TX_EN();
    Uar0tSend0xFE();
    STMK6 = 0; //开发送中断
    FramePointer = 0;
    TXB6 = FrameBuffer[ FramePointer++ ];
    _wait_time = COMM_TIMEOUT;
}

/**************************************************************************/
/*                                                                        */
/**************************************************************************/

void Uar0tSend0xFE( void )
{
    unsigned short count;
    unsigned char i;
    _disable_interrupt();
    ASIM6 = 0;
    ASIM6 = ( BIT4 | BIT3 | BIT2 ); //偶校验 8位数据
    ASICL6 = 0x16;
    SetUart0BaudRate();
    SRIF6 = 0; //清中断接收标志
    STMK6 = 1;
    SRMK6 = 1; //中断屏蔽
    STMK6 = 1; //关接收中断	
    ASIM6 |= ( BIT7 | BIT6 ); //充许操作充许接收发送
    _enable_interrupt();
    ClrIORBit( IF0H, BIT1 );
    for ( i = 0; i < 4; i++ )
    {
        count = 0;
        TXB6 = 0xFE;
        while (  ! ( IF0H &BIT1 ) )
//这是用待发送完成的方式来做发送4个FE
        {
            if ( count++ > 3000 )
            {
                break;
            }
        }
        ClrIORBit( IF0H, BIT1 );
    }

}

/**************************************************************************/
/*                                                                        */
/**************************************************************************/

void Uar2tSend0xFE( void )
{
    unsigned short count;
    unsigned char i;
    _disable_interrupt();
    ASIM0 &=  ~ ( BIT5 | BIT6 ); //按照手册上说的先对RXE0清空
    POWER0 = 0;
    Delay( 2 );
    ASIM0 = ( BIT4 | BIT3 | BIT2 ); //偶校验 8位数据
    BRGC0 = 0xCD; //9600	
    POWER0 = 1;
    SRIF0 = 0; //清中断接收标志
    SRMK0 = 1; //关中断
    ASIM0 |= BIT6; //充许操作充许发送
    STMK0 = 1; //关接收中断
    _enable_interrupt();
    for ( i = 0; i < 4; i++ )
    {
        count = 0;
        TXS0 = 0xFE;
        while (  ! ( IF0H &BIT2 ) )
//这是用待发送完成的方式来做发送4个FE
        {
            ClrWdt();
            if ( count++ > 3000 )
            {
                break;
            }
        }
        ClrIORBit( IF0H, BIT2 );
    }
}

/**************************************************************************/
/*                                                                        */
/**************************************************************************/

__interrupt void MD_INTSR6( void ) //这个是485的第一个
{
    if (  ! CommPortChose )
    {
        CommPortChose = RS485_PORT;
    }
    if ( CommPortChose == RS485_PORT )
    {
        UartRxByte = RXB6;
        RxFrameDispose();
    }
}

/**************************************************************************/
/*                                                                        */
/**************************************************************************/

__interrupt void MD_INTST6( void ) //这个是485的第一个
{
    if ( FramePointer >= FrameBuffer[ FRM_DATALEN ] + 12 )
    {
        SYS_EVT_ADD(EVT_INIT_COMM);
    }
    else
    {
        _wait_time = COMM_TIMEOUT;
        TXB6 = FrameBuffer[ FramePointer++ ];
    }
}

/**************************************************************************/
/*                                                                        */
/**************************************************************************/

unsigned char JudgeUart2BaudRate( void )
{
    unsigned char i, brs = _h_baud_rate;
    for ( i = 0; i < 7; i++ )
    {
        if ( brs &0x02 )
        {
            return i;
        }
        brs >>= 1;
    }
    return 5;
}

/**************************************************************************/
/*                                                                        */
/**************************************************************************/

void Uart2StartToRx( void )
{
    RS485_RX_EN2();
    _disable_interrupt();
    ASIM0 &=  ~ ( BIT5 | BIT6 ); //按照手册上说的先对TXE0清空
    Delay( 2 );
    POWER0 = 0;
    ASIM0 = ( BIT4 | BIT3 | BIT2 | BIT0 ); //偶校验 8位数据
    BRGC0 = 0xCD; //这个是9600波特率
    STMK0 = 1;
    SRPR0 = 1; //提高一下中断优先级
    ASIM0 |= ( BIT5 ); //充许操作充许接 
    SRIF0 = 0; //清中断接收标志
    SRMK0 = 0; //开中断
    POWER0 = 1;
    _enable_interrupt();
}

/**************************************************************************/
/*                                                                        */
/**************************************************************************/

void Uart2StartToSend( void )
{
    RS485_TX_EN2();
    Uar2tSend0xFE();
    STMK0 = 0;
    _NOP();
    FramePointer = 0;
    TXS0 = FrameBuffer[ FramePointer++ ];
    _wait_time = COMM_TIMEOUT;
}

/**************************************************************************/
/*                                                                        */
/**************************************************************************/

__interrupt void MD_INTSR0( void )
{
    if (  ! CommPortChose )
    {
        CommPortChose = RS485_2_PORT;
    }

    if ( CommPortChose == RS485_2_PORT )
    {
        UartRxByte = RXB0;
        RxFrameDispose();
    }
}

/**************************************************************************/
/*                                                                        */
/**************************************************************************/

__interrupt void MD_INTST0( void )
{
    if ( FramePointer >= FrameBuffer[ FRM_DATALEN ] + 12 )
    {
        SYS_EVT_ADD(EVT_INIT_COMM);
    }
    else
    {
        _wait_time = COMM_TIMEOUT;
        TXS0 = FrameBuffer[ FramePointer++ ];
    }
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -