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

📄 can6.h

📁 基于Plinps的SJA1000CAN总线控制器的CAN应用开发程序
💻 H
字号:
/*本程序实现湿度值的检测,IIC总线显示以及CAN总线通讯*/


#include <reg51.h>
#include <absacc.h>
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int
#define CAN_add 0x06	 	/*本节点CAN的地址*/

extern delay(uint x);
uchar can_send_array[10];	/*CAN发送暂存*/ 
uchar can_receive_array[10];	/*CAN接收暂存*/
uchar   ot_counter;               /*CAN发送时间记数*/
bit   trflag;			/*发送成功标志*/
bit   otflag;
bit   erflag;
bit   canflag;    		/*CAN接收信息标志*/
sbit  CANRST=P1^2;		/*CAN软件复位*/ 
/*********************************************************
************************子函数定义************************/

void dma_trans(void);	   /*CAN发送一帧子程序*/
void can_init(void);   	   /*CAN初始化子程序*/
void can_int(void);				/*CAN中断子程序*/


/*CAN寄存器定义*/
#define    CON_REG        XBYTE[0x00]   /* 82C200 CONTROL REG  */
#define    COM_REG        XBYTE[0x01]   /* 82C200 COMMAND REG  */
#define    STA_REG        XBYTE[0x02]   /* 82C200 STATUS REG  */
#define    INT_REG        XBYTE[0x03]   /* 82C200 INTERRUPT REG  */
#define    ACC_C_REG      XBYTE[0x04]   /* 82C200 ACCEPTANCE CODE REG  */
#define    ACC_M_REG      XBYTE[0x05]   /* 82C200 ACCEPTANCE MARK REG  */
#define    TIM0_REG       XBYTE[0x06]   /* 82C200 BUS TIMING 0 REG  */
#define    TIM1_REG       XBYTE[0x07]   /* 82C200 BUS TIMING 1 REG  */
#define    OUT_C_REG      XBYTE[0x08]   /* 82C200 OUTPUT CONTROL REG  */

#define    TRAN_REG0       XBYTE[0x0A]   /* 82C200 TRANSMIT BUFFER REG  */
#define    TRAN_REG1       XBYTE[0x0B]
#define    TRAN_REG2       XBYTE[0x0C]
#define    TRAN_REG3       XBYTE[0x0D]
#define    TRAN_REG4       XBYTE[0x0E]
#define    TRAN_REG5       XBYTE[0x0F]
#define    TRAN_REG6       XBYTE[0x10]
#define    TRAN_REG7       XBYTE[0x11]
#define    TRAN_REG8       XBYTE[0x12]
#define    TRAN_REG9       XBYTE[0x13]

#define    RECV_REG0       XBYTE[0x14]   /* 82C200 RECEIVE BUFFER REG  */
#define    RECV_REG1       XBYTE[0x15]
#define    RECV_REG2       XBYTE[0x16]
#define    RECV_REG3       XBYTE[0x17]
#define    RECV_REG4       XBYTE[0x18]
#define    RECV_REG5       XBYTE[0x19]
#define    RECV_REG6       XBYTE[0x1A]
#define    RECV_REG7       XBYTE[0x1B]
#define    RECV_REG8       XBYTE[0x1C]
#define    RECV_REG9       XBYTE[0x1D]


    
     //can中断子程序//               
   void can_int() interrupt 0 using 1 /*CAN中断服务程序*/
  {  
	uchar interpt,i;
	uchar xdata *pt;
	EX0=0;     
	pt=&RECV_REG0;   
	interpt=INT_REG;  
	if(interpt&0x04)       
       {
        erflag=1;        /*置出错标志*/
       }
       else
       {             
 	     if(interpt&0x02)         /*发送中断*/    
           {
	        trflag=1;          /*置成功发送标志*/
                _nop_();
            }
             else if(interpt&0x01)         /*接收中断*/
	         {	
		        for(i=0;i<10;i++)
		        {
		        	can_receive_array[i]=*(pt+i);
		        }
    	                _nop_();
	                COM_REG=0x0c;    /*CAN释放接收缓存*/
		        canflag=1;
	           }
	 }
	EX0=1;
   }   

void timer1(void) interrupt 3 using 3         /*T/C1中断服务子程序*/
{  
   TH1=0x3c;
   TL1=0xb0;
   ot_counter++;
   if(ot_counter>=10)
  {
   ot_counter=0;
   otflag=1;
   }
}

//can发送子程序//

 void dma_trans()   /*CAN发送子程序*/
{
  uchar xdata *p;
  uchar i;
  can_send_array[0]=CAN_add;
  can_send_array[1]=8;
  p=&TRAN_REG0;
  if((STA_REG&0x0c)==0x0c)        /*如果上次发送已完成,而且发送缓存为空,则允许发送;否则复位CAN */
  {
      for(i=0;i<10;i++)
       {
         *p=can_send_array[i];
          p=p+1;
       }
       _nop_();
       _nop_();
       COM_REG=0x01;               /*启动发送命令*/
       TH1=0x3c;
       TL1=0xb0;
       TR1=1;                      /*启动定时器1(50ms),监视CAN发送是否超时*/
       while(trflag==0&&erflag==0&&otflag==0);
       TR1=0;                      /*关闭定时器0*/
       if(trflag==1)  
        {
            trflag=0;              /*发送成功*/  
        }
        else if(erflag==1)              /*发送出错,置该教室状态为“0”,并复位CAN*/
          {    
               CANRST=0;              /*P12用于复位CAN*/
               _nop_();
               _nop_();
               _nop_();
               _nop_();
               CANRST=1;         
               can_init();
          }
        else if(otflag==1)              /*发送超时,复位CAN */
          {    otflag=0;
               CANRST=0;
               _nop_();
               _nop_();
               _nop_();
               _nop_();
               CANRST=1;
               can_init();
          }
  }
  else                   
  {   CANRST=0;
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      CANRST=1;
      can_init();
  }
}



//can初始化//
      void can_init(void)    	         /*CAN初始化子程序*/
{  
	uchar i;                    
	for(i=0;i<5;i++)
	{ _nop_(); }
	CON_REG=0x01;  		 /*进入复位状态*/
        ACC_C_REG=CAN_add;  	 /*接受码为本采集器地址*/ 
	ACC_M_REG=0x00;        	/*接收屏蔽寄存器=00,表示全相关*/
	TIM0_REG=0x07;
	TIM1_REG=0xff;		/*数据的发送速率为40K*/
	OUT_C_REG=0xaa;         	/*输出控制寄存器*/
	delay(500);
	CON_REG=0xfe;           	/*控制寄存器,复位时返回正常运行状态*/ 
        /*can_receive_array[0]=CAN_add;
        can_receive_array[1]=0x01;*/
 }
 

⌨️ 快捷键说明

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