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

📄 坐席.c

📁 含CAN总线的MCU (89C591)的CAN通信代码
💻 C
字号:
#include<ZX.h>
bit sendflag;
bit requestid;
bit scankey();
bit PTT1=0;
sbit a=P1^0;
sbit PTT=P3^5;
sbit CH451_DCLK=P1^7;
sbit CH451_DIN=P1^6;
sbit CH451_LOAD=P1^5;
uchar code table[10]={0xed,0x21,0xf4,0xf1,0x39,0xd9,0xdd,0x61,0xfd,0xf9};
uchar chmain,chlisten;
uchar recvdata[8],senddata[8];
uchar zxid=16;                          //the address of zx;
bit PTTTemp;
bit CanSend(void);
bit CanReceive(void);
void InitTimer0(void);
void Init_CH451(void);
void CH451_WriteCom(uint Command);
void InitSJA();
void dlynms(uint n);
void dlyns(uint n);
void dlynus(uchar n);
main()
{
        int heard=0x800;   //
        int i=0,j=0;
        chmain=1;
        chlisten=1;
        Init_CH451();
        CH451_WriteCom(heard|table[1]);
        InitSJA();
        InitTimer0();
	PTTTemp=PTT;
        while(1)
        {
                DOG=~DOG;

		if(scankey()|PTT1) //PTT1 is the flag of PTT change 1--PTT change 0--no change
		{

                        CH451_WriteCom(heard|table[chmain]);
			DOG=~DOG;
			senddata[0]=zxid;
			if(PTT)
			{
				senddata[1]=0;

			}
			else        //PTT---0
			{
				senddata[1]=1;   //Ptt is valid
			}
			senddata[2]=chmain;
			senddata[3]=chlisten;
			CanSend();
		}
                DOG=~DOG;
		if(CanReceive())
		{
			if(recvdata[0]==17)
			{

                                if(((recvdata[1]>>(chmain))&0x01))
                                {
                                        CH451_WriteCom(0x601);     //led flash
                                }
                                else
                                {
                                        CH451_WriteCom(0x600);     //led don't flash
                                }
			}
                        else if(recvdata[0]==zxid)
                        {
                                ;
                        }
			else
			{
				;
			}
		}
                DOG=~DOG;
	}
}
void timer0() interrupt 1 using 1
{
	TH0=0x4c;
	TL0=0xf6;
	if(PTT!=PTTTemp)
	{
		PTT1=0;      //PTT change
		PTTTemp=PTT;
	}
	else
	{
		PTT1=1;
		PTTTemp=PTT;
	}

}
void InitTimer0(void)
{
	TMOD=0x01;
	TH0=0x4c;
	TL0=0xf6;
	EA=1;
	ET0=1;
	TR0=1;
}
bit CanReceive(void)
{
	uchar SRTemp;
	SRTemp=SR;
	DOG=~DOG;

	if(SRTemp&0x80)           //bus off
	{
		InitSJA();
                dlynus(3000);
		//return 0;
	}
	if(SRTemp&0x40)      //error
	{
		dlynus(20);
		SRTemp=SR;
	}

	if(SRTemp&0x20)           //is transmitting
	{
		dlynus(30);
		SRTemp=SR;
	}

	if(SRTemp&0x10)           //is recieving
	{

		dlynus(30);
		SRTemp=SR;
	}

	if(SRTemp&0x02)           //overrun
	{
		CMR|=0xc;
		return 0;
	}

	if(SRTemp&0x01)           //recieve buffer has data;
	{

		recvdata[0]=RXSD1;
		recvdata[1]=RXSD2;
		recvdata[2]=RXSD3;
		recvdata[3]=RXSD4;
		recvdata[4]=RXSD5;
		recvdata[5]=RXSD6;
		recvdata[6]=RXSD7;
		recvdata[7]=RXSD8;
		CMR|=0xc;
		return 1;
	}
	return 0;
}
bit CanSend(void)
{
        uchar SRTemp;
        SRTemp=SR;
	if(SRTemp&0x80)           //bus off
	{
                InitSJA();
		dlynus(3000);
		return 0;
	}

	if(SRTemp&0x40)        //error
	{
		dlynus(20);
		SRTemp=SR;
	}

	if(SRTemp&0x20)           //is transmitting
	{
		dlynus(30);
		SRTemp=SR;
	}

	if(SRTemp&0x10)           //is recieving
	{
		dlynus(30);
		SRTemp=SR;
	}

	if(SRTemp&0x02)           //overrun
	{
		CMR|=0xc;
		return 0;
	}
	TXIF =0x08;
	TXID1=0xa5;
	TXID2=0x20;
	TXSD1=senddata[0];         //requestid
	TXSD2=senddata[1];         //PTT
	TXSD3=senddata[2];         //main ch
	TXSD4=senddata[3];         //listen ch
	TXSD5=senddata[4];         //the allowed address is stored;
	TXSD6=senddata[5];
	TXSD7=senddata[6];
	TXSD8=senddata[7];
	CMR|=0x01;                  //send request;
	DOG=~DOG;
	return 1;
}

