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

📄 16c554.c

📁 16c654.cIAR2.31下调试通过
💻 C
📖 第 1 页 / 共 3 页
字号:
    {
        switch(status_554cisr)
        {
            case 0x00:                                            //MODEM中断
            case 0xc0:
                 con_port |= MSR;
                 con_port &= ~CSC;
                 con_port ^= READ_EN;                             //MSR
                 status_554cmsr = data_in_port;                   //读和清零MSR
                 
                 if((status_554cmsr & 0x08) == 0x08)
                 {
                     if((status_554cmsr & 0x80) == 0)                 //载波信号检测
                     {
                         DCD_flag = 0;
                         send_data_554(M_com_escape,num5,2);        //发送挂机命令
                         send_data_554(M_com_end,num6,2);
                         break;
                     }
                     else DCD_flag = 1;
                 }
                 /*
                 if(((status_554cmsr & 0x04)==0x04))
                 {
                     send_data_554(M_com_start,num7,2);
                 }
                 */
                 break;

            case 0x04:                                            //接收中断
            case 0x0c:
                 if(!Rx_full_554c)                                //缓冲区未满
                 {                  
                     con_port |= LSR;
                     con_port &= ~CSC;
                     con_port ^= READ_EN;                         //LSR
                     while((data_in_port & 0x01) == 0 )           //接收寄存器是否有数据
                     {
                         con_port = con_leisure;
                         con_port |= LSR;
                         con_port &= ~CSC;
                         con_port ^= READ_EN;                     //LSR
                     }
                     con_port = con_leisure;
                     
                     con_port |= RHR;
                     con_port &= ~CSC;
                     con_port ^= READ_EN;                         //rhr
                     rx_temp2_554c = data_in_port;    //接收到的数据存入数组
                     con_port = con_leisure;
                     
                     if(Rx_554c_start)                        //判断是否开始接收数据包
                     {
                         rxdata[2+2][Rx_in_554c] = rx_temp2_554c;//数据存入缓冲数组
                         data_num_554c++;                     //接收到的数据个数
                         Rx_in_554c++;
                             
                         if(data_num_554c == data_maxc)       //判断是否接收完一个数据包
                         {
                             checksumc=0;
                             for (i=2;i<data_maxa-1;i++)
                                checksumc+=rxdata[2+2][i];                         
                             if(checksumc == rxdata[2+2][Rx_in_554c-1])  //校验和判断
                                port554_r=4;   
                             //////////////////////////////////
                             //   command_oper(4);
                             Rx_554c_start = 0;               //标志位清零
                             data_num_554c = 0;
                             Rx_flag_554[2]++;                //数据包个数
                             Rx_in_554c = 0;
                         }
                         else if(data_maxc-data_num_554c != 1)
                                  checksumc += rx_temp2_554c;
                     }
                     else if( ( rx_temp1_554c == 0xEB) && (rx_temp2_554c == 0x90) )    //数据包的包头
                          {
                              Rx_in_554c = 0;
                              rxdata[2+2][Rx_in_554c] = 0xeb;                        //包头数据存入缓冲数组
                              Rx_in_554c++;
                              rxdata[2+2][Rx_in_554c] = 0x90;
                              Rx_in_554c++;
                              checksumc =0;
                              Rx_554c_start = 1;                                       //标志位置1
                              data_num_554c = 2;
                          }
                          else rx_temp1_554c = rx_temp2_554c;
                 }
                 else                                             //缓冲数组已满
                 {
                     Rx_full_554c = 0;                    //没有溢出就把溢出标志清零
                     Rx_in_554c = 0;

                     con_port |= RHR;
                     con_port &= ~CSC;
                     con_port ^= READ_EN;                     //rhr
                     rx_temp1_554c = data_in_port;            //接收到的数据存入数组
                     con_port = con_leisure;

                 }
                 break;
            
         default:break;
        }
        con_port = push;
        if((P2IN & 0x04) == 0)
        {
            P2IFG &= 0x0fb;                                       //清中断标志位
        }
    }
    
    if((status_554disr & 0x01) == 0)               //判断是否是D口产生的中断
    {
        switch(status_554disr)                     //中断类型选择
        {                 
            case 0x04:                                            //接收中断
            case 0x0c:
                 if(!Rx_full_554d)                                //缓冲区未满
                 {                  
                     con_port |= LSR;
                     con_port &= ~CSD;
                     con_port ^= READ_EN;                         //LSR
                     while((data_in_port & 0x01) == 0 )           //接收寄存器是否有数据
                     {
                         con_port = con_leisure;
                         con_port |= LSR;
                         con_port &= ~CSD;
                         con_port ^= READ_EN;                     //LSR
                     }
                     con_port = con_leisure;
                     
                     con_port |= RHR;
                     con_port &= ~CSD;
                     con_port ^= READ_EN;                         //rhr
                     rx_temp2_554d = data_in_port;    //接收到的数据存入数组
                     con_port = con_leisure;
                     
                     if(Rx_554d_start)                        //判断是否开始接收数据包
                     {
                         rxdata[2+3][Rx_in_554d] = rx_temp2_554d;//数据存入缓冲数组
                         data_num_554d++;                     //接收到的数据个数
                         Rx_in_554d++;
                             
                         if(data_num_554d == data_maxd)       //判断是否接收完一个数据包
                         {
                             checksumd=0;
                             for (i=2;i<data_maxa-1;i++)
                                checksumd+=rxdata[2+3][i];                         
                             if(checksumd == rxdata[2+3][Rx_in_554d-1])  //校验和判断
                                port554_r=5;
                             //////////////////////////////////
                             //   digit_sensor(5);
                             Rx_554d_start = 0;               //标志位清零
                             data_num_554d = 0;
                             Rx_flag_554[3]++;                //数据包个数
                             Rx_in_554d = 0;
                         }
                         else if(data_maxd-data_num_554d != 1)
                                  checksumd += rx_temp2_554d;
                     }
                     else if( ( rx_temp1_554d == 0xEB) && (rx_temp2_554d == 0x90) )    //数据包的包头
                          {
                              Rx_in_554d = 0;
                              rxdata[2+3][Rx_in_554d] = 0xeb;                        //包头数据存入缓冲数组
                              Rx_in_554d++;
                              rxdata[2+3][Rx_in_554d] = 0x90;
                              Rx_in_554d++;
                              checksumd =0;
                              Rx_554d_start = 1;                                       //标志位置1
                              data_num_554d = 2;
                          }
                          else rx_temp1_554d = rx_temp2_554d;
                 }
                 else                                             //缓冲数组已满
                 {
                     Rx_full_554d = 0;                    //没有溢出就把溢出标志清零
                     Rx_in_554d = 0;

                     con_port |= RHR;
                     con_port &= ~CSD;
                     con_port ^= READ_EN;                     //rhr
                     rx_temp1_554d = data_in_port;            //接收到的数据存入数组
                     con_port = con_leisure;

                 }
                 break;
            
         default:break;
        }
        if((P2IN & 0x01) == 0)
        {
            P2IFG &= 0x0f7;                                       //清中断标志位
        }
    }
    
    data_port_dir = 0x0ff;
    con_port = push;

}


