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

📄 main.c

📁 这是一个用单片机控制CAN总线芯片SJA1000传输的C51程序,89C51单片机,sja1000.h是内部寄存器的定义,main.c是传输主程序
💻 C
字号:
#include <reg51.h>
#include <intrins.h>
#include <STDIO.h>
#include <sja1000.h>
#define TR 1
#define SLAVE 0xF1			//单片机地址
#define	uchar unsigned	char
p2_7=0;
uchar idata lzw[10];
uchar idata tld[10]={"sucesslove"};
void Init_CAN(void)
{
	BCAN_ENTER_RETMODEL();
	BCAN_SET_BANDRATE(0x04);
	BCAN_SET_OBJECT(0xAA,0xFF);
	BCAN_SET_OUTCLK(0xAA,0x48);
	BCAN_QUIT_RETMODEL();
	SJA_BCANAdr=REG_CONTROL;
	*SJA_BCANAdr|=0x1e;
}
TX_DATA_CAN();
RE_DATA_CAN();
SERIAL();
main()
{
        SCON=0x50;			//串口方式1
	PCON=0x00;			//单倍频
	TMOD=0x21;			//设置T1方式2 T0方式1
	TL1=0xfd;			//波特率为80kb/s
	TH1=0xfd;
	TR1=1;
	EA=1;
	ES=1;
       	Init_CAN();
        if(TR==0)
	{TX_DATA_CAN();	}
	else{RE_DATA_CAN();}
	SERIAL();
}
TX_DATA_CAN()
{
	uchar i,pf;
	do
	{	SBUF=0xAA;					//发送联络信息
	while(TI==0);				//等待发送
	TI=0;
	while(RI==0);		   		//接收答应信号
	RI=0;
	}while((SBUF^0xBB)!=0);		//未准备好继续联络
	do
	{	pf=0;
		for(i=0;i<10;i++)
		{	SBUF=lzw[i];
			pf+=lzw[i];
			while(TI==0);
			TI=0;}
		SBUF=pf;
		while(TI==0)
		TI=0;
		while(RI==0);
		RI=0;						 //等待回答
	}while(SBUF!=0)	;		     //出错重发
}
RE_DATA_CAN()
{	uchar i,pf;
	uchar T[10];
	uchar test;
	do
	{}while(RI==0);		  		//等待接收
	RI=0;
	test=SBUF;
	test=test^0xaa;
	while(test!=0)
	{
		  SBUF=0xBB;
	}
     //	while((SBUF^0xAA)!=0);	//判断是否申请发送
     //	{
     //		SBUF=0xBB;
     //	}
	while(TI==0)
		TI=0;
	while(1)
	{	pf=0;
		for(i=0;i<10;i++)
		{while(RI==0);				 //接收数据
			RI=0;
			T[i]=SBUF;					 //接收一位数据
			pf+=T[i];					 //求和
		}
		while(RI==0);
		RI=0;
		if((SBUF^pf)==0)			  //比较求和是否正确
		{	SBUF=0x00;
			while(TI==0)
			TI=0;
			break;}
		else
		{
			SBUF=0xff;
			while(TI==0)
			TI=0;}
	}
}
void error(void)
{SBUF=0xFF;
while(TI!=1);
TI=0;}
uchar receive(uchar addrs)
{uchar i,pf;
while(1)
{while(RI!=1)
RI=0;						//等待PC的联络信号
if(SBUF!=addrs)				//如果出错,发送出错标志
error();
else
{TB8=0;						//清地址标志位准备接受数据
SBUF=0x00;					//发送约定代码00H,说明地址正确
while(TI!=1);
TI=0;
while(RI!=1);
RI=0;
{while(1)
{pf=0;
for(i=0;i<10;i++)
{while(RI!=1);
RI=0;
lzw[i]=SBUF;			   //单片机接收数据
pf+=lzw[i];}
while(RI==0);
RI=0;
if(SBUF==pf)
{SBUF=0x00;
while(TI!=1);
TI=0;}
else
{SBUF=0xFF;					 //校验和不同,发0XFF给PC机
while(TI!=1);
TI=0;}
}
TB8=1;					   //重置地址标志位
return(0);}
}}}
uchar send()
{uchar pf,i;
do
{pf=0;
for(i=0;i<10;i++)
{SBUF=tld[i];
pf+=tld[i];
while(TI!=1);
TI=0;}
SBUF=pf;
while(TI!=1);
TI=0;
while(RI!=1);
RI=0;
}
while(SBUF!=0);
TB8=1;
return(0);}
SERIAL()
{
receive(SLAVE);
send();
}


⌨️ 快捷键说明

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