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

📄 hardware.c

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

//--------------------------------------------------------------------------
//函数名称:void SetHeartInterval(unsigned char uchInterval)
//功    能:设置心跳时间,最大定时35.5ms    
//输入参数:时间间隔 最大值35
//返    回:无
//完成日期:4/12/2007
//--------------------------------------------------------------------------
void SetHeartInterval(unsigned char uchInterval)
{
		
	T4CON = 0x00;
	CKCON &= 0xbf;
	EIE2 |= 0x04;
	TL4 = 0xfd;
	TH4	= 0xff;
	if ((uchInterval <= 35) && (uchInterval >= 0))
	{
		RCAP4 = -(SYSCLK * uchInterval) / 12000;           //10ms

		T4CON |= 0x04;
	}				  
	else
	{
		StopHeartBeat();
	}
}
																
//--------------------------------------------------------------------------
//函数名称:void JudgeCHCoByTrStatus_isr(void) interrupt 16
//功    能:对config,bypass,triple的状态进行判断处理,并得到心跳的数值      
//输入参数:无
//返    回:无
//完成日期:4/12/2007
//--------------------------------------------------------------------------

void JudgeCHCoByTrStatus_isr(void) interrupt 16
{	
	T4CON &=0x7f;
		   
	uchConfigStatusBak[2] = uchConfigStatusBak[1];
	uchConfigStatusBak[1] = uchConfigStatusBak[0];
	uchConfigStatusBak[0] = HWConfigureStatus();	   

	if(uchConfigStatus != uchConfigStatusBak[2])
	{
		if (uchConfigStatusBak[0] == uchConfigStatusBak[1] && uchConfigStatusBak[0] == uchConfigStatusBak[2])	
		{
			uchConfigStatus = uchConfigStatusBak[0];
		}
	}
	SetHWConfigStatusMain(uchConfigStatus);

	uchBypassStatusBak[2] = uchBypassStatusBak[1];
	uchBypassStatusBak[1] = uchBypassStatusBak[0];
	uchBypassStatusBak[0] = HWBypassStatus();

	if(uchBypassStatus != uchBypassStatusBak[2])
	{
		if (uchBypassStatusBak[0] == uchBypassStatusBak[1] && uchBypassStatusBak[0] == uchBypassStatusBak[2])
		{
			uchBypassStatus = uchBypassStatusBak[0];
		}
	}
	SetHWBypassStatusMain(uchBypassStatus);

	uchTripleStatusBak[2] = uchTripleStatusBak[1];
	uchTripleStatusBak[1] = uchTripleStatusBak[0];
	uchTripleStatusBak[0] = HWTripleStatus();

	if(uchTripleStatus != uchTripleStatusBak[2])
	{
		if (uchTripleStatusBak[0] == uchTripleStatusBak[1] && uchTripleStatusBak[0] == uchTripleStatusBak[2])	
		{										                             
			uchTripleStatus = uchTripleStatusBak[0];
		}
	}
	SetHWTripleStatusMain(uchTripleStatus);

	uiHeartbeatValue++;
	
}

//--------------------------------------------------------------------------
//函数名称:void InitDA(void)
//功    能:DA初始化       
//输入参数:无
//返    回:无
//完成日期:4/12/2007
//--------------------------------------------------------------------------
void InitDA(void)
{
	DAC0CN = 0x80;		//使能,写高字节更新
    DAC1CN = 0x80; 
}

//--------------------------------------------------------------------------
//函数名称:void DirectCurrentOutput(unsigned char uchChannel, unsigned int uiDAValue)
//功    能:根据通道的选择决定输出的电流      
//输入参数:当前要输出的DAC值和通道号,通道号:1表示第一通道;2表示第二通道
//返    回:无
//完成日期:4/12/2007
//--------------------------------------------------------------------------
void DirectCurrentOutput(unsigned char uchChannel, unsigned int uiDAValue)
{
	if (uchChannel == 1)
    {
		DAC0L = uiDAValue;
	    DAC0H = uiDAValue >> 8;
    }
    if (uchChannel == 2)
    {
	    DAC1L = uiDAValue;
	    DAC1H = uiDAValue >> 8;
    }
}

//--------------------------------------
//函数名称:void DisableDog(void)
//功    能:禁止看门狗     
//输入参数:无
//返    回:无
//完成日期:4/13/2007
//--------------------------------------
void DisableDog(void)			
{
	EA =0;

    WDTCN = 0xde;
    WDTCN = 0xad;

    EA = 1;
}

