📄 hardware.c
字号:
}
//--------------------------------------------------------------------------
//函数名称: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 + -