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

📄 can1.c

📁 SJA1000的发送程序
💻 C
字号:
#include "reg51.h"
#include "absacc.h"
#include "stdio.h"
#define  uchar   unsigned char
#define SJA_BaseAdr 0X7f00  //定义SJA1000的基址
#define CAN_MODE XBYTE[SJA_BaseAdr+0X00]
#define CAN_CMD XBYTE[SJA_BaseAdr+0X01]
#define CAN_SR XBYTE[SJA_BaseAdr+0X02]
#define CAN_IR XBYTE[SJA_BaseAdr+0X03]
#define CAN_IER XBYTE[SJA_BaseAdr+0X04]
#define CAN_BTR0 XBYTE[SJA_BaseAdr+0X06]   //05保留
#define CAN_BTR1 XBYTE[SJA_BaseAdr+0X07]
#define CAN_OCR XBYTE[SJA_BaseAdr+0X08]
#define CAN_TEST XBYTE[SJA_BaseAdr+0X09]
#define CAN_ALC XBYTE[SJA_BaseAdr+0X0b]    //0a保留
#define CAN_ECC XBYTE[SJA_BaseAdr+0X0c]
#define CAN_EMLR XBYTE[SJA_BaseAdr+0X0d]
#define CAN_RXERR XBYTE[SJA_BaseAdr+0X0e]
#define CAN_TXERR XBYTE[SJA_BaseAdr+0X0f]
//发送缓冲区寄存器定义-----在复位模式下
#define CAN_ACR0 XBYTE[SJA_BaseAdr+0X10]
#define CAN_ACR1 XBYTE[SJA_BaseAdr+0X11]
#define CAN_ACR2 XBYTE[SJA_BaseAdr+0X12]
#define CAN_ACR3 XBYTE[SJA_BaseAdr+0X13]
#define CAN_AMR0 XBYTE[SJA_BaseAdr+0X14]
#define CAN_AMR1 XBYTE[SJA_BaseAdr+0X15]
#define CAN_AMR2 XBYTE[SJA_BaseAdr+0X16]
#define CAN_AMR3 XBYTE[SJA_BaseAdr+0X17]

#define CAN_TxBuffer0 XBYTE[SJA_BaseAdr+0X10]
#define CAN_TxBuffer1 XBYTE[SJA_BaseAdr+0X11]
#define CAN_TxBuffer2 XBYTE[SJA_BaseAdr+0X12]
#define CAN_TxBuffer3 XBYTE[SJA_BaseAdr+0X13]
#define CAN_TxBuffer4 XBYTE[SJA_BaseAdr+0X14]
#define CAN_TxBuffer5 XBYTE[SJA_BaseAdr+0X15]
#define CAN_TxBuffer6 XBYTE[SJA_BaseAdr+0X16]
#define CAN_TxBuffer7 XBYTE[SJA_BaseAdr+0X17]
#define CAN_TxBuffer8 XBYTE[SJA_BaseAdr+0X18]
#define CAN_TxBuffer9 XBYTE[SJA_BaseAdr+0X19]
#define CAN_TxBuffer10 XBYTE[SJA_BaseAdr+0X1a]
#define CAN_TxBuffer11 XBYTE[SJA_BaseAdr+0X1b]
#define CAN_TxBuffer12 XBYTE[SJA_BaseAdr+0X1c]

#define CAN_RxBuffer0 XBYTE[SJA_BaseAdr+0X10]
#define CAN_RxBuffer1 XBYTE[SJA_BaseAdr+0X11]
#define CAN_RxBuffer2 XBYTE[SJA_BaseAdr+0X12]
#define CAN_RxBuffer3 XBYTE[SJA_BaseAdr+0X13]
#define CAN_RxBuffer4 XBYTE[SJA_BaseAdr+0X14]
#define CAN_RxBuffer5 XBYTE[SJA_BaseAdr+0X15]
#define CAN_RxBuffer6 XBYTE[SJA_BaseAdr+0X16]
#define CAN_RxBuffer7 XBYTE[SJA_BaseAdr+0X17]
#define CAN_RxBuffer8 XBYTE[SJA_BaseAdr+0X18]
#define CAN_RxBuffer9 XBYTE[SJA_BaseAdr+0X19]
#define CAN_RxBuffer10 XBYTE[SJA_BaseAdr+0X1a]
#define CAN_RxBuffer11 XBYTE[SJA_BaseAdr+0X1b]
#define CAN_RxBuffer12 XBYTE[SJA_BaseAdr+0X1c]

#define CAN_TxBufferR0 XBYTE[SJA_BaseAdr+0X60]
#define CAN_TxBufferR5 XBYTE[SJA_BaseAdr+0X65]

#define CAN_RBSA XBYTE[SJA_BaseAdr+0X1e]
#define CAN_CDR XBYTE[SJA_BaseAdr+0X1f]
unsigned char data send_data[13]={0x88,0xa0,0xa0,0xa0,0x80,0x01,0x02,
                                  0x03,0x04,0xf0,0xff,0xfe,0xfd};