//--------------------------------------
//函数名称:void EnableDog(void)
//功    能:使能看门狗     
//输入参数:无
//返    回:无
//完成日期:4/13/2007
//--------------------------------------
void EnableDog(void)		   
{
	WDTCN = 0xa5;	
}

//--------------------------------------
//函数名称:void FeedDog(void)
//功    能:喂看门狗     
//输入参数:无
//返    回:无
//完成日期:4/13/2007
//--------------------------------------
void FeedDog(void)			   
{
	WDTCN = 0xa5;	
} 

//--------------------------------------------------------
//函数名称:void InitADC1(void) 
//功    能:ADC1转换器初始化
//输入参数:无
//返    回:无
//完成日期:4/13/2007
//----------------------------------------------------------
void InitADC1(void)
{
	ADC1CF = 0xf9;    //0.8MHZ
    ADC1CN = 0x90;  	

    EIE2 &= 0xf7;	//关ADC1中断	
}

//--------------------------------------------------------
//函数名称:void InitRef(void)
//功    能:参考电压初始化
//输入参数:无
//返    回:无
//完成日期:4/13/2007
//----------------------------------------------------------
void InitRef(void)
{   
	REF0CN |= 0x02;              
    REF0CN &= 0xe6;                  
}

//----------------------------------------------------------------------
//函数名称:unsigned char HWTestSystemVoltage(unsigned char uchChannel)
//功    能:应用ADC1测量系统的电压
//输入参数:通道号
//返    回:所测量的通道的电压值
//完成日期:4/13/2007
//----------------------------------------------------------------------
unsigned char HWTestSystemVoltage(unsigned char uchChannel)
{
	xdata unsigned char uchNumberTest; 
    xdata unsigned int  uiVoltageTest_data[5];

    AMX1SL = uchChannel;

    for (uchNumberTest=0; uchNumberTest<5; uchNumberTest++)
    {    		    
		ADC1CN = ADC1CN & 0xdf;         //   AD1INT=0; 
	    ADC1CN = ADC1CN | 0x10;         //  AD1BUSY=1;

	    while( (ADC1CN & 0x20) == 0)    //wait AD1INT=1   
	    {;}
	   	            
	    uiVoltageTest_data[uchNumberTest] = ADC1; 
	} 
	return (uiVoltageTest_data[0] + uiVoltageTest_data[1] + uiVoltageTest_data[2] 
	           + uiVoltageTest_data[3] + uiVoltageTest_data[4]) / 5;
}

//-----------------------------------------------------------------
//函数名称:void SetExternalRAM(void)
//功    能:外部存储器初始化,包括地址线、数据线、 ALE的工作方式        
//输入参数:无
//返    回:无
//完成日期:4/12/2007
//-----------------------------------------------------------------
void SetExternalRAM(void)
{	  
	EMI0CF = 0x25;	   	 //27
    EMI0TC = 0x8d;		//20080322	ff											
}

//--------------------------------------------------------------------------------------------------
//函数名称:void WriteExternFlash(unsigned char xdata *destination, unsigned char xdata *Source, unsigned int uchLength)
//功    能:将源地址的内容根据长度写入到外部28C64存储器的目的地址中      
//输入参数:目的地址、源地址、数据长度(不包括校验和位)但是程序已经把校验和存入到内存当中了(存入一个字)
//返    回:无
//完成日期:4/13/2007   		  注意:写一页要有最少7到8毫秒的延时
//-------------------------------------------------------------------------------------------------
void WriteExternFlash(unsigned char xdata *destination, unsigned char xdata *Source, unsigned int uiLength)
{
	unsigned int xdata uiL;
   	unsigned int xdata uiTempVariable;

	uiTempVariable = CaculateCheckSum(Source, uiLength);
	destination = destination + FLASHFIRSTADDRESS;

	EA = 0;
	uiLength = uiLength + 1;
	for (uiL=1; uiL<uiLength; uiL++)
	{
		*destination = *Source;		
		destination++;
		Source++; 
		if (uiL == 64)
		{
			EA = 1;
			uiLength = uiLength - 64;
			uiL = 0;
			DelayTimeCount(2);
			EA = 0;
		}
	 }
 
	EA = 1;
	DelayTimeCount(2);  //20080417
	EA = 0;

    *destination = uiTempVariable >> 8;
	destination++;
	EA = 1;
	DelayTimeCount(2);  //20080417
	EA = 0;

	*destination = uiTempVariable;       //在内存中存储的校验和高位在前,低位在后
	EA = 1;	
	DelayTimeCount(2);	
}

