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

📄 hardware.c

📁 该程序完成了c8051外围电路的驱动和串口协议的编写。希望能给大家学习51单片机带来帮助
💻 C
📖 第 1 页 / 共 4 页
字号:
{
	static unsigned int xdata uiCountValue = 0;
	static unsigned char xdata uchLEDControlFlag = 0;

	uiCountValue++;
	TF2 = 0;
	if (uiCountValue >= 3) 
	{
		if (uchLEDControlFlag == 0)
		{
			HWOKLEDControl(0);		   //灯亮
			uchLEDControlFlag = 1;	
			uiCountValue = 0;
		}
		else 
		{
			HWOKLEDControl(1);				 //灯灭	 他们的控制受系统OK状态控制
			uchLEDControlFlag = 0;	
			uiCountValue = 0;
		}
	}

}
   
//*************************************************
//             ADC0初始化                         *
//*************************************************
void ADC0_Init (void)
{
	ADC0CN = 0x44;					//ADC0 控制
	AMX0CF = 0x00;					//单端输入
	AMX0SL = 0x00;                  //采样通道初始化
	ADC0CF = 0x58;					//增益,时钟=22.1184/6M
	REF0CN=0x02;					//外部参考
	AD0EN=1;					    //ADC0使能
	EIE2|=0x02;                     //允许ADC中断
	EIP2 |= 0x02;					//采样ADC0中断为高优先级
}

//*************************************************
//            定时器3初始化                       *
//*************************************************
void SetSampleRate(int counts)
{
	TMR3CN = 0x00;					// 停止定时器3,清除TF3,使用SYSCLK
   	TMR3RL  = -counts;               // 初始化重载值
   	TMR3    = 0xffff;                // 立即重装载
   	EIE2   &= ~0x01;                 // 禁止定时器3中断
   	TMR3CN |= 0x04;					// 启动定时器3
}

//-------------------------------------------------------------------------
//函数名称:void SetSampleTypeHW(unsigned char uchChannelType)
//功    能:将通道类型设置到硬件模块中
//输入参数:通道类型	
//返    回:无				 
//完成日期:4/16/2007
//-------------------------------------------------------------------------
void SetSampleTypeHW(unsigned char uchChannelType)
{
	SampleStopControl();             //HHH	   
	if (((uchChannelType > 12) && (uchChannelType < 19)) || ((uchChannelType > 20) && (uchChannelType < 23)) || (uchChannelType == 28))
	{
		uchSampleType = uchChannelType;
	}
	else
	{
		uchSampleType = 13;			   //设定类型,不在范围之内默认轴位置
	}
//	SampleStartControl();		
}

//-------------------------------------------------------------------------
//函数名称:void SetInitChannel(void)
//功    能:设置通道初始化
//输入参数:无	
//返    回:无				 
//完成日期:4/16/2007
//-------------------------------------------------------------------------
void SetInitChannel(void)
{
	switch(uchSampleType)
	{
		case 13:	   //加速度输入    输出加速度
			AMX0SL = 0x00;
			break;
		case 14:	   //加速度输入    输出速度
			AMX0SL = 0x04;
			break;
		case 15:	   // 加速度输入    输出位移
			AMX0SL = 0x00;
			break;
		case 16:	  // 速度输入      输出速度
			AMX0SL = 0x00;
			break;
		case 17:	  //速度输入      输出位移
			AMX0SL = 0x04;
			break;
		case 18:	  //  位移输入     输出位移
			AMX0SL = 0x00;
			break;
		case 21:   	 //	涡流+速度    输出复合式振动
			AMX0SL = 0x00;
			break;
		case 22:  	  //LVDT输入      输出机壳膨胀
			AMX0SL = 0x01;
			break;
		case 28:  	  //LVDT输入      输出机壳膨胀
			AMX0SL = 0x01;
			break;	 
		default:
			AMX0SL = 0x00;
		break;
	}	
}

//-------------------------------------------------------------------------
//函数名称:void SampleStartControl(void)
//功    能:开始采样
//输入参数:无	
//返    回:无				 			
//完成日期:4/16/2007
//-------------------------------------------------------------------------
void SampleStartControl(void)
{
	TMR3CN |= 0x04;
}

//-------------------------------------------------------------------------
//函数名称:void SampleStopControl(void)
//功    能:停止采样
//输入参数:无	
//返    回:无				 			
//完成日期:4/16/2007
//-------------------------------------------------------------------------
void SampleStopControl(void)
{
	TMR3CN &= ~0x04;
}

//--------------------------------------------------------------------------------------------------
//函数名称:void SoftReset(void)
//功    能:软件复位
//输入参数:无
//返    回:无						 
//-------------------------------------------------------------------------------------------------
void SoftReset(void)
{
	RSTSRC |= 0x10;
}

