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

📄 hardware.c

📁 该程序完成了c8051外围电路的驱动和串口协议的编写。希望能给大家学习51单片机带来帮助
💻 C
📖 第 1 页 / 共 4 页
字号:
	sjaMOD &= 0xF7;
	writeCANreg(SJA_MOD, sjaMOD);
	if(shield_flag == 0)	            //所有数据全部接收信号板和继电器板
	{
		writeCANreg(SJA_DLC, 0x00);     //验收代码双个验收滤波器  
		writeCANreg(SJA_ID1, 0x00);
		writeCANreg(SJA_ID2, 0x00);
		writeCANreg(SJA_ID3, 0x00);		
		writeCANreg(SJA_ID4, 0xFF);     // 验收屏蔽 
		writeCANreg(SJA_DAT1, 0xFF);
		writeCANreg(SJA_DAT2, 0xFF);
		writeCANreg(SJA_DAT3, 0xFF);
	}	
	else 
	{	
		shield_ID = soID+0xC0;           //只接收与本地址soID相符的数据		
		writeCANreg(SJA_DLC, 0x00);      //验收代码 	验收滤波器1
		writeCANreg(SJA_ID1, shield_ID); //取同或逻辑		
		writeCANreg(SJA_ID2, 0x00);      //验收代码 	验收滤波器2	 		//接收广播地址
		writeCANreg(SJA_ID3, 0xFF);		
		writeCANreg(SJA_ID4, 0xFF);       // 验收屏蔽 
		writeCANreg(SJA_DAT1, 0xC1);			
		writeCANreg(SJA_DAT2, 0xFF);      // 验收屏蔽 
		writeCANreg(SJA_DAT3, 0xC0);
	}
	
	writeCANreg(SJA_EWLR, 0x6E);          //设置错误报警限制寄存器 = 110
	writeCANreg(SJA_RXERR, 0x00);         //设置接收和发送错误计数寄存器的值都为0
	writeCANreg(SJA_TXERR,0x00);
	writeCANreg(SJA_BTR0, 0x43);          // 波特率: 100Kbit/s @ 16 MHz
	writeCANreg(SJA_BTR1, 0xAF);         // //writeCANreg(SJA_BTR1, 0x2F);  高于125KB/S低于125KB/S
	writeCANreg(SJA_OCR, 0x1A);          // 输出控制寄存器SJA_OCR = 0x1A;  悬空TX1, 推挽TX0,正常输出模式
	sjaMOD = readCANreg(SJA_MOD);         //进入工作模式
	
	uiCount = 0;
	while ((sjaMOD & 0x01) != 0)			   //判断是否复位	  modify?????
	{
		uiCount++;
		writeCANreg(SJA_MOD, 0x00);
		sjaMOD = readCANreg(SJA_MOD);   
		if(uiCount>1000)
		{
			break;
		}
	}   
	writeCANreg(SJA_IER, 0x01);          // SJA_IER |= 0x01;   使能接收中断

	EX0 = 1;
}
  
/////////////////////////////////////////////////////////////////////////////////////////
//void writeCANdata(unsigned char* uchCanData)
//入口参数:要写入SJA1000的数据	
//函数返回:无
//全局变量:无
//功能描述:把数据写入SJA1000,并发送
//函数说明:
//编写人:  郑福                                                
/////////////////////////////////////////////////////////////////////////////////////////
void writeCANdata(unsigned char *uchCanData)
{
	unsigned char idata sjaSR;
	unsigned int idata uiCount = 0;
	unsigned char uchFlage = 1;
	unsigned char uchFlageCount = 0;

	while (uchFlage == 1 && uchFlageCount < 4)
	{
		uchFlage = 0;
		uchFlageCount++;
		FeedDog(); 
	/*	do    
		{
			uiCount++;	
			sjaSR = readCANreg(SJA_SR); 
			if (uch_Count>6000)
			{	
				uchFlage = 1;
				CAN_Init(uchHWCPUAdress,1);	//CAN初始化放在何处?????
				uiCount = 0;
				writeCANreg(SJA_CMR, 0x02);
				break;	
			}  
		}
		while ((sjaSR&0x08) == 0);        //判断上次发送是否完成,未完成等待发送完成 SR.3 == 0 未完成等待发送完成
	
	*/
		uiCount = 0;  
		do
		{
			uiCount++;
			FeedDog(); 
			sjaSR = readCANreg(SJA_SR); 

			if (uiCount>10000)
			{
				uchFlage = 1;
				CAN_Init(uchHWCPUAdress,1);	//CAN初始化放在何处?????
				uiCount = 0;
				break;
			} 	
		}
		while ((sjaSR&0x04)==0);           //判断发送缓存区是否锁定,锁定等待 SR.2 == 0 锁定等待
		uiCount = 0;
/*		do
		{
			uiCount++;
			sjaSR = readCANreg(SJA_SR); 
			if (uiCount>10000)
			{
				uchFlage = 1;
				CAN_Init(uchHWCPUAdress,1);	//CAN初始化放在何处?????
				uiCount = 0;
				break;
			} 	
		}
		while ((sjaSR&0x40)==0x40);           //判断发送缓存区是否锁定,锁定等待 SR.2 == 0 锁定等待
	
	*/
		while(1)
		{
			uiCount++;
			FeedDog();
			StopCan();
			sjaSR = readCANreg(SJA_SR); 
			if((sjaSR&0x40) == 0x40)
			{
				 StartCan();
			}
			else
			{
			 	break;
			}
			if (uiCount>10000)
			{
				uchFlage = 1;
				CAN_Init(uchHWCPUAdress,1);
				break;
			} 	
			
		}
	}

	if (uchFlageCount < 3)
	{
		writeCANreg(SJA_DLC, uchCanData[0]);         // Bit7=1:EFF;  Bit6=0:data 		
		writeCANreg(SJA_ID1, uchCanData[1]);         //29位识别码
		writeCANreg(SJA_ID2, uchCanData[2]);
		writeCANreg(SJA_ID3, uchCanData[3]);
		writeCANreg(SJA_ID4, uchCanData[4]);         		
		writeCANreg(SJA_DAT1, uchCanData[5]);         //数据
		writeCANreg(SJA_DAT2, uchCanData[6]);
		writeCANreg(SJA_DAT3, uchCanData[7]);
		writeCANreg(SJA_DAT4, uchCanData[8]);
		writeCANreg(SJA_DAT5, uchCanData[9]);
		writeCANreg(SJA_DAT6, uchCanData[10]);
		writeCANreg(SJA_DAT7, uchCanData[11]);
		writeCANreg(SJA_DAT8, uchCanData[12]);
		writeCANreg(SJA_CMR, 0x01);
	}
	StartCan();
}


