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

📄 sja1000.c

📁 直接可用的基于sja1000+51的C源代码
💻 C
字号:
/******************************************************
    
  以下为头文件定义
  copyright by alloy
    
******************************************************/
#define SJA_REG_BaseADD 0x7800
    
#define REG_MODE XBYTE[SJA_REG_BaseADD+0x00]
#define REG_CMD  XBYTE[SJA_REG_BaseADD+0x01]
#define REG_SR   XBYTE[SJA_REG_BaseADD+0x02]
#define REG_IR   XBYTE[SJA_REG_BaseADD+0x03]
#define REG_IR_ABLE XBYTE[SJA_REG_BaseADD+0x04]
#define REG_BTR0  XBYTE[SJA_REG_BaseADD+0x06]//05保留
#define REG_BTR1  XBYTE[SJA_REG_BaseADD+0x07]
#define REG_OCR   XBYTE[SJA_REG_BaseADD+0x08]
#define REG_TEST  XBYTE[SJA_REG_BaseADD+0x09]
#define REG_ALC   XBYTE[SJA_REG_BaseADD+0x0b]//0a保留
#define REG_ECC   XBYTE[SJA_REG_BaseADD+0x0c]
#define REG_EMLR  XBYTE[SJA_REG_BaseADD+0x0d]
#define REG_RXERR XBYTE[SJA_REG_BaseADD+0x0e]
#define REG_TXERR XBYTE[SJA_REG_BaseADD+0x0f]

#define REG_ACR0 XBYTE[SJA_REG_BaseADD+0x10]
#define REG_ACR1 XBYTE[SJA_REG_BaseADD+0x11]
#define REG_ACR2 XBYTE[SJA_REG_BaseADD+0x12]
#define REG_ACR3 XBYTE[SJA_REG_BaseADD+0x13]
#define REG_AMR0 XBYTE[SJA_REG_BaseADD+0x14]
#define REG_AMR1 XBYTE[SJA_REG_BaseADD+0x15]
#define REG_AMR2 XBYTE[SJA_REG_BaseADD+0x16]
#define REG_AMR3 XBYTE[SJA_REG_BaseADD+0x17]
    
#define REG_RxBuffer0 XBYTE[SJA_REG_BaseADD+0x10]
#define REG_RxBuffer1 XBYTE[SJA_REG_BaseADD+0x11]
#define REG_RxBuffer2 XBYTE[SJA_REG_BaseADD+0x12]
#define REG_RxBuffer3 XBYTE[SJA_REG_BaseADD+0x13]
#define REG_RxBuffer4 XBYTE[SJA_REG_BaseADD+0x14]
    
#define REG_TxBuffer0 XBYTE[SJA_REG_BaseADD+0x10]
#define REG_TxBuffer1 XBYTE[SJA_REG_BaseADD+0x11]
#define REG_TxBuffer2 XBYTE[SJA_REG_BaseADD+0x12]
#define REG_TxBuffer3 XBYTE[SJA_REG_BaseADD+0x13]
#define REG_TxBuffer4 XBYTE[SJA_REG_BaseADD+0x14]
    
#define REG_DataBuffer1 XBYTE[SJA_REG_BaseADD+0x15]
#define REG_DataBuffer2 XBYTE[SJA_REG_BaseADD+0x16]
#define REG_DataBuffer3 XBYTE[SJA_REG_BaseADD+0x17]
#define REG_DataBuffer4 XBYTE[SJA_REG_BaseADD+0x18]
#define REG_DataBuffer5 XBYTE[SJA_REG_BaseADD+0x19]
#define REG_DataBuffer6 XBYTE[SJA_REG_BaseADD+0x1a]
#define REG_DataBuffer7 XBYTE[SJA_REG_BaseADD+0x1b]
#define REG_DataBuffer8 XBYTE[SJA_REG_BaseADD+0x1c]
    
    
#define REG_RBSA XBYTE[SJA_REG_BaseADD+0x1e]
#define REG_CDR XBYTE[SJA_REG_BaseADD+0x1f]
#define REG_Receive_Counter XBYTE[SJA_REG_BaseADD+0x1d]
    
#define OK 1
#define Fail 0
#define ON 1
#define OFF 0
#define True 1
#define False 0
    
sbit SJARst=P2^6;//复位控制
sbit LED0=P1^0;
sbit LED1=P1^1;
sbit Key0=P1^2;
sbit Key1=P1^3;
sbit Key2=P1^4;
sbit Key3=P1^5;
    
bit step_flg;
bit Tx_flg;
bit Rx_flg;
    
unsigned char step_counter;
unsigned char Tx_counter;
unsigned char PC_RX_Buffer;
unsigned char temp_data1;
unsigned char Rx_Buffer[6];
    
