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

📄 demo.c

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

#define TIMES  28

#define CR_CAN  	XBYTE[0x7f00]
#define CMR_CAN		XBYTE[0x7f01]
#define SR_CAN		XBYTE[0x7f02]
#define IR_CAN		XBYTE[0x7f03]
#define ACR_CAN		XBYTE[0x7f04]
#define AMR_CAN		XBYTE[0x7f05]
#define BTR0_CAN	XBYTE[0x7f06]
#define BTR1_CAN	XBYTE[0x7f07]
#define OCR_CAN		XBYTE[0x7f08]

#define uchar   unsigned char
#define ulong   unsigned long

sbit G0 =P3^0;
sbit G1 =P3^1;
sbit G2 =P3^4;
sbit G3 =P3^5;

uchar dispbuf[4],senddata[8],recbuf[8],ID,showbit,N,KEY;
bit  timeflag;

unsigned char code  TAB[10]=
	{0x3f,0x06,0x5B,0x4F,0x66,              //0,1,2,3,4
	 0x6D,0x7D,0x07,0x7F,0x6F};              //5,6,7,8,9
 
void send(void);
void delay(unsigned int k);
unsigned char getkey();
main()
{
   /*********initiate 89C51***********/ 
   
   TMOD=0x11;
   TCON=0x54;		
   IE=0x8f;
   
   /*********** get the local ID ***********/
   ID=P2;
   ID=255-ID;		//invert ID
   ID=ID&0x0f;
   dispbuf[0]=0;
   dispbuf[1]=0;
   dispbuf[2]=ID/10;	//show the local ID first
   dispbuf[3]=ID%10;
   
   /********** initiate the SJA1000*********/
   CR_CAN=1;			
   ACR_CAN=ID;
   
   AMR_CAN=0x00;
   BTR0_CAN=0x67;
   BTR1_CAN=0x2f;		//baudrate 10Kbps
   OCR_CAN=0xDA;		//output mode : push_pull
   CR_CAN=0x62;
   CMR_CAN=0x60;
   
/***********************************************/   
   
   while(1) 
   {    	
       	while(SR_CAN&0x80) CR_CAN=0x72;		//clear bus_off
    
       	if(timeflag)		//send a message every 2 second
       	 {
       	   timeflag=0;
       	   if(ID!=0)	send();     	
         }
         if(getkey()!=0x70)	//show the key value
         {
            delay(5000);	
            dispbuf[2]=0;
            dispbuf[3]=KEY;
         }   
   }
}

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

void  send()
{
uchar i,sum;
uchar xdata *bufpt;

  senddata[0]=ID;  	 	 //local ID
  sum=0;
  for(i=1;i<6;i++)
  {  
    if(senddata[i]>=255)	senddata[i]=0;
    senddata[i]++;
    sum=sum+senddata[i];
  }
  senddata[7]=sum;		//for parity check 
    
  bufpt=0x7f02;
  if(((*bufpt)&0x04)==0x04)
  {	    
    bufpt=0x7f0A;
    *bufpt++=0x00;		//destination ID
    *bufpt++=0x08;		//message length 8 byte
    for(i=0;i<8;i++) *bufpt++=senddata[i];
       CMR_CAN=0x01;		//transfer 
  }
}  
  
unsigned char getkey()
{
   unsigned char key;
   key=P2;
   key=key&0x70;
   if(key==0x50)	KEY=0;
   if(key==0x60)	KEY=1;
   if(key==0x30)	KEY=2;
   return key;         
}

/********* receive interrupt ***********/
void canint(void) interrupt 0  
{
   uchar xdata *message;
   uchar i,j;
   EA=0;
   message=0x7f03;
   j=*message;		//IR
   if(j&0x01)	        //if receive interrupt
   {
      message=0x7f16;
      for(i=0;i<8;i++)    	recbuf[i]=*message++;
   }
   else
      CMR_CAN=0x08;
   dispbuf[2]=recbuf[0]/10;
   dispbuf[3]=recbuf[0]%10;        //show the message soure ID
   CMR_CAN=0x04;
   EA=1;
}	       	

/********** show scan *********/
timer0() interrupt 1
{  
   TL0=0x00;
   TH0=0xfa;
   
   if(showbit>=4)    showbit=0;
   if(showbit==0)
     {
        G0=1;G1=0;G2=0;G3=0;
        P1=TAB[dispbuf[showbit]]|0x80;
     }   
   if(showbit==3)
     {
        G0=0;G1=1;G2=0;G3=0;
        P1=TAB[dispbuf[showbit]];
     }   
   if(showbit==2)
     {
        G0=0;G1=0;G2=1;G3=0;
        P1=TAB[dispbuf[showbit]];
     }   
   if(showbit==1)
     {
        G0=0;G1=0;G2=0;G3=1;
        P1=TAB[dispbuf[showbit]];
     }
   showbit++;     
}     

timer1() interrupt 3
{
  TL1=0;
  TH1=0;
  N++;
  if(N>TIMES)
  {
    N=0;
    timeflag=1;
  }
}    

⌨️ 快捷键说明

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