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

📄 main.c

📁 实现485、232信号到can信号的转换。根据需要调整即可。
💻 C
字号:

#include <stdio.h>
#include "serial.h"
#include <at89x52.h>
#include <string.h>
#include "SJA1000.h"
#include <ABSACC.H>

extern unsigned char    TxBuf[LenTxBuf];
extern unsigned char    RxBuf[LenRxBuf]; 
extern unsigned char	receiveflag;


sfr AUXR    = 0x8E;  					 //STC89C54RD+
unsigned char canbuf[16];
unsigned char bCanRcvFlag;

void delay()
{
	int i,j;
	for(i = 0; i++; i<10000)
	{    
		for(j = 0; j++; j<10000)
		{
		}
	}
}


void InitialCan()
{
	WriteDataToSJA1000(REG_CAN_MOD,0x01);		 //进入复位,对can进行初始化

	WriteDataToSJA1000(REG_CAN_CDR,0x88);		 //时钟分频寄存器
	WriteDataToSJA1000(REG_CAN_IER ,0x8B);		 //中断允许寄存器


	WriteDataToSJA1000(REG_CAN_AMR0,0xff);		 //验收屏蔽寄存器0~3
	WriteDataToSJA1000(REG_CAN_AMR1,0xff);
	WriteDataToSJA1000(REG_CAN_AMR2,0xff);
	WriteDataToSJA1000(REG_CAN_AMR3,0xff);

	WriteDataToSJA1000(REG_CAN_ACR0,0x00);		 //验收码寄存器0~3
	WriteDataToSJA1000(REG_CAN_ACR1,0x01);		 
	WriteDataToSJA1000(REG_CAN_ACR2,0x00);		 
	WriteDataToSJA1000(REG_CAN_ACR3,0x00);		 


	WriteDataToSJA1000(REG_CAN_BTR0,0x49);		 //总线定时器0
	WriteDataToSJA1000(REG_CAN_BTR1,0xC9);		 //总线定时器1   //50kbps 采样3次 16MHZ
	
	WriteDataToSJA1000(REG_CAN_OCR,0xAA);		 //输出控制寄存器
	WriteDataToSJA1000(REG_CAN_RBSA,0x00);		 //接收缓冲器起始地址寄存器
	WriteDataToSJA1000(REG_CAN_RXERR,0x00);		 //接收错误计数器
	WriteDataToSJA1000(REG_CAN_TXERR,0x00);		 //发送错误寄存器


	WriteDataToSJA1000(REG_CAN_MOD,0x08);		 //模式寄存器---单滤波方式
	//P1_0 = 0;
}

int main()
{
    unsigned char rlen,i,j;   
	unsigned char rbuf[14];
	
	P1_1 =0;

    P1_0 = 1;
    
	InitSerialBuffer();
	InitSerial();
//	bCanRcvFlag = 0;
 

	
	EA=1;					//cpu中断允许标志
	EX0=1;					//外部中断0中断允许位
	IT0=1;					//跳变方式
	ES=1;					//串口中断允许位
	AUXR=0x03;				//禁止外扩
	
	InitialCan();       			//初始化SJA1000

//	PELICAN_HW_INIT( 0xAA,0x88,0x04,0x8B);  调试结束后,再检查看看原有的驱动程序为什么不能正常工作


  	delay();
	delay();


	while(receiveflag)
	{
		P1_0 = 0;
		receiveflag=0;
		rlen=ReceivedBytes();
		for(i=0;i<rlen;i++)
		{
		  getbyte(&rbuf[i]);
		}

	//	EA=0;							//cpu禁止中断
		TI=0;							//TI=1时申请中断,cpu相应中断后,发送下一帧数据。任何方式下,该位都必须由软件清0

		 //canbuf[9]={0x88,0x50,0x00,0x20,0x00,0x01,0x0a,S,H};	//帧信息+4个识别码+帧号(0x01)
		                                                                    //+固定字节(表示后续字节长度)+两个固定起始字符(SH)
	
	     canbuf[0] = 0x88 ;  			 //帧信息
		 canbuf[1] = 0x50 ;
		 canbuf[2] = 0x00 ;
		 canbuf[3] = 0x20 ;
		 canbuf[4] = 0x00 ;
		 canbuf[5] = 0x01 ;  			 //帧号(0x01

		 for(i = 0; i < 7; i++)
		    for(j = 6; j < 13; j++)
			{
				canbuf[j] = rbuf[i];
			}


		 canbuf[13] = 0x88 ;   			//帧信息
		 canbuf[14] = 0x50 ;
		 canbuf[15] = 0x00 ;
		 canbuf[16] = 0x20 ;
		 canbuf[17] = 0x00 ;
		 canbuf[18] = 0x02 ;  			 //帧号0x01

		for(i = 7; i < rlen; i++)
		    for(j = 19; j < (12+rlen); j++)
			{
				canbuf[j] = rbuf[i];
			}

		SJASendData(canbuf,0x01);
	//	EA=1;							//cpu开中断
		TI=1;							//TI=1时申请中断,cpu相应中断后,发送下一帧数据。任何方式下,该位都必须由软件清0


	//	TX帧信息:0x88--发送缓冲器首址,   FF=1--扩展帧  RTR=0--数据帧
	//			ID0   0x50
	//			ID1   0x00
	//			ID2   0x20
	//			ID3   0x00
	
	}
/*	while(1)
	{
	
 	 	if(bCanRcvFlag)
		{
			P1_0 = 0;
			bCanRcvFlag=0;

			SJARcvData(canbuf,&rcanlen);
	
    		EA=0;							//cpu禁止中断
			TI=0;							//TI=1时申请中断,cpu相应中断后,发送下一帧数据。任何方式下,该位都必须由软件清0

		for(i=0;i<rcanlen;i++)
			{
	
			  SBUF=canbuf[i];
			  while(!TI);
			  TI=0;
			}

		   	EA=1;										
	
		    WriteDataToSJA1000(REG_CAN_CMR,0x04);       //0x04:释放;接收缓冲器FXFIFO中载有信息的内存空间被释放
	
		}

	}*/

}

⌨️ 快捷键说明

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