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

📄 16m

📁 基于CAN总线的NMEA2000协议
💻
📖 第 1 页 / 共 2 页
字号:

        ir    =   readSJAreg( CAN_IR ) ;
}



/*************************************************************/
/*************     接收子程序                 ****************/
/*************  将接收到的数据存入rx_data[]中      ***********/
/*************************************************************/
void can_rxdata ( void )
{
        unsigned char  length;
        unsigned char  i;

        rx_data[0] = length = readSJAreg( 16 ) ;


        switch(length&0xC0)
        {
                case    0x00:  /*标准帧、数据帧*/
                               length  = ( rx_data[0] & 0x0f ) ;
                               if(length>8)   length  =  8;
                               length  +=  3;  break ;
                case    0x40:  /*标准帧、远程帧*/
                               length  =   3;  break ;
                case    0x80:  /*扩展帧、数据帧*/
                               length  = ( rx_data[0] & 0x0f ) ;
                               if(length>8)   length  =  8;
                               length  +=  5;  break ;
                case    0xc0:  /*扩展帧、远程帧*/
                               length  =   5;  break ;
                default: break;
        }


        for (i=0;i<length;i++)
        {
                rx_data[i] = readSJAreg( 16+ i ) ;
        }

        writeSJAreg( CAN_CMR , 0X0c );     /*  接收完毕,释放接收缓冲区  */
}

/*********************************************************/
/*************        接收中断程序      ******************/
/*********************************************************/
void int0() interrupt 0
{
       EA = 0 ;                                /*   关中断    */

           can_rxdata ( );
           getremote =1;
       EA   =   1 ;

}

/*********************************************************/
/*************       定时器中断程序      ******************/
/*********************************************************/
void timer0() interrupt 1
{
       EA = 0 ;                                /*   关中断    */

        t0count++;
        if(t0count>=20)
        {
             P2 = 0xff;						/*关闭发光二极管 */
             timer0up = 1;
             t0count = 0;
             mytime++;
        }

        if(mytime>=58)					/*ASCII 值 大于9 */
        {mytime = 0x30;}
        TH0 = 0x3c;
        TL0 = 0xb0;
       EA   =   1 ;

}

/*********************************************************/
/*************       命令处理程序       ******************/
/*********************************************************/
void  dealmessage_remote3( void )
{
char i,j ;
//mytime ++;
    for (j=0;j<50;j++);
       tx_data[1] =  0x99;			/*   29位标识符  需右移3位     */
       tx_data[2] =  0x99;			/*   在上位机上显示一串3     */
       tx_data[3] =  0x99;
       tx_data[4] =  0x99;			/*   低3位无效     */

       tx_data[5] =  0x16;        /*   共6帧数据 第1帧   */
       tx_data[6] =  mytime;//0x34;          // 4   /*   mytime是变量 范围0到9    */
       tx_data[7] =  0x32;          // 2
       tx_data[8] =  0x32;          // 2
       tx_data[9] =  0x31;          // 1
       tx_data[10] =  0x30;         // 0
       tx_data[11] =  0x34;         // 4
       tx_data[12] =  0x4e;         // N
    can_txdata (  );

   for (j=0;j<150;j++);
       tx_data[5] =  0x26;	/*   共6帧数据 第2帧   */
       tx_data[6] =  0x30;          // 0
       tx_data[7] =  0x37;          // 7
       tx_data[8] =  0x31;          // 1
       tx_data[9] =  0x30;          // 0
       tx_data[10] =  0x32;         // 2
       tx_data[11] =  0x32;         // 2
       tx_data[12] =  0x37;         // 7
    can_txdata (  );

    for (j=0;j<50;j++);
       tx_data[5] =  0x36;	/*   共6帧数据 第3帧   */
       tx_data[6] =  0x57;          // W
       tx_data[7] =  0x30;          // 0
       tx_data[8] =  0x36;          // 6
       tx_data[9] =  0x31;          // 1
       tx_data[10] =  0x32;         // 2
       tx_data[11] =  0x32;         // 2
       tx_data[12] =  0x54;         // T
    can_txdata (  );


    for (i=0;i<150;i++)
    for (j=0;j<250;j++);
       tx_data[5] =  0x46;	/*   共6帧数据 第4帧   */
       tx_data[6] =  0x30;          // 0
       tx_data[7] =  0x36;          // 6
       tx_data[8] =  0x31;          // 1
       tx_data[9] =  0x37;          // 7
       tx_data[10] =  0x32;         // 2
       tx_data[11] =  0x4D;         // M
       tx_data[12] =  0x4D;         // M
    can_txdata (  );

    for (j=0;j<50;j++);
       tx_data[5] =  0x56;	/*   共6帧数据 第5帧   */
       tx_data[6] =  0x35;          // 5
       tx_data[7] =  0x31;          // 1
       tx_data[8] =  0x36;          // 6
       tx_data[9] =  0x30;          // 0
       tx_data[10] =  0x33;         // 3
       tx_data[11] =  0x30;         // 0
       tx_data[12] =  0x37;         // 7
    can_txdata (  );

    for (j=0;j<50;j++);
       tx_data[5] =  0x66;	/*   共6帧数据 第6帧   */
       tx_data[6] =  0x39;          // 9
       tx_data[7] =  0x30;          // 0
       tx_data[8] =  0x31;          // 1
       tx_data[9] =  0x30;          // 0
       tx_data[10] =  0x32;         // 2
       tx_data[11] =  0x32;         // 2
       tx_data[12] =  mytime;//0x37;         // 7
    can_txdata (  );

}



main ()
{  char i,j ,temp=0;

   for(i=0;i<255;i++)
   for (j=0;j<255;j++);

   cpu_init();
   P2 =0xc0;			/*硬件复位SJA1000 */
   for (j=0;j<100;j++);
   P2 =0xff;
   can_init(  ) ;


   writeSJAreg( CAN_TEST , 0xaa );		/*测试SJA1000 */
   temp =  readSJAreg( CAN_TEST ) ;

   writeSJAreg( CAN_TEST , 0x55 );		/*测试SJA1000 */
   temp =  readSJAreg( CAN_TEST ) ;
   getremote =0;
   mytime = 0x2f;

   for (j=0;j<255;j++);
   while(1)
   {

       if(getremote)  //(timer0up)&&
       {    P2 = 0x60;			/*点亮 发光二极管 */
            if( 0x99 ==  rx_data[1])		/* 软件比较标识符   */
           {
                 switch(rx_data[0]&0xC0)
                 {
                        case    0x00:  /*标准帧、数据帧*/
                                     break ;
                        case    0x40:  /*标准帧、远程帧*/
                                     break ;
                        case    0x80:  /*扩展帧、数据帧*/
                                     break ;
                        case    0xc0:  /*扩展帧、远程帧*/
                                     dealmessage_remote3();
                                     //P2 = 0x60;

                                     break ;
                        default: break;
                 }
           }
           getremote = 0 ;


           }

       if(timer0up)
       {
           // dealmessage_remote();
            dealmessage_remote3();
            timer0up =0;
       }
   }
}

⌨️ 快捷键说明

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