//-------------------------------------------------------------------------
//函数名称:void InitSampleType(void)
//功    能:将采样类型初始化成位变量的形式
//输入参数:无	
//返    回:无				 			
//-------------------------------------------------------------------------
void InitSampleType(void)
{
	if((uchSampleType == 13) || (uchSampleType == 16) || (uchSampleType == 18))
	{
		b_NotIntegralChannelType = 1;
		b_IntegralChannelType = 0;
		b_LVDTChannelType = 0;	
	}
	else if ((uchSampleType == 14) || (uchSampleType == 17))
	{
		b_NotIntegralChannelType = 0;
		b_IntegralChannelType = 1;
		b_LVDTChannelType = 0;
	}
	else if ((uchSampleType == 22) || (uchSampleType == 28))
	{
		b_NotIntegralChannelType = 0;
		b_IntegralChannelType = 0;
		b_LVDTChannelType = 1;	
	}	
	else
	{
		b_NotIntegralChannelType = 1;
		b_IntegralChannelType = 0;
		b_LVDTChannelType = 0;	
	}
}



//--------------------------------------------------------
//函数名称:void ADC0_ISR (void) interrupt 15 
//功    能:采样中断采样数据,
//输入参数:无				   
//返    回:无
//作	者:佟文杰
//----------------------------------------------------------
void ADC0_ISR (void) interrupt 15 
{ 
	AD0INT = 0;
	if (b_NotIntegralChannelType == 1)		//非积分通道数据采集   a-a   v-v   d-d
	{
//		if((AMX0SL == 0x00)||(AMX0SL == 0x01)||(AMX0SL == 0x02)||(AMX0SL == 0x03))
//	    {  
		if(AMX0SL == 0x00)		            
   	  	{
		    AMX0SL = 0x01; 	
 	  		SampBuffer0[SamplePTR0] = ADC0;		   
 	  		SamplePTR0 = (SamplePTR0 + 1) & MAXLENGTH;			
 	  	}
	  	else if(AMX0SL == 0x01)	         
	  	{
	  		AMX0SL = 0x02;
			SampBuffer1[SamplePTR1] = ADC0;		
	  		SamplePTR1 = (SamplePTR1 + 1) & MAXLENGTH;
	  	}
	  	else if(AMX0SL == 0x02)	           
	  	{
	  		AMX0SL = 0x03; 
			SampBuffer2[SamplePTR2] = ADC0;		 
	  		SamplePTR2 = (SamplePTR2 + 1) & MAXLENGTH;
	  	}	
	  	else            
	  	{
	  		AMX0SL = 0x00;
			SampBuffer3[SamplePTR3] = ADC0;	  
	  		SamplePTR3 = (SamplePTR3 + 1) & MAXLENGTH;

//			if((SamplePTR3%uiGroupLength) == 0)	
			if((SamplePTR3 & 0x0ff) == 0)
			{  	
				SetSampleLocationStatus(uchSampleLocationCounter);				 				 	 									
			 	uchSampleLocationCounter = ( uchSampleLocationCounter + 1 ) & 0x0f;
				
				SetSampleCompleteStatusAD(SAMPLECOMPLETETRUE);
				SetSampleCompleteStatusMain(SAMPLECOMPLETETRUE);
				SetCurProcessingIndex();		   								
			}
  	  	}  
	}
	else if (b_IntegralChannelType == 1)	 //积分通道数据采集	 a-v   v-d
	{
//		if((AMX0SL == 0x04)||(AMX0SL == 0x01)||(AMX0SL == 0x05)||(AMX0SL == 0x03))
//	    {  
		if(AMX0SL == 0x04)		  //积分1通道          
   	  	{
		    AMX0SL = 0x01; 		  
 	  		SampBuffer0[SamplePTR0] = ADC0;
 	  		SamplePTR0 = (SamplePTR0 + 1) & MAXLENGTH;			
 	  	}

	  	else if(AMX0SL == 0x01)	      //直流1通道   
	  	{
	  		AMX0SL = 0x05;		 
			SampBuffer1[SamplePTR1] = ADC0;
	  		SamplePTR1 = (SamplePTR1 + 1) & MAXLENGTH;
	  	}

	  	else if(AMX0SL == 0x05)	    //积分2通道       
	  	{
	  		AMX0SL = 0x03; 
			SampBuffer2[SamplePTR2] = ADC0;
	  		SamplePTR2 = (SamplePTR2 + 1) & MAXLENGTH;
	  	}	
	  
	  	else            			//直流2通道
	  	{
	  		AMX0SL = 0x04;
			SampBuffer3[SamplePTR3] = ADC0;
	  		SamplePTR3 = (SamplePTR3 + 1) & MAXLENGTH;

			if((SamplePTR3 & 0x0ff) == 0)
			{  					 				 	 										
			 	SetSampleLocationStatus(uchSampleLocationCounter);				 				 	 									
			 	uchSampleLocationCounter = ( uchSampleLocationCounter + 1 ) & 0x0f;
				SetSampleCompleteStatusAD(SAMPLECOMPLETETRUE);
				SetSampleCompleteStatusMain(SAMPLECOMPLETETRUE);
				SetCurProcessingIndex();		   								
			}
  	  	}  
	}
	else if (b_LVDTChannelType == 1)	 //22     28  LVDT通道类型
	{
//		if((AMX0SL == 0x01) || (AMX0SL == 0x03))
//		{
		if(AMX0SL == 0x01)	         
	  	{
	  		AMX0SL = 0x03;
			SampBuffer1[SamplePTR1] = ADC0;
	  		SamplePTR1 = (SamplePTR1 + 1) & MAXLENGTH;
	  	}
	  	else            
	  	{
	  		AMX0SL = 0x01;
			SampBuffer3[SamplePTR3] = ADC0;
	  		SamplePTR3 = (SamplePTR3 + 1) & MAXLENGTH;

			if((SamplePTR3 & 0x0ff) == 0)	
			{  					 				 	 										
			 	SetSampleLocationStatus(uchSampleLocationCounter);				 				 	 									
			 	uchSampleLocationCounter = ( uchSampleLocationCounter + 1 ) & 0x07;
				SetSampleCompleteStatusAD(SAMPLECOMPLETETRUE);
				SetSampleCompleteStatusMain(SAMPLECOMPLETETRUE);		   								
			}
  	  	}  
	}
	else
	{
		SoftReset(); //如果通道类型不对,立即重新启动系统
	}		
}	  			        