void writeCANdataRemateFrame(unsigned char xdata *data uchCanData)
{
	unsigned char idata sjaSR;
//	unsigned char idata i = 0; 
	unsigned char j ;
	unsigned char uchJumpFlag = 0;
	unsigned int xdata uiCount;

	for(j=0; j<2; j++)
	{
		uiCount = 0;
		do
		{
			uiCount++;
			FeedDog();
			sjaSR = readCANregRemote(SJA_SR);
			if(uiCount>10000)
			{
				break;
			}

		}
		while ((sjaSR&0x04)==0)	;                  // 判断发送缓存区是否锁定,锁定等待 SR.2 == 0 锁定等待

		uiCount = 0;
	    do
		{
			uiCount++;
			FeedDog();
			sjaSR = readCANregRemote(SJA_SR); 
			
			if (uiCount>10000)
			{
				break;
			} 	
		}
		while ((sjaSR&0x40) == 0x40);           //判断发送缓存区是否锁定,锁定等待 SR.2 == 0 锁定等待

		writeCANregRemote(SJA_DLC, uchCanData[0]);         // Bit7=1:EFF;  Bit6=0:data 
		
		writeCANregRemote(SJA_ID1, uchCanData[1]);         //29位识别码
		writeCANregRemote(SJA_ID2, uchCanData[2]);
		writeCANregRemote(SJA_ID3, uchCanData[3]);
		writeCANregRemote(SJA_ID4, uchCanData[4]);         
		
		writeCANregRemote(SJA_DAT1, uchCanData[5]);         //数据
		writeCANregRemote(SJA_DAT2, uchCanData[6]);
		writeCANregRemote(SJA_DAT3, uchCanData[7]);
		writeCANregRemote(SJA_DAT4, uchCanData[8]);
		writeCANregRemote(SJA_DAT5, uchCanData[9]);
		writeCANregRemote(SJA_DAT6, uchCanData[10]);
		writeCANregRemote(SJA_DAT7, uchCanData[11]);
		writeCANregRemote(SJA_DAT8, uchCanData[12]);
			
		writeCANregRemote(SJA_CMR, 0x01);	
		break;
	}
}

/////////////////////////////////////////////////////////////////////////////////////////
//void readuchCanData(void) interrupt 2  using 2  
//入口参数:无	
//函数返回:无	
//全局变量:dlc[RecBufIndex];ID28_21[RecBufIndex];ID20_13[RecBufIndex];ID12_5[RecBufIndex];ID4_0[RecBufIndex];
//      	dat[RecBufIndex][8];RecBufIndex;uchCanIntterSta;
//功能描述:CAN 接收中断
//函数说明:在读缓存区时,先读全局变量uchCanIntterSta,其值为0:报文正常,其值为1:报文溢出,
//          其值为2:错误导致中断(需要在CAN初始化时,打开错误报警中断使能,writeCANreg(SJA_IER, 0x05); )
//          该函数运行时,关闭总中断,停止运行时,关闭总中断
//编写人:  郑福                                                
/////////////////////////////////////////////////////////////////////////////////////////  