/*
void main(void)
{
    unsigned char j,temp;
    unsigned char i=1;
    
    WDTCTL = WDTPW + WDTHOLD;
    
    //init_16c554(0,9600);                               //16c554初始化A口
    //init_16c554(1,9600);                               //B口的初始化
    //init_16c554(3,9600);                               //D口的初始化
    init_16c554c(9600);                                //C口的初始化
    init_parameter();
    init_modem();                                      //C口的modem初始化
    
    delays(1);
    send_data_554(M_com_dial,num3,2);                  //at z1,at ds=0 (拨号)
    delays(1);
    while(DCD_flag == 0);
    
    j = 5;
    while(--j)
    {
        delays(1);
        
        send_data_554(txdata1,25,2);                   //发送数据
        
        delays(1);
    }//while
    
    send_data_554(M_com_escape,num5,2);
    delays(1);
    send_data_554(M_com_end,num6,2);                        //+++ ,at h0 (挂机命令)
}

*/

void pstn_send(unsigned char *txdata1)
{
    send_data_554(PSTN_num,num3,2);                  //at z1,at ds=0 (拨号)
    while(DCD_flag == 0);    
    delays(1);
    send_data_554(txdata1,23,2);                   //发送数据
    delays(1);
    send_data_554(M_com_escape,num5,2);
    delays(1);
    send_data_554(M_com_end,num6,2);                        //+++ ,at h0 (挂机命令)	
}

