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

📄 test.c

📁 MCP2515.rar
💻 C
字号:
#include "stc89c51.h"

sbit CANINT		=		P3^2;
sbit SPI_SCK  =		P3^3;
sbit SPI_DO		=		P3^4;
sbit SPI_DI		=		P3^5;
sbit SPI_CE		=		P3^6;


sbit KEY0			=		P1^0;
sbit KEY1			=		P1^1;
sbit LED			=		P1^5;
unsigned char DataBuf[8];

unsigned char CanRxBuf[32];									//CAN接收的数据缓存FIFO
unsigned char CanRxPin,CanRxPout;									//数据进和出指针
unsigned char TxFlag;

#include "MCP2515.c"
unsigned char Key0Time,Key1Time;
unsigned char Value;
//unsigned char xdata RsBuf[256];

//unsigned char ComTemp[10];
unsigned char xdata ComBuf[25][10];
unsigned char ComBufPin,ComBufPout;								//串口缓冲器FIFO指针
unsigned char ComInCoun;


void SendCom(unsigned char i)
{
	SBUF=i;while(!TI);TI=0;
}
///////////////////////////////////////////////////////////////////////////////
//以下为测试相关程序
//接收串口数据
//串口数据格式: 
//第一个0x55 第二,三为要发送的CAN设备ID号,第四个为要发送的字节数量,最大为250Bytes

void uart(void) interrupt 4
{
	if(RI)
	{
		RI=0;
		TH0=0xa0;	TF0=0;ET0=1;TR0=1;				//开定时器延时1600us判断是否串口结束
		ComBuf[ComBufPin][ComInCoun]=SBUF;					//将接收的数据存至缓冲区
		ComInCoun++;
		if(ComInCoun>9)
		{
			ComInCoun=0;
			ComBufPin++;
			if(ComBufPin>24) ComBufPin=0;
			ES=0;
			if(ComBufPin!=ComBufPout)	SBUF=0x55;				//空间未满可以发送下一个字节
			else SBUF=0xff;															//空间已满
			while(!TI);TI=0;
			ES=1;
		}
	}
	if(TI)
	{
		TI=0;
		CanRxPout++;
		if(CanRxPout>31) CanRxPout=0;
		if(CanRxPout!=CanRxPin)	SBUF=CanRxBuf[CanRxPout];			//查看是否还有要发的数据
		else TxFlag=1;																				//本次完成数据发送
		LED=~LED;
	}
}
//数据接收结束
void timer0(void) interrupt 1
{
	//unsigned char i;
	ET0=0;TR0=0;
	ComInCoun=0;
}

/*=============================================================================
//参    数:	
//函数功能:
=============================================================================*/
void CanInt0(void) interrupt 2						//CAN中断
{
	//unsigned char i;
}
	
	
void initUart(void)
{
	EA=0;
	TMOD|=0x20;
	SCON=0x50;
	TH1=0xff;
	TL1=0xff;
	TR1=1;
	ET0=0;
	TR0=0;
	ET1=0;
	ES=1;
}
void Key(void)
{
	if(KEY0==0)
	{
		Key0Time++;
		if(Key0Time>150)
		{	
			
		}
	}
	else 
	{
		if(Key0Time>5) 
		{
			DataBuf[0]=1;
			DataBuf[1]=2;
			DataBuf[2]=3;
			DataBuf[3]=4;
			DataBuf[4]=5;
			DataBuf[5]=6;
			DataBuf[6]=7;
			DataBuf[7]=8;
			MCP2515_Send(MCP_LOAD_TX1,0x22,0,8);
		}
		Key0Time=0;
	}
	if(KEY1==0)
	{
		Key1Time++;
		if(Key1Time>150)
		{
			Key1Time=0;
		}
	}
	else 
	{
		if(Key1Time>5)
		Key1Time=0;
	}
}
void delay1ms(unsigned char i)
{
	unsigned char j,k;
	do
	{
		j=36;
		do
		{
			k=25;while(--k);
		}
		while(--j);
	}
	while(--i);
}

/*=============================================================================
//输入参数: Txbn 选择要发送的数据缓冲区,
						#define MCP_LOAD_TX0	0x40
						#define MCP_LOAD_TX1	0x42
						#define MCP_LOAD_TX2	0x44
//输出参数: no
//外部变量: CanBuf[8] 要发送至CAN器件的数组
//函数功能:	寄存器位置1
=============================================================================*/
void Rs232Can(unsigned char Txbn)
{
	unsigned char idh,idl,bytes,i,j;
	unsigned char Coun=0;
	
	idh=ComBuf[ComBufPout][0];											//取出ID  D3-D10
	idl=ComBuf[ComBufPout][1]&0xe0;									//取出ID  D0-D2
	bytes=ComBuf[ComBufPout][1]&0x0f;								//要发送的字节数
	i=0;j=2;																				//将从串口收到的数据向CAN转发
	do
	{
		CanBuf[i]=ComBuf[ComBufPout][j];
		i++;j++;
	}
	while(i!=bytes);
	MCP2515_Send(Txbn,idh,idl,bytes);													//向缓冲区装载数据
	if(Txbn==MCP_LOAD_TX0) MCP2515_Command(MCP_RTS_TX0);				//TX0请求发送
	if(Txbn==MCP_LOAD_TX1) MCP2515_Command(MCP_RTS_TX1);				//TX1请求发送
	ComBufPout++;																							//取下一个数据
	if(ComBufPout>25) ComBufPout=0;														//取出指针循环
}
void ledloop(void)
{
	unsigned char i,j;
	for(i=8;i--;)
	{
		LED=~LED;
		for(j=10;j--;)delay1ms(200);
	}
}
void main(void)
{
	unsigned char time,i;
	unsigned char time0;
	delay1ms(200);
	LED=0;
	EA=0;
	initUart();
	MCP2515_Init();
	EA=1;
	CANINT=1;
//Rs323-Can相关变量初始化
	ComInCoun=0;
	ComBufPin=0;
	ComBufPout=0;
	TxFlag=1;
	for(;;)
	{
		Key();
		if(ComBufPin!=ComBufPout)						//判断串口输入的指针与输出的指针是否相等
		{
			i=MCP2515_Status();
			switch(i&0x14)										//判断TXB0 TXB1是否可以发送数据
			{
				case 0x00:																//都可以发送数据								
					MCP2515_ClrBit(MCP_TXB0CTRL,TXP0);			//清TXB0发送优先级
					Rs232Can(MCP_LOAD_TX1);									//由TXB1发送数据
					break;
				case 0x04:
					MCP2515_SetBit(MCP_TXB0CTRL,TXP0);			//提高TXB0发送优先级
					Rs232Can(MCP_LOAD_TX1);									//由TXB1发送数据
					break;
				case 0x10:
					MCP2515_ClrBit(MCP_TXB0CTRL,TXP0);			//清TXB0发送优先级
					Rs232Can(MCP_LOAD_TX0);									//由TXB0发送数据
					break;
				case 0x14: 																//都在发送数据,退出
					break;
			}
		}
		if(CanRxPin!=CanRxPout)
		{
			if(TxFlag)
			{
				TxFlag=0;
				SBUF=CanRxBuf[CanRxPout];
			}
		}
		if(CANINT==0) MCP2515_Receive(MCP_RXB0DLC);			//读接收的缓冲并向串口发送
		time++;
		if(time==0)
		{
			time0++;
			if(time0==0)	LED=~LED;
		}
	}
}

⌨️ 快捷键说明

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