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

📄 test_big.c

📁 实现can总线的硬件布线图
💻 C
字号:
#include <absacc.h>
#include <reg51.h>
						
#define TIMES		28

#define CR_CAN  	XBYTE[0x3f00]
#define CMR_CAN		XBYTE[0x3f01]
#define SR_CAN		XBYTE[0x3f02]
#define IR_CAN		XBYTE[0x3f03]
#define ACR_CAN		XBYTE[0x3f04]
#define AMR_CAN		XBYTE[0x3f05]
#define BTR0_CAN	XBYTE[0x3f06]
#define BTR1_CAN	XBYTE[0x3f07]
#define OCR_CAN		XBYTE[0x3f08]
#define P8279_CR  	XBYTE[0x5fff]
#define	P8279_D  	XBYTE[0x5eff]

#define uchar  unsigned char

unsigned char code  TAB[31]=
{0xF3,0x60,0xB5,0xF4,0x66,		//0,1,2,3,4
 0xD6,0xD7,0x70,0xF7,0xF6};		//5,6,7,8,9


sbit WDOG=P3^4;

bit  recflag,timeflag,changeflag;
unsigned char dispnum[8],N;
unsigned char getkey();
void delay(unsigned int k);
void init_8279();
void transfer(unsigned char i);
uchar sum,ID;

unsigned char trans[8];
unsigned char recbuf[8];
unsigned char showmask[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
unsigned char CURRENT_1,CURRENT_2,SENSOR_ERROR,FLOAT_ERROR,STATUS_WORD;

main()
{
   unsigned char i,j,k;
   unsigned char add;
   uchar xdata *bufpt;
   
   /***** get the local ID*******/
   ID=P1;
   ID=255-ID;
   ID=ID&0x3f;			
      
   /*****init sja1000****/
   CR_CAN=1;			//reset
   ACR_CAN=ID;  		//local ID
   AMR_CAN=0x00;		//no mask
   BTR0_CAN=0x67;	
   BTR1_CAN=0x2F;		//baudrate 10Kbps
   OCR_CAN=0xDA;		//output mode : push-pull
   CR_CAN=0x72;			//enable overrun/receive interrupt
   CMR_CAN=0x60;		//no use

   /*****init 51*****/
   TMOD=0x10;			
   TR1=1;			//timmer1 mode 1 and enabled
   IT1=1;			//int1 edge trigger mode 
   EX1=1;			//int 1 enabled
   ET1=1;			//timer 1 interrupt enabled
   EA=1;			
	
   init_8279();

   dispnum[6]=ID/10;
   dispnum[7]=ID%10;
   for(i=0;i<8;i++)
	P8279_D=TAB[dispnum[i]];     	//show the local ID first
	
   while(1)
   {	
	WDOG=!WDOG;
	if(P16)			//8279 key interrupt
	{
	   add=getkey();	   
	   dispnum[6]=add/10;
	   dispnum[7]=add%10;	//show the key number
	}
	
	/****** receive *******/
	if(recflag)
	{
		recflag=0;	
	}	

	/****** transfer*******/
	if(timeflag)		//every 2 seconds transfer a message
	{
		timeflag=0;	//clear timeflag bit
	    
  		bufpt=0x3f02;		//test the SR
		if(((*bufpt)&0x04)==0x04)	//if TBF accessable
		{	    
		    bufpt=0x3f0A;
    		    bufpt[0]=0x00; 	   	//destination ID
	            bufpt[1]=0x08;    		//message length
	            bufpt[2]=ID;      		//local ID   	
	            bufpt[3]=CURRENT_1;
	            bufpt[4]=CURRENT_2;
	            bufpt[5]=SENSOR_ERROR;
	            bufpt[6]=FLOAT_ERROR;
	            bufpt[7]=STATUS_WORD;
	            sum=ID+CURRENT_1+CURRENT_2+SENSOR_ERROR+FLOAT_ERROR+STATUS_WORD;
	            bufpt[9]=sum;		//for parity check
	   
		    CMR_CAN=0x01;	     	//transfer
		}
	}	
	if(changeflag)		//change the information after transfer	
	{				
	    changeflag=0;
	    
	    CURRENT_1++;
	    CURRENT_2++;
	    SENSOR_ERROR++;
	    FLOAT_ERROR++;
	    STATUS_WORD++;
	}    
   	
   }
}

unsigned char getkey()		//get key
{
    unsigned char key;
    while(!P16)		WDOG=!WDOG;
    key=P8279_D&0x3f;
    if(key>=7)  key=key-2;
    if(key<6)	key=5-key;
    return(key);
}

void delay(unsigned int k)
{
    for(;k>0;k--) ;
}

void init_8279()
{
   P8279_CR=0xD0;		//clear display RAM	
   while(P8279_D&0x80)		
   	WDOG=!WDOG;		//wait for clear over
   P8279_CR=0x00;		//8 bit left input		
   P8279_CR=0x2A;		//fscl=clock/10
   P8279_CR=0x90;		//auto add 1 when write RAM
   P8279_CR=0xA0;		
}

/******* receive interrupt********/
void canint(void) interrupt 2  
{
   uchar xdata *message;
   uchar i;
   message=0x3f03;		//IR
   i=*message;
   if(i&0x08)		CMR_CAN=0x08;	//clear overrun
   if(i&0x01)
   {
	    message=0x3f16;	//RBF
   	    for(i=0;i<8;i++)
   	    {
	    	recbuf[i]=*message++;
   	    }
   	    recflag=1;
   CMR_CAN=0x04;	//release RBF
   }
}
	       	
void timer(void) interrupt 3
{
   TL1=0x00;
   TH1=0x00;
   N++;
   if(N>TIMES)		//transfer interval set
   {
      	timeflag=1; 
   	N=0;
        changeflag=1;
   }	
   if(SR_CAN&0x80)	CR_CAN=0x72;	//if bus off reset to operating mode
   WDOG=!WDOG;      
}

⌨️ 快捷键说明

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