void readCANdata(void) interrupt 2     //using 2  
{
	unsigned char  idata sjaSR,sjaIR;
    unsigned char  idata uchReceiDataIndex=0;
	
	sjaSR = readCANregRemote(SJA_SR);        //是否有报文溢出
	if ((sjaSR&0x02) != 0 )            //报文溢出
	{    
		writeCANregRemote(SJA_CMR, 0x0c);     //CMR.3=1 数据溢出位被清除 CMR.2=1 释放接收缓冲区中当前呈现的报文
	}
	
	sjaIR = readCANregRemote(SJA_IR);
	if ((sjaIR&0x01)==1 )
	{
		uchReceiData[uchReceiDataIndex] = readCANregRemote(SJA_DLC);       //数据长度
		uchReceiDataIndex++;
		uchReceiData[uchReceiDataIndex] = readCANregRemote(SJA_ID1);   //29位识别码	
        uchReceiDataIndex++;      
		uchReceiData[uchReceiDataIndex] = readCANregRemote(SJA_ID2);
        uchReceiDataIndex++;
		uchReceiData[uchReceiDataIndex] = readCANregRemote(SJA_ID3); 
        uchReceiDataIndex++;    
		uchReceiData[uchReceiDataIndex] = readCANregRemote(SJA_ID4);
        uchReceiDataIndex++;   	  
		uchReceiData[uchReceiDataIndex] = readCANregRemote(SJA_DAT1);   //接收数据 
        uchReceiDataIndex++;
		uchReceiData[uchReceiDataIndex] = readCANregRemote(SJA_DAT2); 
        uchReceiDataIndex++;
		uchReceiData[uchReceiDataIndex] = readCANregRemote(SJA_DAT3); 
        uchReceiDataIndex++;
		uchReceiData[uchReceiDataIndex] = readCANregRemote(SJA_DAT4); 
        uchReceiDataIndex++;
		uchReceiData[uchReceiDataIndex] = readCANregRemote(SJA_DAT5); 
        uchReceiDataIndex++;
		uchReceiData[uchReceiDataIndex] = readCANregRemote(SJA_DAT6); 
        uchReceiDataIndex++;
		uchReceiData[uchReceiDataIndex] = readCANregRemote(SJA_DAT7); 
        uchReceiDataIndex++;
		uchReceiData[uchReceiDataIndex] = readCANregRemote(SJA_DAT8);
		uchReceiDataIndex=0;  

		writeCANregRemote(SJA_CMR, 0x04);

		CanFrameInterrupt(uchReceiData);
	}
	else
	{
//		uchCanIntterSta = 2;
	}
}  
/////////////////////////////////////////////////////////////////////////////////////////////////
//void StartCan();
//入口参数:      无
//函数返回:      无
//功能描述:      启动CAN
//编写人:        王东尧
//编写完成时间:  2007-04-16
/////////////////////////////////////////////////////////////////////////////////////////////////
void StartCan()
{
	writeCANreg(SJA_IER, 0x01);//使能接收中断
}
/////////////////////////////////////////////////////////////////////////////////////////////////
//void StopCan();
//入口参数:      无
//函数返回:      无
//功能描述:      停止CAN
//编写人:        王东尧
//编写完成时间:  2007-04-16
/////////////////////////////////////////////////////////////////////////////////////////////////
void StopCan()
{
    writeCANreg(SJA_IER, 0x00);//屏蔽接收中断
}

//--------------------------------------------------------
//函数名称:void InitHardWareModule(void)
//功    能:初始化单片机硬件模块
//输入参数:无
//返    回:无
//完成日期:4/13/2007
//----------------------------------------------------------
void InitHardWareModule(void)
{
	SysCLKInit();
	InitCPU();
	FeedDog();
	StopHeartBeat();
	SetHeartInterval(10);
	InitDA();
	InitADC1();
	InitRef();
	SetExternalRAM();
	ADC0_Init ();
}

//--------------------------------------------------------
//函数名称:void InitHardWareParaVariable(void)
//功    能:初始化单片机硬件模块中的参数
//输入参数:无
//返    回:无
//完成日期:4/13/2007
//----------------------------------------------------------
void InitHardWareParaVariable(void)
{
	unsigned int xdata i;
	
	SamplePTR0 = 0; 
	SamplePTR1 = 0;   
    SamplePTR2 = 0;  
    SamplePTR3 = 0;
	uchConfigStatus = 1; 			  
	uchBypassStatus = 1;		   
	uchTripleStatus = 1;
	StopHeartBeat(); 	   
	uiHeartbeatValue = 0; 		
	StartHeartBeat();				 
	uchSampleCompleteStatus = 0;
	uchSampleType = 13;


	uiGroupLength = 256;



	FeedDog();
	for(i=0;i<2048;i++)
	{
		SampBuffer0[i] = 0x7FF;
		SampBuffer1[i] = 0x7FF;
		SampBuffer2[i] = 0x7FF;
		SampBuffer3[i] = 0x7FF;
	}
	FeedDog();
	SetSampleBuffer0(SampBuffer0);
	SetSampleBuffer1(SampBuffer1);
	SetSampleBuffer2(SampBuffer2);
	SetSampleBuffer3(SampBuffer3);

	uchCANReSendFlag=0x00;
	uchHWCPUAdress = ReadCANAddress();
	b_NotIntegralChannelType = 0;
	b_IntegralChannelType = 0;
	b_LVDTChannelType = 0;

	uchSampleLocationCounter = 0;

}






⌨️ 快捷键说明

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