//--------------------------------------------------------------------------------------------------
//函数名称:void ReadExternFlash(unsigned char xdata *destination,unsigned char xdata *source,unsigned int uchLength)
//功    能:根据长度将外部28C64存储器源地址的内容读出来放到目的地址中      
//输入参数:目的地址、源地址、数据长度 ,源地址是相对地址,程序中所用的地址为基址+相对地址
//返    回:无
//完成日期:4/13/2007
//-------------------------------------------------------------------------------------------------
void ReadExternFlash(unsigned char xdata *destination,unsigned char xdata *source,unsigned int uiLength)
{
	unsigned int xdata uiL;

	source = source + FLASHFIRSTADDRESS;

	EA = 0;
	for (uiL=0; uiL<uiLength; uiL++)
	{
		*destination = *source;
		source++;
		destination++;		
	}
    EA = 1; 
} 

//--------------------------------------------------------------------------------------------------
//函数名称:void ReadFlashDefaultPara(unsigned char xdata *destination,unsigned char code *source,unsigned int uiLength)
//功    能:根据长度将FLASH存储器源地址的内容读出来放到目的地址中      
//输入参数:目的地址、源地址、数据长度 ,源地址是相对地址,程序中所用的地址为基址+相对地址
//返    回:无
//完成日期:4/13/2007
//-------------------------------------------------------------------------------------------------
void ReadFlashDefaultPara(unsigned char xdata *destination,unsigned char code *source,unsigned int uiLength)
{
	unsigned int xdata uiL;

	EA = 0;
																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																							
	for (uiL=0; uiL<uiLength; uiL++)
	{
		*destination = *source;
		source++;
		destination++;		
	}
    EA = 1; 
} 

//--------------------------------------------------------------------------------------------------
//函数名称:unsigned char GetCANAdress(void)
//功    能:通过P5口得到通信的地址
//输入参数:无
//返    回:CAN通信地址						 
//完成日期:4/13/2007
//-------------------------------------------------------------------------------------------------
unsigned char GetCANAdress(void)
{
	unsigned char uchCANAdress;

	uchCANAdress = P5 & 0x1f;
	return uchCANAdress;
}

//--------------------------------------------------------------------------------------------------
//函数名称:void InitRuningLEDControl(void)
//功    能:初始化灯闪烁的定时器
//输入参数:无
//返    回:无						 
//完成日期:4/13/2007		定时25.6ms中断一次
//-------------------------------------------------------------------------------------------------
void InitRuningLEDControl(void)
{
	TF2 = 0;    // 清除标志位
	RCLK0 = 0;
	TCLK0 = 0;
	CPRL2 = 0;
	TR2 = 1; //配置定时器2为自动重装载方式
	EXEN2 = 0;
	CT2 = 0;    //由系统时钟提供时钟

	CKCON &= 0xdf;
	TL2 = 0xf0;
	TH2 = 0xf0;
	RCAP2L = 0x00;
	RCAP2H = 0x48;
	ET2 = 0;	//禁止中断
	PT2 = 0;	//设置为低优先级
}

//--------------------------------------------------------------------------------------------------
//函数名称:void RuningLEDStart(void)
//功    能:开始灯的闪烁控制
//输入参数:无
//返    回:无						 
//完成日期:4/13/2007
//-------------------------------------------------------------------------------------------------
void RuningLEDStart(void)
{
	ET2 = 1;
}

//--------------------------------------------------------------------------------------------------
//函数名称:void RuningLEDStop(void)
//功    能:停止灯的闪烁控制
//输入参数:无
//返    回:无						 
//完成日期:4/13/2007
//-------------------------------------------------------------------------------------------------
void RuningLEDStop(void)
{
	ET2 = 0;
}

//--------------------------------------------------------------------------------------------------
//函数名称:void ControlRuningLED_isr(void) interrupt 5
//功    能:控制OK灯的闪烁情况
//输入参数:无
//返    回:无						 
//完成日期:4/13/2007
//-------------------------------------------------------------------------------------------------
void ControlRuningLED_isr(void) interrupt 5

⌨️ 快捷键说明

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