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

📄 rs232_basiccan.c

📁 这是一个基于51单片机的can总线转串口的程序
💻 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 CAN_RESET=P2^0;
sbit LED1=P3^4;
sbit LED0=P3^5;
void open_close_led(void)
{
	if(rcv_data[4]==0X02)
			 {LED0=0;}                              //OPEN THE LIGHT
    else if(rcv_data[4]==0X03)
			 {LED0=1;}                           //close the light

    if(rcv_data[5]==0X02)
			 {LED1=0;}                              //OPEN THE LIGHT
    else if(rcv_data[5]==0X03)
			 {LED1=1;}                           //close the light
}
//***********************主函数*******************************//
void main(void)
{   
    CAN_RESET=0;                                     //SJA1000退出硬件复位模式
    Sja_1000_Init();								//initialize Sja100
	T1_int();										//initialize T1
	PX0=1;                                          //外部中断0高优先级
	EX0=1;                                          //外部中断0开放
	ES=1;                                           //串口中断开放
	EA=1;                                           //开放全局中断
	flag_init=0x00;
   	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;                                   //串口中断开放
			 open_close_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);                     //调用发送请求
	     }
		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 + -