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

📄 rs232_basiccan.c

📁 可以实现在PC与CAN总线的连接。采用的89C51和SJA1000芯片的接法。里面包括原程序的电路斩
💻 C
字号:
#include<REG52.H>
#include<SJA_BCANCONF.H>
#include<SJA_BCANFUNC.C>
//************************函数声明*****************************//
void T1_int(void);
void Sja_1000_Init(void);
//************************变量定义*****************************//
unsigned char data  send_data[10],rcv_data[10];     //发送和接收数组定义
unsigned char bdata flag_init;
unsigned char j,k=2;
sbit rcv_flag=flag_init^0;                          //接收中断标志
sbit err_flag=flag_init^2;                          //错误中断标志
bit  send_flag=0;
sbit P2_0=P2^0;
sbit P3_4=P3^4;
sbit LED=P3^5;
//***********************主函数*******************************//
void main(void)
{   
    P2_0=0;                                         //SJA1000退出硬件复位模式
    Sja_1000_Init();								//initialize Sja100
	T1_int();										//initialize T1
	PX0=1;                                          //外部中断0高优先级
	EX0=1;                                          //外部中断0开放
	ES=1;                                           //串口中断开放
	EA=1;                                           //开放全局中断
	flag_init=0x00;
    P3_4=0;                                         //点亮指示灯
	while(1)
	{
		if(rcv_flag)							
		{   
			rcv_flag=0;
			BCAN_DATA_RECEIVE(rcv_data);            //接收数据
			BCAN_CMD_PRG(0x04);                     //释放接收缓冲区
		    ES=0;                                   //串口中断禁止
		    for(j=2;j<10;j++)                       //发送8组数据到串口
			 {
			  SBUF=rcv_data[j];
			  while(TI==0)
			   {}
			  TI=0;
			  }
             ES=1;                                   //串口中断开放
			 LED=~LED;                               //指示灯
		}
		if(send_flag)							
		{
			send_flag=0;							
			send_data[0]=0xA8;					    
			send_data[1]=0x08;                      //报文ID:540
			BCAN_DATA_WRITE(send_data);             //写入数据到缓冲区函数
			BCAN_CMD_PRG(0x01);                     //调用发送请求
	        LED=~LED;                               //指示灯
	}
		if(err_flag)                               //总线错误处理
		{   
		    err_flag=0;
			Sja_1000_Init();
		}
	}
}
//******************************外部中断0*******************//
void ex0_int(void) interrupt 0 using 1
{
	SJA_BCANAdr=REG_INTERRUPT;
	flag_init=*SJA_BCANAdr;
}
//******************************T1初始化********************//
void T1_int(void) 
{
	TMOD=0x20;             //定时器1设为方式2
	TL1=0xFD;              //定时器初值
	TH1=0xFD;
	SCON=0x50;             //串口设为方式1,REN=1允许接收
    TR1=1;                 //启动定时器1
}
void UART_int(void) interrupt 4 using 3/*串口中断接受数据*/
{    
 send_data[k]=SBUF;  //写串口数据到发送数组
 RI=0;               //接收中断清零
 k++;                //
 if(k==10)           //接收到8组数据
  {k=2;              //
   send_flag=1;      //置位发送标志
  }


}

//******************************SJA1000初始化********************//
void Sja_1000_Init(void)
{   BCAN_ENTER_RETMODEL();        //进入复位
	BCAN_SET_BANDRATE(0x0b);      //设置波特率800K/S
	BCAN_SET_OBJECT(0xaa,0x00);   //设置地址ID:550
	BCAN_SET_OUTCLK(0xaa,0x48);   //设置输出方式,禁止COLOCKOUT输出
	BCAN_QUIT_RETMODEL();         //退出复位模式
	SJA_BCANAdr=REG_CONTROL;      //地址指针指向控制寄存器
	*SJA_BCANAdr|=0x1e;           //开放错误\接收\发送中断
}

⌨️ 快捷键说明

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