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

📄 can1.c

📁 关于与计算机超级终端通讯的小程序.(RS232)
💻 C
📖 第 1 页 / 共 2 页
字号:
//------mck use can0 --------------------

#include  "mb90540.h"
/////////////////////////////
//注意 各文件之间的定义 不要冲突
//---above is type define------

//--------------can1 (ml) bps-------
#define BTR_4M_4545K_02_12_3     0x4FA7 	//CAN 波特率

/////////////////////////////////////
//BYTE a, c,ch;
//int i,p,t0,t1,j=0;;
extern IO_BYTE yk_fm[32][2];	//标2-0是单元号;标2-1是单元内点号

////////////////can1_ML 变量//////////
IO_BYTE Len1, pos1;
IO_LWORD	 Data1;
__far unsigned int can1_buf_rxaddr;
__far unsigned int can1_buf_rxpaddr;

extern unsigned int msecond;
extern IO_BYTE second;
extern IO_BYTE minute;
////////////////时间变量/////////////////////////
IO_LWORD SecondInMonth[4][12]={{0,2678400,5184000,7862400,10454400,13132800,15724800,18403200,21081600,23673600,26352000,28944000},
			    {0,2678400,5097600,7776000,10368000,13046400,15638400,18316800,20995200,23587200,26265600,28857600},
			    {0,2678400,5097600,7776000,10368000,13046400,15638400,18316800,20995200,23587200,26265600,28857600},
			    {0,2678400,5097600,7776000,10368000,13046400,15638400,18316800,20995200,23587200,26265600,28857600}};
			    //1  2        3       4        5       6       7      8       9        10      11      12
#define  HOUR_S	3600
#define  DATE_S	86400

IO_LWORD SecondInYear[2]={31622400,31536000};

union B_W{
	unsigned char  b[4];
	unsigned short w[2];
	unsigned long  dw;
}time_s;

IO_WORD soe_p1;

IO_BYTE ml_unit ;	//单元号
IO_BYTE can1_len ;	//报文长度
IO_BYTE fun_code;	//功能码
IO_BYTE frame_no=0;
IO_BYTE frame_flag=0;

///------------对时所用的变量--------------------------

IO_LWORD SecondInHour[24]={0,3600,7200,10800,14400,18000,21600,
		       25200,28800,32400,36000,39600,43200,
		       46800,50400,54000,57600,61200,64800,
		       68400,72000,75600,79200,82800/*,86400,*/
		       };
//-------------------------------------------
///
IO_BYTE frame_num=0,frame_count=0;
IO_BYTE dz_n_bak=0;
//
IO_WORD  cantx_tout;
#define TIMEOUT 120
extern IO_BYTE dzh_len;
IO_BYTE dz_id;
void	can1_tx_sdz(void);
void	can1_tx_wdz(void);
void	can1_tx_rdz(void);
void	can1_rdz(void);
void	can1_sdz(void);
void	dz_cl(IO_BYTE len,IO_BYTE *s,IO_BYTE *d);

/////////////////////////////////////////
void InitCan1_ml(void)
{
	//can0_init
// CAN
	CSR1 = 0x81;	// bit 7: enable transmit output pin
			//	bit 0: stop bus operation
	while (! CSR1_HALT);
	BVALR1	 = 0;		// all message buffer are invalid
	BTR1 = BTR_4M_4545K_02_12_3; //0X2F4F;
			//	activate can bus operation

//	acceptance mask definition
	AMRX01 = 0xFFFFFF7F;
	AMRX11 = 0;

	CSR1 = 0x0080;

	LEIR1=0X00;
	ROVRR1=0X0000;
//--------缓存0 use receive; buffer1 use tx-------

//	set frame format for messagebuffer 0
	BVALR1_BVAL0	 = 0;		// message buffer are invalid
	BVALR1_BVAL1=0;
	IDER1_IDE0 = 1;		// 29bit 标识符
	IDER1_IDE1=1;
	IDRX1(0) = 0x00000080;
	IDRX1(1)=0X00;
	AMSR1_AMS0	 = 2;		// full bit compare
	AMSR1_AMS1 = 1;
	TIER1_TIE0 = 0;
	BVALR1_BVAL0	 = 1;		// message buffer are valid
	BVALR1_BVAL1=1;

	RIER1_RIE0=1;		//接收允许
//	set data
	TREQR1_TREQ0 = 0;		// no transmition
	TREQR1_TREQ1=0;
	RFWTR1_RFWT0 = 0;		// no wait for remote requeset
	RFWTR1_RFWT1=0;
	TRTRR1_TRTR0	= 0;		// data frame transfer
	TRTRR1_TRTR1=0;

can1_buf_rxaddr=0;
can1_buf_rxpaddr=0;

soe_p1=0;
}