void Init_CH451(void)
{
	CH451_DIN=0;
	dlynus(2);
	CH451_DIN=1;
	CH451_WriteCom(0x201);//reset ch451;
	CH451_WriteCom(0x401);//set system parameter
	CH451_WriteCom(0x500);//set display patameter .7--mode
}
void CH451_WriteCom(uint Command)
{
	uchar i;
	CH451_LOAD=0;
	for(i=0;i<12;i++)
	{
		CH451_DIN=Command&1;
		CH451_DCLK=0;
		Command=Command>>1;
		dlynus(2);
		CH451_DCLK=1;
	}
	dlynus(2);
	CH451_LOAD=1;
}
void InitSJA()
{
        EX0=0;
        MOD=0x01;         //复位模式
			  /*
			  .4 0:wake up
			  .3 0:dual filter
			  .2 0:normal ,not self test
			  .1 0:normal ,not only listen
			  .0 1:reset
	*/
	dlynus(5);
	CDR=0xc8;
	dlynus(5);
	/*
	.7 1:PeliCan
	.6 1:only RX0
	.5 0:not receive interrupt
	.3 1:close clock out
	.2 000:clkout frequecy
	*/
	IER=0x00;
	dlynus(5);
	/*
	.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
	*/
	AMR0=0xff;
	dlynus(5);
	AMR1=0xff;
	dlynus(5);
	AMR2=0xff;
	dlynus(5);
	AMR3=0xff;
	dlynus(5);
	ACR0=0;
	dlynus(5);
	ACR1=0;
	dlynus(5);
	ACR2=0;
	dlynus(5);
	ACR3=0;
	dlynus(5);
	BTR0=0x43;
	dlynus(5);
	BTR1=0x1c; /*set baund rate 50K*/
	dlynus(5);
	OCR=0xaa;  /* out control*/
	dlynus(5);
	RBSA=0;    /*RX buffer start address 0*/
	dlynus(5);
	TXERR=0;   /*clear send buffer error*/
	dlynus(5);
	RXERR=0;
	dlynus(5);
	ECC=0;     /*clear err reg*/
	dlynus(5);
	//      CMR|=0xe0;
	//      MOD=0;     /*dual filter,work*/
	dlynus(5);
	MOD=0;
	dlynus(50);
}
bit scankey()
{
        if(!key1)
        {
                dlynms(300);
                if(!key1)
                {
			chmain++;
			if(chmain>8)
				chmain=1;
			return 1;
                }
                else
			return 0;

        }
        else if(!key2)
        {
                dlynms(300);
                if(!key2)
                {
                        chmain--;
                        if(chmain<1)
				chmain=8;
                        return 1;
                }
                else
			return 0;

        }
        else if(!key3)
        {
                dlynms(300);
                if(!key3)
                {
                        chlisten++;
                        if(chlisten>8)
				chlisten=1;
                        return 1;
                }
                else
			return 0;
        }
        else if(!key4)
        {
                dlynms(300);
                if(!key4)
                {
			chlisten--;
			if(chlisten<1)
				chlisten=8;
			return 1;
                }
                else
			return 0;
        }
        else
		return 0;
}
void dlynms(uint n)
{
	uchar i;
	for(;n>0;n--)
	{
                DOG=~DOG;
                for(i=0;i<0x7c;i++);
	}
}
void dlynus(uchar n)
{
	for(;n>0;n--);
}

⌨️ 快捷键说明

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