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

📄 16c554.c

📁 通过车载终端采集GPS数据
💻 C
字号:
/**********************************************************
*此程序是一个测试程序,实际上GPRS是在通道A,此程序改在通道B
*16C554的驱动程序
*16C554是一个4串口的芯片
*B口分配为调试以及客流采集器
*C口分配给LED屏
**********************************************************/

#include "w77e532.h"
#include "16c554.h"
#include "uart.h"
#include "mcuInit.h"
#include "string.h"
unsigned char volatile xdata uartInt        _at_ (INT_BASE);

/*通道A的寄存器定义*/
unsigned char volatile xdata chALcr         _at_ (CHA_BASE+LCR_ADD);
unsigned char volatile xdata chAMcr         _at_ (CHA_BASE+MCR_ADD);
unsigned char volatile xdata chAIer         _at_ (CHA_BASE+IER_ADD);
unsigned char volatile xdata chAIir         _at_ (CHA_BASE+IIR_ADD);
unsigned char volatile xdata chALsr         _at_ (CHA_BASE+LSR_ADD);
unsigned char volatile xdata chAMsr         _at_ (CHA_BASE+MSR_ADD);
unsigned char volatile xdata chARxd         _at_ (CHA_BASE+RBR_ADD);
unsigned char volatile xdata chAScr         _at_ (CHA_BASE+SCR_ADD);
#define chATxd  chARxd
#define chADll  chARxd
#define chADlm  chAIer
#define chAFcr  chAIir

/*通道B的寄存器定义*/
unsigned char volatile xdata chBLcr         _at_ (CHB_BASE+LCR_ADD);
unsigned char volatile xdata chBMcr         _at_ (CHB_BASE+MCR_ADD);
unsigned char volatile xdata chBIer         _at_ (CHB_BASE+IER_ADD);
unsigned char volatile xdata chBIir         _at_ (CHB_BASE+IIR_ADD);
unsigned char volatile xdata chBLsr         _at_ (CHB_BASE+LSR_ADD);
unsigned char volatile xdata chBMsr         _at_ (CHB_BASE+MSR_ADD);
unsigned char volatile xdata chBRxd         _at_ (CHB_BASE+RBR_ADD);
unsigned char volatile xdata chBScr         _at_ (CHB_BASE+SCR_ADD);
#define chBTxd  chBRxd
#define chBDll  chBRxd
#define chBDlm  chBIer
#define chBFcr  chBIir

/*通道C的寄存器定义*/
unsigned char volatile xdata chCLcr         _at_ (CHC_BASE+LCR_ADD);
unsigned char volatile xdata chCMcr         _at_ (CHC_BASE+MCR_ADD);
unsigned char volatile xdata chCIer         _at_ (CHC_BASE+IER_ADD);
unsigned char volatile xdata chCIir         _at_ (CHC_BASE+IIR_ADD);
unsigned char volatile xdata chCLsr         _at_ (CHC_BASE+LSR_ADD);
unsigned char volatile xdata chCMsr         _at_ (CHC_BASE+MSR_ADD);
unsigned char volatile xdata chCRxd         _at_ (CHC_BASE+RBR_ADD);
unsigned char volatile xdata chCScr         _at_ (CHC_BASE+SCR_ADD);
#define chCTxd  chCRxd
#define chCDll  chCRxd
#define chCDlm  chCIer
#define chCFcr  chCIir

/*通道D的寄存器定义*/
unsigned char volatile xdata chDLcr         _at_ (CHD_BASE+LCR_ADD);
unsigned char volatile xdata chDMcr         _at_ (CHD_BASE+MCR_ADD);
unsigned char volatile xdata chDIer         _at_ (CHD_BASE+IER_ADD);
unsigned char volatile xdata chDIir         _at_ (CHD_BASE+IIR_ADD);
unsigned char volatile xdata chDLsr         _at_ (CHD_BASE+LSR_ADD);
unsigned char volatile xdata chDMsr         _at_ (CHD_BASE+MSR_ADD);
unsigned char volatile xdata chDRxd         _at_ (CHD_BASE+RBR_ADD);
unsigned char volatile xdata chDScr         _at_ (CHD_BASE+SCR_ADD);
#define chDTxd  chDRxd
#define chDDll  chDRxd
#define chDDlm  chDIer
#define chDFcr  chDIir

/*与GPRS相连的串口数据结构*/
struct 
{
    unsigned char txState;          /*发送状态标志*/
    unsigned char rxState;          /*接收状态标志*/
    unsigned char txTimer;          /*发送数据包间隔控制定时器*/
    unsigned char rxTimer; 
    unsigned int txLen;            /*发送数据长度*/
    unsigned int rxLen;            /*接收数据长度*/
    unsigned char *txPtr;           /*当前发送指针*/
    unsigned char xdata *rxHeadPtr;
    unsigned char xdata *rxCurPtr;           /*当前接收指针*/
} atInfo,siobInfo, siocInfo, siodInfo;            



/*最大发送字节减1须为全1.即须是64,128,256,512,1024,2048等*/
#define AT_MAX_SEND_BYTE    1024 - 1   
 