//-----------------------------------------
void	can1_soe(void)
{
	IO_BYTE b,c,d,i;

	b=(ml_unit-1)*8+ can1_rx_buf(can1_buf_rxpaddr+11)/8;//偏移量(单元号,单元内点号偏移)

	d=(can1_rx_buf(can1_buf_rxpaddr+12)) & 0x80;//状态
	c=(d>>7)&0x01;

	switch(can1_rx_buf(can1_buf_rxpaddr+11)%8)//点号
	{
		case 0x00 : if(c==(yx_1l(b) & 0x01) )return;
				else {if(c==1) yx_1l(b)|=c;	//更新yx区
					else yx_1l(b)&=0xfe;
				     }
				break;
		case 0x01 : if((c*2)==(yx_1l(b) & 0x02))return;
				else {if(c==1) yx_1l(b)|=c*2;
					else yx_1l(b)&=0xfd;
				     }
				break;
		case 0x02 : if(c*4==(yx_1l(b) & 0x04))return;
				else { if(c==1) yx_1l(b)|=c*4;
					else yx_1l(b)&=0xfb;
				     }
				break;
		case 0x03 : if(c*8==(yx_1l(b) & 0x08))return;
				else { if(c==1) yx_1l(b)|=c*8;
					else yx_1l(b)&=0xf7;
				     }
				break;
		case 0x04 : if(c*16==(yx_1l(b) & 0x10))return;
				else {if(c==1) yx_1l(b)|=c*16;
					else yx_1l(b)&=0xef;
				     }
				break;
		case 0x05 : if(c*32==(yx_1l(b) & 0x20)) return;
				else {if(c==1) yx_1l(b)|=c*32;
					else yx_1l(b)&=0xdf;
				     }
				break;
		case 0x06 : if(c*64==(yx_1l(b) & 0x40))return;
				else {if(c==1) yx_1l(b)|=c*64;
					else yx_1l(b)&=0xbf;
				     }
				break;
		case 0x07 : if(c*128==(yx_1l(b) & 0x80))return;
				else {if(c==1) yx_1l(b)|=c*128;
					else yx_1l(b)&=0x7f;
				     }
				break;
	}//更新yx区



	ml_soe_1l(soe_p1++)=ml_unit;//存单元号


	for(i=0;i<8;i++)
	ml_soe_1l(soe_p1++)=can1_rx_buf(can1_buf_rxpaddr+5+i);//存soe
	if(soe_p1>=128)soe_p1=0;
}
//---------------------------------------------------
void	can1_yx(void)
{
	IO_BYTE b,i;

	b=(ml_unit-1)*8;//偏移量 1个单元64个 yx

	if(ml_unit==60)//遥信来自I/O板
	{
	    for(i=0;i<can1_len;i++)//判断长度 是否改为:i+=2???
		ioyx_1l(i)=can1_rx_buf(can1_buf_rxpaddr+5+i);//变量 ioyx_1l 可能未定义
	}
	else 
	{
	for(i=0;i<can1_len;i++)//判断长度
		yx_1l(b+i)=can1_rx_buf(can1_buf_rxpaddr+5+i);
	}

}
//-------------------------------------------------
void	can1_yc(void)
{
	IO_BYTE i;
	IO_WORD a,b;//偏移量为字型

	b=(ml_unit-1)*36;//偏移量 18 yc


	 a=b+frame_no*8;
	
	if(ml_unit==60)//遥测来自I/O板
	{
		a=frame_no*8;

	for(i=0;i<can1_len;i++)//判断长度 是否改为:i+=2???
	{
		ioyc_1l(a+i)=can1_rx_buf(can1_buf_rxpaddr+5+i);//变量 ioyc_1l 可能未定义
	//	ns_yc_1l[a+i+1]=(*can1_rxpro_pointer++) & 0x0f;
	}
	}
	else
	{

	for(i=0;i<can1_len;i++)//判断长度 是否改为:i+=2???
	{
		yc_1l(a+i)=can1_rx_buf(can1_buf_rxpaddr+5+i);
	//	ns_yc_1l[a+i+1]=(*can1_rxpro_pointer++) & 0x0f;
	}
	}

}