/////////////////////////////////////////////////////////////////////////////////////////
//unsigned char readCANreg(unsigned char xdata *regAddr)
//入口参数:读取的地址	
//函数返回:读出的数据	
//全局变量:无
//功能描述:在读某一地址的数据时,调用该函数
//函数说明:从SJA1000中读取数据                                                
/////////////////////////////////////////////////////////////////////////////////////////
unsigned char readCANreg(unsigned char xdata *regAddr)
{
	unsigned char uchValue;
	uchValue = *regAddr;
	return uchValue;
}
unsigned char readCANregRemote(unsigned char xdata *regAddr)
{
	unsigned char uchValue;
	uchValue = *regAddr;
	return uchValue;
}
/////////////////////////////////////////////////////////////////////////////////////////
//void writeCANreg(unsigned char xdata *regAddr, unsigned char value)
//入口参数:写的地址,写的数据	
//函数返回:无
//全局变量:无
//功能描述:在写某一地址的数据时,调用该函数
//函数说明:向SJA1000中写入数据                                               
/////////////////////////////////////////////////////////////////////////////////////////
void writeCANreg(unsigned char xdata *regAddr, unsigned char value)
{
    *regAddr = value;
}

void writeCANregRemote(unsigned char xdata *regAddr, unsigned char value)
{
    *regAddr = value;
}
/////////////////////////////////////////////////////////////////////////////////////////
//函数名称:void CAN_Init(unsigned char soID,unsigned char check,unsigned char Delay)
//入口参数:soID 地址 check=1只接收本地址数据=0接收所有的数据  Delay每次重发延迟的时间
//函数返回:无
//全局变量:无
//功能描述:设置工作模式,波特率,总线时序等
//函数说明:初始化CAN控制器SJA1000
//编写人:  于学伟                                                
/////////////////////////////////////////////////////////////////////////////////////////
void CAN_Init(unsigned char soID, unsigned char check)    //, unsigned char Delay)
{
	unsigned char  sjaMOD;
	unsigned char  shield_flag;
	unsigned char  shield_ID;
	unsigned int xdata uitemp;
	unsigned int xdata uiCount;

	FeedDog(); 
	P4 = P4 & 0xEF;
	P4 = P4 & 0xEF;
	for(uitemp = 0; uitemp< 200; uitemp++)
	{
		uitemp++;
		uitemp--;
	}
	P4 = P4 | 0x10;

	shield_flag = check;															  
	
	writeCANreg(SJA_IER, 0x00);          // SJA_IER = 0x00;   禁止SJA1000所有的中断 
	writeCANreg(SJA_MOD, 0x01);         // SJA_MOD = 0x01;   进入复位模式
	sjaMOD = readCANreg(SJA_MOD);       //判断是否进入复位模式
	uiCount = 0;
	while ((sjaMOD & 0x01) == 0 )      //判断是否复位	  modify?????
	{
		uiCount++;
		writeCANreg(SJA_MOD, 0x01);
		sjaMOD = readCANreg(SJA_MOD);
		if(uiCount >= 1000)
		{
			break;
		}
	}
		
	writeCANreg(SJA_EWLR, 0x64);       //错误报警寄存器设置值为100
    writeCANreg(SJA_CDR, 0xe8);         // SJA_CDR  = 0xe8; 设置为PeliCAN模式,关闭时钟,只有RX0被激活,fosc/2
	sjaMOD = readCANreg(SJA_MOD);       //选择双个验收滤波器,32位长度

⌨️ 快捷键说明

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