unsigned char data rcv_data[13];
void send_dataaa(void);
void can_init(void);
void rec_data(void);
sbit CAN_RET=P1^0;
sbit BELL=P3^5;
sbit k3=P3^4;
//***************************//
void	Delay_ms(unsigned char k)          	//长软件延时
{
  	unsigned char	n,m;
  	for(n=0;n<=k;n++)
	for(m=0;m<=200;m++);
  }
void can_init(void)
{
	uchar ai;
    ai = CAN_IR; 
    CAN_BTR0=0x43;     
	CAN_BTR1=0x1c;     
  do
	{
	 CAN_MODE=CAN_MODE|0x09; 
	 }while((CAN_MODE&0x09)==0x00); //复位模式
	CAN_CDR=0xc8;      //时钟分频寄存器,选择PeliCAN模式??88
	CAN_IER=0xff;      //中断使能寄存器
	ai = CAN_IR;
	CAN_ACR0=0xaa;     //验收寄存器
	CAN_ACR1=0x55;
	CAN_ACR2=0xaa;
	CAN_ACR3=0x55;
	CAN_AMR0=0xff;      //屏蔽寄存器
	CAN_AMR1=0xff;
	CAN_AMR2=0xff;
	CAN_AMR3=0xff; 
      
	
	

	CAN_BTR0=0x40;     //
	CAN_BTR1=0x14;     //20k

    CAN_OCR=0x1a;      //输出控制寄存器决定输出的不同模式??aa
	CAN_RBSA=0x00;     //RX 缓冲器起始地址寄存器
        CAN_TXERR= 0x00;    //发送错误接收器设置为0清除
      ai=CAN_ECC;        //清除错误代码捕捉寄存器,通过读清除 
      CAN_CMD=0x0c;      /*清除数据溢出和释放接收缓冲器*/ 
      /*                                                                                                                                                                                        
  do
   {
    CAN_MODE=0x00;
	}while((CAN_MODE&0x01)!=0x00);
  */
	do
  {
   CAN_MODE=0x08;
   }while((CAN_MODE&0x08)!=0x08);         //???0x00
}


void send_dataaa(void)
{  
 do{;}                               //判断是否正在接收,正在接收则等待??TBS,TCS
  while((CAN_SR&0x10)==0x10);

  do{;}
  while((CAN_SR&0x08)!=0x08);        //判断上次发送是否完成,未完成则等待

  do
   {;}
  while((CAN_SR&0x04)!=0x04);       //判断发送缓冲区是否锁定,锁定则等待                             
    CAN_TxBuffer0=send_data[0];
    CAN_TxBuffer1=send_data[1];
	CAN_TxBuffer2=send_data[2];
	CAN_TxBuffer3=send_data[3];
	CAN_TxBuffer4=send_data[4];
	CAN_TxBuffer5=send_data[5];
	CAN_TxBuffer6=send_data[6];
	CAN_TxBuffer7=send_data[7];
	CAN_TxBuffer8=send_data[8];
	CAN_TxBuffer9=send_data[9];
	CAN_TxBuffer10=send_data[10];
    CAN_TxBuffer11=send_data[11];
    CAN_TxBuffer12=send_data[12];
    CAN_CMD=0x01;
}
  //***********************************//
void rec_data(void)
{  
   rcv_data[0]=CAN_RxBuffer0;
   rcv_data[1]=CAN_RxBuffer1;
   rcv_data[2]=CAN_RxBuffer2;
   rcv_data[3]=CAN_RxBuffer3;
   rcv_data[4]=CAN_RxBuffer4;
   rcv_data[5]=CAN_RxBuffer5;
   rcv_data[6]=CAN_RxBuffer6;
   rcv_data[7]=CAN_RxBuffer7;
   rcv_data[8]=CAN_RxBuffer8;
   rcv_data[9]=CAN_RxBuffer9;
   rcv_data[10]=CAN_RxBuffer10;
   rcv_data[11]=CAN_RxBuffer11;
   rcv_data[12]=CAN_RxBuffer12;

  }
  //******************************************//
main()
{   //unsigned char i;
        Delay_ms(100);
        CAN_RET=0;    //SJA1000复位
    	Delay_ms(100);
		CAN_RET=1;
		Delay_ms(100);
  		can_init();
  while(1)
 {  
    BELL=1;       //关闭蜂鸣器
    k3=1;
	if(k3==0)
	{ 
	  Delay_ms(100);   //按键去抖经典值20毫秒
	  }
	  if(k3==0)          //真的有按键按下
   	 {
  		 send_dataaa();     
  		 Delay_ms(10);    //必要的小延时
  		//  BELL=0;
  		  Delay_ms(100); 
     }
    }
   }

⌨️ 快捷键说明

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