//--------------------------------------------
void	can1_dd(void)//^o^ 此函数是用于主板的
{
	IO_BYTE i;
	IO_WORD a;//偏移量为字型

//	b=(ml_unit-1)*36;//偏移量 18 yc
	if(ml_unit==60)//电度来自I/O板
	{

	 a=frame_no*8;



	for(i=0;i<can1_len;i++)//判断长度 是否改为:i+=2???
	{
		iodd_1l(a+i)=can1_rx_buf(can1_buf_rxpaddr+5+i);//变量 iodd_1l 可能未定义
	//	ns_yc_1l[a+i+1]=(*can1_rxpro_pointer++) & 0x0f;
	}
	}

}
//-------------------------------------------
void	can1_bhyc(void)
{
	IO_BYTE c,i;
	IO_WORD a,b;

	b=(ml_unit-1)*36;


	for(i=0;i<can1_len;i+=4)
	{
		c=can1_rx_buf(can1_buf_rxpaddr+5+i);//点号
		a=b+c*2;

		yc_1l(a)=can1_rx_buf(can1_buf_rxpaddr+7+i);//yc的低字节
		yc_1l(a+1)=can1_rx_buf(can1_buf_rxpaddr+8+i);//yc的高字节  是否与0x0f???
	}





}
//------------------------------------------------------------------
void	can1_ykxk(void)
{
	IO_BYTE b, c;
	//
	b=yk_fm_para(yk_dx*4)&0x3f;
	//
	cyk_mask|=0x10;//有返校标识
	can_mask&=0xdf;//清 发送遥控

	/*if(sc1801_ykmask & 0x10)
	{
		sc1801_ykmask|=0x80;
		c=can1_rx_buf(can1_buf_rxpaddr+6);//取点号
		if(ml_unit==b)//比较单元号是否相同
		{
			sc1801_ykmask|=0x01;//返校对
			cyk_mask|=0x60;
		}
		else
			sc1801_ykmask|=0x02;//返校错
	}*/
	if(cdt_ykmark & 0x10)
	{
		cdt_ykmark|=0x80;
		c=can1_rx_buf(can1_buf_rxpaddr+6);//取点号
		if(ml_unit==b)//比较单元号是否相同
		{
			cdt_ykmark|=0x01;//返校对
			cyk_mask|=0x60;
		}
		else
		{
			cdt_ykmark|=0x02;//返校错
			yk_xz=0xff;
		}
	}
	
	if(cdt_ykmark0 & 0x10)
	{
		cdt_ykmark0|=0x80;
		c=can1_rx_buf(can1_buf_rxpaddr+6);//取点号
		if(ml_unit==b)//比较单元号是否相同
		{
			cdt_ykmark0|=0x01;//返校对
			cyk_mask|=0x60;
		}
		else
		{
			cdt_ykmark0|=0x02;//返校错
			yk_xz=0xff;
		}
	}
	
	if(cdt_ykmark2 & 0x10)
	{
		cdt_ykmark2|=0x80;
		c=can1_rx_buf(can1_buf_rxpaddr+6);//取点号
		if(ml_unit==b)//比较单元号是否相同
		{
			cdt_ykmark2|=0x01;//返校对
			cyk_mask|=0x60;
		}
		else
		{
			cdt_ykmark2|=0x02;//返校错
			yk_xz=0xff;
		}
	}

}
//------------------------------------------------------------------
void	can1_ykzx(void)
{
	IO_BYTE b,c;
	//
	b=yk_fm_para(yk_dx*4)&0x3f;
	//
	cyk_mask|=0x10;//有返校
	can_mask&=0xdf;//清??

	/*if(sc1801_ykmask & 0x10)
	{
		sc1801_ykmask|=0x80;
		c=can1_rx_buf(can1_buf_rxpaddr+6);//取点号
		if(ml_unit==b)//比较单元号是否相同
		{
			sc1801_ykmask|=0x04;//返校对
			cyk_mask|=0x06;
		}
		else
		{
			sc1801_ykmask|=0x08;//返校错
		}
	}*/
	if(cdt_ykmark & 0x10)
	{
		cdt_ykmark|=0x80;
		c=can1_rx_buf(can1_buf_rxpaddr+6);//取点号
		if(ml_unit==b)//比较单元号是否相同
		{
			cdt_ykmark|=0x04;//返校对
			cyk_mask|=0x06;
		}
		else
		{
			cdt_ykmark|=0x08;//返校错
		}
	}
	
	if(cdt_ykmark0 & 0x10)
	{
		cdt_ykmark0|=0x80;
		c=can1_rx_buf(can1_buf_rxpaddr+6);//取点号
		if(ml_unit==b)//比较单元号是否相同
		{
			cdt_ykmark0|=0x04;//返校对
			cyk_mask|=0x06;
		}
		else
		{
			cdt_ykmark0|=0x08;//返校错
		}
	}
	
	if(cdt_ykmark2 & 0x10)
	{
		cdt_ykmark2|=0x80;
		c=can1_rx_buf(can1_buf_rxpaddr+6);//取点号
		if(ml_unit==b)//比较单元号是否相同
		{
			cdt_ykmark2|=0x04;//返校对
			cyk_mask|=0x06;
		}
		else
		{
			cdt_ykmark2|=0x08;//返校错
		}
	}
	cyk_soe=0;


}
//---------------------------------------------------------------
void	can1_ykck(void)
{
    IO_BYTE  b,c;
	//
	b=yk_fm_para(yk_dx*4)&0x3f;
	//
	cyk_mask|=0x10;//有返校
	can_mask&=0xdf;//清??

	/*if(sc1801_ykmask & 0x10)
	{
		sc1801_ykmask|=0x80;
		c=can1_rx_buf(can1_buf_rxpaddr+6);//取点号
		if(ml_unit==b)//比较单元号是否相同
		{
			cyk_mask|=0x01;//撤控
		}
	}*/
	if(cdt_ykmark & 0x10)
	{
		cdt_ykmark|=0x80;
		c=can1_rx_buf(can1_buf_rxpaddr+6);//取点号
		if(ml_unit==b)//比较单元号是否相同
		{
			cyk_mask|=0x01;//撤控
		}
	}
	if(cdt_ykmark0 & 0x10)
	{
		cdt_ykmark0|=0x80;
		c=can1_rx_buf(can1_buf_rxpaddr+6);//取点号
		if(ml_unit==b)//比较单元号是否相同
		{
			cyk_mask|=0x01;//撤控
		}
	}
	if(cdt_ykmark2 & 0x10)
	{
		cdt_ykmark2|=0x80;
		c=can1_rx_buf(can1_buf_rxpaddr+6);//取点号
		if(ml_unit==b)//比较单元号是否相同
		{
			cyk_mask|=0x01;//撤控
		}
	}

}


⌨️ 快捷键说明

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