void pstn_init(unsigned int pstn_bps)
{
    init_16c554c(pstn_bps);                                //C口的初始化
    init_parameter();
    init_modem();                                      //C口的modem初始化	
}

void low_power(void)
{
    con_port |= LCR;                 //LCR
    con_port &= ~CSA;
    con_port ^= WRITE_EN;             
    data_out_port = 0x0bf;            //8 bit_data, 1 bit_stop, no parity
    con_port = con_leisure;
    
    con_port |= EFR;                 //EFR
    con_port &= ~CSA;
    con_port ^= WRITE_EN;             
    data_out_port = 0x10;            //sleep mode
    con_port = con_leisure;
    
    con_port |= LCR;               //LCR
    con_port &= ~CSA;
    con_port ^= WRITE_EN;             
    data_out_port = 0x03;          //8 bit_data, 1 bit_stop, no parity
    con_port = con_leisure;
    
    con_port |= LCR;                 //LCR
    con_port &= ~CSB;
    con_port ^= WRITE_EN;             
    data_out_port = 0x0bf;            //8 bit_data, 1 bit_stop, no parity
    con_port = con_leisure;
    
    con_port |= EFR;                 //EFR
    con_port &= ~CSB;
    con_port ^= WRITE_EN;             
    data_out_port = 0x10;            //sleep mode
    con_port = con_leisure;
    
    con_port |= LCR;               //LCR
    con_port &= ~CSB;
    con_port ^= WRITE_EN;             
    data_out_port = 0x03;          //8 bit_data, 1 bit_stop, no parity
    con_port = con_leisure;
    
    con_port |= LCR;                 //LCR
    con_port &= ~CSC;
    con_port ^= WRITE_EN;             
    data_out_port = 0x0bf;            //8 bit_data, 1 bit_stop, no parity
    con_port = con_leisure;
    
    con_port |= EFR;                 //EFR
    con_port &= ~CSC;
    con_port ^= WRITE_EN;             
    data_out_port = 0x10;            //sleep mode
    con_port = con_leisure;
    
    con_port |= LCR;               //LCR
    con_port &= ~CSC;
    con_port ^= WRITE_EN;             
    data_out_port = 0x03;          //8 bit_data, 1 bit_stop, no parity
    con_port = con_leisure;
    
    con_port |= LCR;                 //LCR
    con_port &= ~CSD;
    con_port ^= WRITE_EN;             
    data_out_port = 0x0bf;            //8 bit_data, 1 bit_stop, no parity
    con_port = con_leisure;
    
    con_port |= EFR;                 //EFR
    con_port &= ~CSD;
    con_port ^= WRITE_EN;             
    data_out_port = 0x10;            //sleep mode
    con_port = con_leisure;
    
    con_port |= LCR;               //LCR
    con_port &= ~CSD;
    con_port ^= WRITE_EN;             
    data_out_port = 0x03;          //8 bit_data, 1 bit_stop, no parity
    con_port = con_leisure;
}

⌨️ 快捷键说明

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