void MCU_Init(void);
void SJA_Init(void);
void send(unsigned char S_Data);
void Serial(void);
void Delay(unsigned char Delay_time);
void step(void);
    
    
    
/*******************************************************
    
以下为c的主程序
copyrightbyalloy
    
*******************************************************/
#include<stdio.h>
#include<string.h>
#include<REG51.h>
#include<TxMCU.h>
#include<absacc.h>

main()
{
  unsigned char i;

  MCU_Init();
  SJA_Init();
  REG_MODE=0x01;//进入复位模式
    
  temp_data1=REG_MODE;
  temp_data1=temp_data1&0x01;
  if(temp_data1==0x01)//在复位模式中
  {
	  REG_BTR0=0x85;
	  REG_BTR1=0xb4;//100k
	  REG_OCR =0x1a;
	  REG_CDR =0xc0;
	  REG_RBSA=0x00;
	    
	  REG_ACR0=0xff;
	  REG_ACR1=0xff;
	  REG_ACR2=0xff;
	  REG_ACR3=0xff;
	    
	  REG_AMR0=0xff;
	  REG_AMR1=0xff;
	  REG_AMR2=0xff;
	  REG_AMR3=0xff;
	    
	  REG_IR_ABLE=0xff;
  }

  REG_MODE=0x0c;//进入自接收模式
  REG_MODE=0x0c;
    
  for(i=0;i<100;i++);
  temp_data1=REG_Receive_Counter;
  send(temp_data1);

  for(;;)
  {
	  while(Tx_flg==False);
	  Tx_flg=False;
	  Tx_counter++;
	  send(Tx_counter);
	  temp_data1=REG_SR;
	  while((temp_data1&0x10)==0x10);
	  temp_data1=REG_SR;
	  if((temp_data1&0x04)==0x04)
	  {
		  REG_RxBuffer0=0x08;//标准帧,长度为8
		  REG_RxBuffer1=0xff;
		  REG_RxBuffer2=0xff;
		  REG_RxBuffer3=0x01;
		  REG_RxBuffer4=0x02;

		  REG_DataBuffer1=0x03;
		  REG_DataBuffer2=0x04;
		  REG_DataBuffer3=0x05;
		  REG_DataBuffer4=0x06;
		  REG_DataBuffer5=0x07;
		  REG_DataBuffer6=0x08;
		  REG_DataBuffer7=0x09;
		  REG_DataBuffer8=0x0a;
  	}

	  REG_CMD=0x10;
	  temp_data1=REG_SR;
	  temp_data1=temp_data1&0x20;

	  while(temp_data1==0x20)//检查是否发送完成
	  {
		  //send(0xaa);
		  temp_data1=REG_ECC;
		  send(temp_data1);
		  temp_data1=REG_SR;
		  temp_data1=temp_data1&0x20;
		  //send(temp_data1);
	  }
    
	  send(0x66);
	  temp_data1=REG_ALC;
	  send(temp_data1);
	  temp_data1=REG_ECC;
	  send(temp_data1);
	  temp_data1=REG_SR;
	  send(temp_data1);
	  temp_data1=REG_Receive_Counter;
	  send(temp_data1);
	    
	  PC_RX_Buffer=0x77;
	  LED0=~LED0;
	    
	  //Tx_counter=0x00;
	  }
  }
    
void MCU_Init(void)
{
  SJARst=1;
  LED0=OFF;
  LED1=OFF;
  PC_RX_Buffer=0x77;
  step_counter=0x00;
  step_flg=False;
  Tx_flg=False;
  temp_data1=0x00;
  TMOD=0x20;
  TH1=0xff;
  TL1=0xff;
  TR1=1;
  SCON=0x50;
  PCON=0x80;
  EA=1;
  ES=1;
  Tx_counter=0x00;
    
}
    
void SJA_Init(void)
{
  unsigned char i;

  for(i=0;i<125;i++);
  SJARst=0;
  for(i=0;i<125;i++);
  SJARst=1;
  for(i=0;i<125;i++);
}
    
void send(unsigned char S_Data)
{
	SBUF=S_Data;
	while(TI==0);
	TI=0;
}
     
void Serial() interrupt 4 using 2
{    
  if(RI==1)
  {
	  PC_RX_Buffer=SBUF;
	  RI=0;
	  if(PC_RX_Buffer==0xaa)
	  {
		  send(0x13);
		  Tx_flg=True;
		  PC_RX_Buffer=0x77;
	  }
	  else if(PC_RX_Buffer==0x55)
	  {
		  send(0x14);
		  Rx_flg=True;
		  PC_RX_Buffer=0x77;
	  }
	  else
	  {
		  send(0x15);
		  PC_RX_Buffer=0x77;
  	}
  } 
} 

⌨️ 快捷键说明

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