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

📄 张.txt

📁 含CAN总线的MCU (89C591)的CAN通信代码
💻 TXT
字号:
#include <reg591.h>
#define uint unsigned int
#define uchar unsigned char
uchar recvdata[8],senddata[8];
uchar openpttid[8];
uchar id1,id2;
uchar PTTFLAG=0,PTTTemp;                //record the value of P2;
bit PTTFLAG1=0;
sbit dog=P3^5;
sbit  MT8816_DATA=P3^3;  //8816数据,决定矩阵节点断通
sbit  MT8816_CS1=P3^4;          // need try to reset 8816
sbit  MT8816_CS2=P3^6;
sbit  MT8816_CS3=P3^7;
sbit  MT8816_STORE=P0^7;    //8816锁存
sbit  MT8816_RESET=P3^2;  //reset
void InitPort(void);
void InitTimer0(void);
void dlynms(uint n);
bit CanReceive(void);
bit CanSend(void);
void clearchmain(uchar zxid);
void writechmain(uchar chmain,uchar zxid);
void clearchlisten(uchar zxid);
void writechlisten(uchar chmain,uchar zxid);
void WR_MT8816(uchar address,bit Type,uchar cs);
void InitCan();
void dlynms(uint n);
void dlynus(uint n);
main()
{
	uchar recvzxid,P2temp;
	uchar PTT,i;
	recvzxid=1;
	InitPort();
	InitCan(); //have enable int(RX and TX)
	InitTimer0();
	PTTTemp=P2;
	dog=~dog;
          MT8816_RESET=1;
          dlynms(4);
          MT8816_RESET=0;
          dlynms(1);
          for(i=0;i<16;i++)
          {
                    WR_MT8816(i,1,1);
                    dog=~dog;
                    WR_MT8816(i,1,2);
          }
	while(1)
	{
		dog=~dog;
		if(CanReceive())
		{
			if((recvdata[0]>0)&&(recvdata[0]<17))
			{
				recvzxid=recvdata[0];
				if(recvdata[1])             //PTT is valid
				{
					PTT=0x01;
					P2temp=P2&(PTT<<(recvdata[2]-1));
					if(!P2temp)  // no user
					{
						openpttid[recvdata[2]-1]=recvdata[0];   //record id of zx that open the PTT
						P2=P2|(PTT<<(recvdata[2]-1));
					}
					else
					{
						;   //using
					}

				}
				else
				{
					if(openpttid[recvdata[2]-1]==recvzxid)          //keep the indentify between zx and ptt
					{
						PTT=0x01;
						P2=P2&(~(PTT<<(recvdata[2]-1)));
					}
				}
				dog=~dog;
				clearchmain(recvzxid);
				writechmain(recvdata[2],recvzxid);
				clearchlisten(recvzxid);
				writechlisten(recvdata[3],recvzxid);
				dog=~dog;
			}
		}

		if(PTTFLAG1)
		{
			senddata[0]=17;
			senddata[1]=PTTFLAG;
			CanSend();
			dog=~dog;
		}
		dog=~dog;
	}
}
void timer0() interrupt 1 using 1
{
	TH0=0x4c;
	TL0=0xf6;
	PTTFLAG=P2;
	if(PTTFLAG!=PTTTemp)   //PTT--1,the ptt have been released;
	{
		PTTFLAG1=1;
		PTTTemp=PTTFLAG;
	}
	else
	{
		PTTFLAG1=0;
	}
}
void InitTimer0(void)
{
	TMOD=0x01;
	TH0=0x4c;
	TL0=0xf6;
	EA=1;
	ET0=1;
	TR0=1;
}
void InitCan()
{
	CANMOD=1;                    //enter reset mode
	CANADR=4;                    //interrupt enable
	CANDAT=0;                 //CANDAT=0x8d
				  /*
				  .7 1:bus error
				  .6 0:arbitration
				  .5 0:error passive
				  .4 0:wake up
				  .3 1:data over run
				  .2 1:error warning
				  .1 1:transimit
				  .0 1:receive
	*/
	CANADR=0x05;/*RIL;*/
	CANDAT=0;
	/*
	interrupt receive number reg
	*/
	CANADR=0x06;/*BTR0;*/
	CANDAT=0x47;
	CANADR=0x07;/*BTR1;*/
	CANDAT=0x1c;
	/*
	BPLS=50K
	SJW=2,BRP=12,
	SP=85,NBT=20,
	SAM=0,TSEG1=16,TSEG2=3
	*/
	CANADR=0x0a;/*RBSA;*/      //recieve buffer start address
	CANDAT=0;
	CANADR=0x0c;/*ECC;*/
	CANDAT=0;
	CANADR=0x0e;/*RXERR;*/
	CANDAT=0;
	CANADR=0x0f;/*TXERR;*/
	CANDAT=0;
	CANADR=0x1d;/*ACFMOD;*/
	CANDAT=0x55;    //////aa
	CANADR=0x1e;/*ACFEN;*/
	CANDAT=0xff;
	CANADR=0x1f;/*ACFPRIO;*/
	CANDAT=1;
	/*bank1*/
	CANADR=0x20;/*ACR0*/
	CANDAT=0;
	CANADR=0x21;/*ACR1*/
	CANDAT=10;
	CANADR=0x22;/*ACR2*/
	CANDAT=101;
	CANADR=0x23;/*ACR3*/
	CANDAT=0;
	CANADR=0x24;/*AMR0*/
	CANDAT=0xff;
	CANADR=0x25;/*AMR1*/
	CANDAT=0xff;
	CANADR=0x26;/*AMR2*/
	CANDAT=0xff;
	CANADR=0x27;/*AMR3*/
	CANDAT=0xff;
	/*bank2*/
	CANADR=0x28;/*ACR0*/
	CANDAT=1;
	CANADR=0x29;/*ACR1*/
	CANDAT=2;
	CANADR=0x2a;/*ACR2*/
	CANDAT=3;
	CANADR=0x2b;/*ACR3*/
	CANDAT=4;
	CANADR=0x2c;/*AMR0*/
	CANDAT=0xff;
	CANADR=0x2d;/*AMR1*/
	CANDAT=0xff;
	CANADR=0x2e;/*AMR2*/
	CANDAT=0xff;
	CANADR=0x2f;/*AMR3*/
	CANDAT=0xff;
	/*bank3*/
	CANADR=0x30;/*ACR0*/
	CANDAT=1;
	CANADR=0x31;/*ACR1*/
	CANDAT=2;
	CANADR=0x32;/*ACR2*/
	CANDAT=3;
	CANADR=0x33;/*ACR3*/
	CANDAT=4;
	CANADR=0x34;/*AMR0*/
	CANDAT=0xff;
	CANADR=0x35;/*AMR1*/
	CANDAT=0xff;
	CANADR=0x36;/*AMR2*/
	CANDAT=0xff;
	CANADR=0x37;/*AMR3*/
	CANDAT=0xff;
	/*bank4*/
	CANADR=0x38;/*ACR0*/
	CANDAT=1;
	CANADR=0x39;/*ACR1*/
	CANDAT=2;
	CANADR=0x3a;/*ACR2*/
	CANDAT=3;
	CANADR=0x3b;/*ACR3*/
	CANDAT=4;
	CANADR=0x3c;/*AMR0*/
	CANDAT=0xff;
	CANADR=0x3d;/*AMR1*/
	CANDAT=0xff;
	CANADR=0x3e;/*AMR2*/
	CANDAT=0xff;
	CANADR=0x3f;/*AMR3*/
	CANDAT=0xff;
	CANMOD=0x00;////enter operatation mode
}
bit CanReceive(void)
{
	uchar SRTEMP;
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      	SRTEMP=CANSTA;
	if(SRTEMP&0x80)           //bus off
	{
                    InitCan();
		dlynus(3000);
		//return 0;

	}
	if(SRTEMP&0x40)     //error
	{
		dlynus(10);
		dog=~dog;
		SRTEMP=CANSTA;
	}
	if(SRTEMP&0x20)           //is transmitting
	{
		dlynus(10);
		dog=~dog;
		SRTEMP=CANSTA;
	}
	if(SRTEMP&0x10)           //is recieving
	{
		dlynus(10);
		dog=~dog;
		SRTEMP=CANSTA;
	}
	if(SRTEMP&0x02)           //overrun
	{
		CANCON|=0xc;
		return 0;
	}
	if(SRTEMP&0x01)    //have data in data buffer
	{

		CANADR=0x61;
		id1=CANDAT;
		CANADR=0x62;
		id2=CANDAT;
		CANADR=0x63;
		recvdata[0]=CANDAT;
		CANADR=0x64;
		recvdata[1]=CANDAT;
		CANADR=0x65;
		recvdata[2]=CANDAT;
		CANADR=0x66;
		recvdata[3]=CANDAT;
		CANADR=0x67;
		recvdata[4]=CANDAT;
		CANADR=0x68;
		recvdata[5]=CANDAT;
		CANADR=0x69;
		recvdata[6]=CANDAT;
		CANADR=0x6a;
		recvdata[7]=CANDAT;
		CANCON|=0x0c;
                    dlynms(10);
		return 1;
	}
	return 0;

}
bit CanSend(void)
{
	uchar SRTEMP;
	SRTEMP=CANSTA;
	if(SRTEMP&0x80)           //bus off
	{
		dlynus(3000);
		return 0;

	}
	if(SRTEMP&0x40)     //error
	{
		dlynus(10);
		dog=~dog;
		SRTEMP=CANSTA;
	}
	if(SRTEMP&0x20)           //is transmitting
	{
		dlynus(10);
		dog=~dog;
		SRTEMP=CANSTA;
	}
	if(SRTEMP&0x10)           //is recieving
	{
		dlynus(10);
		dog=~dog;
		SRTEMP=CANSTA;
	}
	if(SRTEMP&0x02)           //overrun
	{
		CANCON|=0xc;
		return 0;

	}

	CANADR=0x70;
	CANDAT=0x08;
	CANADR=0x71;
	CANDAT=0xa5;
	CANADR=0x72;
	CANDAT=0x20;
	CANADR=0x73;
	CANDAT=senddata[0];
	CANADR=0x74;
	CANDAT=senddata[1];
	CANADR=0x75;
	CANDAT=senddata[2];
	CANADR=0x76;
	CANDAT=senddata[3];
	CANADR=0x77;
	CANDAT=senddata[4];
	CANADR=0x78;
	CANDAT=senddata[5];
	CANADR=0x79;
	CANDAT=senddata[6];
	CANADR=0x7a;
	CANDAT=senddata[7];
	CANCON|=0x01;
          dlynus(10);
	dog=~dog;
	return 1;

}
void InitPort(void)
{
	EA=0;
	AUXR1=0x08;
	P1M1=0x00;
	P1M2=0x00;
	P1M2|=0x02;
	P2M1=0x00;
	P2M2=0x00;
          P2=0;
	P3M1=0;
	P3M2=0;
}
void clearchmain(uchar zxid)
{
	uchar i,temp,wadd;
	for(i=0;i<8;i++)
	{
		temp=i;
		wadd=(temp<<4)|(zxid-1);
		WR_MT8816(wadd,0,1);
	}

}
void writechmain(uchar chmain,uchar zxid)
{
	WR_MT8816(((chmain-1)<<4)|(zxid-1),1,1);
}
void clearchlisten(uchar zxid)
{
	uchar i,temp,wadd;
	for(i=0;i<8;i++)
	{
		temp=i;
		wadd=(temp<<4)|(zxid-1);
		WR_MT8816(wadd,0,2);
	}
}
void writechlisten(uchar chlisten,uchar zxid)
{
	WR_MT8816(((chlisten-1)<<4)|(zxid-1),1,2);
}
void WR_MT8816(uchar address,bit Type,uchar cs)
{
	if(cs==1)
	{
		MT8816_CS1=1;
                    dlynus(15);
		P0=(P0&0x80)|address;
		dlynus(15);
		MT8816_STORE=1;  //set store bit
		dlynus(30);
		MT8816_DATA=Type;  //write data bit
		dlynus(30);
		MT8816_STORE=0;
                    dlynus(15);
		MT8816_CS1=0;
                    dlynus(15);
	}
	else if(cs==2)
	{
		MT8816_CS2=1;
                    dlynus(15);
		P0=(P0&0x80)|address;
		dlynus(15);
		MT8816_STORE=1;  //set store bit
		dlynus(30);
		MT8816_DATA=Type;  //write data bit
		dlynus(30);
		MT8816_STORE=0;
                    dlynus(15);
		MT8816_CS2=0;
                    dlynus(15);
	}
	else
	{
		MT8816_CS3=1;
                    dlynus(15);
		P0=(P0&0x80)|address;
		dlynus(15);
		MT8816_STORE=1;  //set store bit
		dlynus(30);
		MT8816_DATA=Type;  //write data bit
		dlynus(30);
		MT8816_STORE=0;
                    dlynus(15);
		MT8816_CS3=0;
                    dlynus(15);
	}
}
void dlynms(uint n)
{
          uchar i;
          for(;n>0;n--)
          {
                    dog=~dog;
                    for(i=0;i<0x7c;i++);
          }
}
void dlynus(uint n)
{
	for(;n>0;n--);
}

⌨️ 快捷键说明

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