char xdata rxTmpBuffer[350] _at_ 0x0;


static void chA_init()
{
    //chAIer = 0x00;        /*禁止中断*/
    //return;


    /*通道A的初始化*/
    chALcr = 0x80;        /*准备设置波特率*/
    chADlm = TI16C554_38400 >> 8;//9600 >> 8;
    chADll = TI16C554_38400;//9600;
    
    chALcr = 0x03;        /*设置为8,1,N*/
    chAMcr = 0x03;        /*设置RTS,DTR有效,也可以控制环回*/
    chAFcr = 0x00;        /*采用16C450模式*/
    chAIer = 0x03;        /*允许发送和接收中断*/

}

static void chB_init()
{
    //chBIer = 0x00;        /*禁止中断*/
    //return;

    /*通道B的初始化*/
    chBLcr = 0x80;        /*准备设置波特率*/
    chBDlm = TI16C554_19200 >> 8;
    chBDll = TI16C554_19200;
    
    chBLcr = 0x03;        /*设置为8,1,N*/
    chBMcr = 0x03;        /*设置RTS,DTR有效,也可以控制环回*/
    chBFcr = 0x00;        /*采用16C450模式*/
    chBIer = 0x03;        /*允许发送和接收中断*/

}

static void chC_init()
{
  //  chCIer = 0x00;        /*禁止中断*/
    chCLcr = 0x80;        /*准备设置波特率*/
    chCDlm = TI16C554_19200 >> 8;
    chCDll = TI16C554_19200;
    
    chCLcr = 0x03;        /*设置为8,1,N*/
    chCMcr = 0x03;        /*设置RTS,DTR有效,也可以控制环回*/
    chCFcr = 0x00;        /*采用16C450模式*/
    chCIer = 0x03;        /*允许发送和接收中断*/
}

static void chD_init()
{
    chDIer = 0x00;        /*禁止中断*/
    /*通道D的初始化*/
//    chDLcr = 0x80;        /*准备设置波特率*/
//    chDDlm = TI16C554_38400 >> 8;//9600 >> 8;
//    chDDll = TI16C554_38400;//9600;
    
//    chDLcr = 0x03;        /*设置为8,1,N*/
//    chDMcr = 0x03;        /*设置RTS,DTR有效,也可以控制环回*/
//    chDFcr = 0x00;        /*采用16C450模式*/
//    chDIer = 0x03;        /*允许发送和接收中断*/
}

/**************************中断服务程序************************/
char intPend;
char bdata intSource;
sbit intChA     = intSource ^ 0;//4;     /*通道A中断*/
sbit intChB     = intSource ^ 1;//5;     /*通道B中断*/
sbit intChC     = intSource ^ 2;//6;     /*通道C中断*/
sbit intChD     = intSource ^ 3;//7;     /*通道D中断*/

void ISRExtInt1(void) interrupt 2 using 2
{

    intSource = uartInt & 0x0f;
    while(intSource != 0)
    {
        /*通道A*/
        if( intChA )
        {
            intPend = chAIir;
            if( intPend == 0x04 )
            {/*接收数据中断*/

                *atInfo.rxCurPtr = chARxd;
                atInfo.rxCurPtr ++;
                if( atInfo.rxCurPtr == (char xdata *)0x100 )
                    atInfo.rxCurPtr = (char xdata *)0;

                if( atInfo.rxHeadPtr == atInfo.rxCurPtr )
                    atInfo.rxCurPtr --;


            }
            else if( intPend == 0x02 )
            {/*发送数据中断*/

                if( atInfo.txLen == 0 )
                {
                    atInfo.txState = 0;
                }
                else
                {
                    chATxd = *atInfo.txPtr;
                    atInfo.txPtr ++;
                    atInfo.txLen --;
                }
                
            }
        }

        /*通道B*/
        if( intChB )
        {
            intPend = chBIir;
            if( intPend == 0x04 )
            {/*接收数据中断*/

                *siobInfo.rxCurPtr = chBRxd;
                siobInfo.rxTimer = 10;
                siobInfo.rxState = 1;
                if( siobInfo.rxLen < 0xFFFF )
                {
                    siobInfo.rxLen ++;
                    siobInfo.rxCurPtr ++;
                }
            }
            else if( intPend == 0x02 )
            {/*发送数据中断*/

                if( siobInfo.txLen == 0 )
                {
                    siobInfo.txState = 0;
                }
                else
                {
                    chBTxd = *siobInfo.txPtr;
                    siobInfo.txPtr ++;
                    siobInfo.txLen --;
                }
                
            }
        }


        /*通道C*/
        if( intChC )
        {
            intPend = chCIir;
            if( intPend == 0x04 )
            {/*接收数据中断*/

                *siocInfo.rxCurPtr = chCRxd;
                siocInfo.rxTimer = 10;
                siocInfo.rxState = 1;
                if( siocInfo.rxLen < 0xFF )
                {
                    siocInfo.rxLen ++;
                    siocInfo.rxCurPtr ++;
                }
            }
            else if( intPend == 0x02 )
            {/*发送数据中断*/

                if( siocInfo.txLen == 0 )
                {
                    siocInfo.txState = 0;
                }
                else
                {
                    chCTxd = *siocInfo.txPtr;
                    siocInfo.txPtr ++;
                    siocInfo.txLen --;
                }
                
            }
        }

        intSource = uartInt & 0xF0;
    }
    

}


char at_serial_send(char *ptr, unsigned int len)
{

    if( atInfo.txState )
        return -1;
    else
    {
        atInfo.txPtr = ptr;
        atInfo.txLen = len & AT_MAX_SEND_BYTE;

        chATxd = *atInfo.txPtr ++;
        atInfo.txLen --;
        return 0;
    }
}

/***************************************************
*从GPRS模块接收数据的函数
*要求发送的数据长度不能大于AT_MAX_SEND_BYTE,否则将有部分数据不发送
*入口:接收数据存放指针
*返回值:返回接收到的字节数
****************************************************/
unsigned int at_serial_receive(char **ptr)
{
    char *tmpPtr;
    unsigned int byteCount;

    byteCount = 0;

    tmpPtr = *ptr;

    while( atInfo.rxHeadPtr != atInfo.rxCurPtr )
    {
        byteCount ++;
        *tmpPtr ++ = *atInfo.rxHeadPtr++;

        if( atInfo.rxHeadPtr == (char xdata *)0x100 )
            atInfo.rxHeadPtr = (char xdata *)0;

    }

    *ptr = tmpPtr;

    return(byteCount);
}

/************************通道B*************************************************/
char xdata siobRxBuffer[520];


char siob_send(char *ptr, unsigned int len)
{

    if( siobInfo.txState )
        return -1;
    else
    {
		siobInfo.txState=1;
        siobInfo.txPtr = ptr;
        siobInfo.txLen = len;
        chBTxd = *siobInfo.txPtr ++;
        siobInfo.txLen --;
		while(siobInfo.txState==1);
        return 0;
    }
}

void siob_start_receive(void)
{
    siobInfo.txTimer = 0;
    siobInfo.rxState = 0;
    siobInfo.rxLen = 0;
    siobInfo.rxCurPtr = siobRxBuffer;

}

unsigned int siob_receive(char **ptr)
{
    *ptr = siobRxBuffer;

    if( siobInfo.rxState == 5 )
        return siobInfo.rxLen;
    else
        return 0;
}

void siob_timeout(void)
{

    if( siobInfo.rxState == 1)
    {
        siobInfo.rxTimer --;
        if( !siobInfo.rxTimer )
        {
            siobInfo.rxState = 5;
            siobInfo.rxTimer = 0;
        }
    }
    else if( siobInfo.rxState != 5 )
    {
        siobInfo.rxState = 0;
        siobInfo.rxLen = 0;
    }

}

/************************通道C*************************************************/
char xdata siocRxBuffer[256];


char sioc_send(char *ptr, unsigned int len)
{

    if( siocInfo.txState )
        return -1;
    else
    {
        siocInfo.txState = 1;
        siocInfo.txPtr = ptr;
        siocInfo.txLen = len;

        chCTxd = *siocInfo.txPtr ++;
        siocInfo.txLen --;
        return 0;
    }
}

void sioc_start_receive(void)
{
    siocInfo.txTimer = 0;
    siocInfo.rxState = 0;
    siocInfo.rxLen = 0;
    siocInfo.rxCurPtr = siocRxBuffer;

}

char sioc_receive(char **ptr)
{
    *ptr = siocRxBuffer;

    if( siocInfo.rxState == 5 )
        return siocInfo.rxLen;
    else
        return 0;
}

void sioc_timeout(void)
{

    if( siocInfo.rxState == 1)
    {
        siocInfo.rxTimer --;
        if( !siocInfo.rxTimer )
        {
            siocInfo.rxState = 5;
            siocInfo.rxTimer = 0;
        }
    }
    else if( siocInfo.rxState != 5 )
    {
        siocInfo.rxState = 0;
        siocInfo.rxLen = 0;
    }

}

/*****************************其它文件使用的函数**********************************/
void tl16c554_init()
{
    /**/
    atInfo.rxState = 0;
    atInfo.txState = 0;
    atInfo.rxLen = 0;
    atInfo.txLen = 0;
    atInfo.txTimer = 0;
    atInfo.rxHeadPtr = rxTmpBuffer;
    atInfo.rxCurPtr = atInfo.rxHeadPtr;
    memset(rxTmpBuffer, 0, sizeof(rxTmpBuffer));

    memset(&siobInfo, 0, sizeof(siobInfo) );
    memset(siobRxBuffer, 0, sizeof(siobRxBuffer) );
    siob_start_receive();
    siobInfo.txTimer = 10;

    memset(&siocInfo, 0, sizeof(siocInfo) );
    memset(siocRxBuffer, 0, sizeof(siocRxBuffer) );
    sioc_start_receive();
    siocInfo.txTimer = 10;

    /**/
    chA_init();
    chB_init();
    chC_init();
    chD_init();




    /*初始化中断1*/
    IT1 = 0;    /*为电平触发方式*/
    EX1 = 1;
    
}

⌨️ 快捷键说明

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