📄 leakage.c
字号:
return;
}
else
writeEEPROMBufFullFlag = FALSE;
}
//将电流数据移动到页缓冲区
for(i=0;i<3;i++)
{
writeEEPROMBuf[wrEEPROMBufPtr] = lineCurrent[i];
wrEEPROMBufPtr++;
if(wrEEPROMBufPtr >= EEPROM_PAGE_SIZE)
{
wrEEPROMBufPtr = 0;
writeEEPROMBufFullFlag = TRUE;
return;
}
else
writeEEPROMBufFullFlag = FALSE;
}
//将漏电信息移动到页缓冲区
for(i=0;i<3;i++)
{
writeEEPROMBuf[wrEEPROMBufPtr] = leakageCurrentMsg[i];
wrEEPROMBufPtr++;
if(wrEEPROMBufPtr>=EEPROM_PAGE_SIZE)
{
wrEEPROMBufPtr = 0;
writeEEPROMBufFullFlag = TRUE;
return;
}
else
writeEEPROMBufFullFlag = FALSE;
}
}
//---------------------------------------------------------------------------
//函数名称:void ByteTransBuf(uchar command, uchar dataSize)
//功能描述:将待发送数据放入发送缓冲区
//输入: command-- 上位机的命令字
// dataSize--发送数据的字节数
//输出:无
//---------------------------------------------------------------------------
void ByteTransBuf(uchar command, uchar dataSize)
{
uchar i;
//将本机地址、命令、数据字节数放入发送缓冲区
transDataBuf[0] = ReadID();
transDataBuf[1] = command;
transDataBuf[2] = dataSize;
//将时间数据移动到发送缓冲区
for(i=0;i<7;i++)
{
transDataBuf[i+3] = recCurrentTimeBuf[i];
}
//将电压数据移动到页缓冲区
for(i=0;i<3;i++)
{
transDataBuf[i+10] = lineVolt[i];
}
//将电流数据移动到页缓冲区
for(i=0;i<3;i++)
{
transDataBuf[i+13] = lineCurrent[i];
}
//将漏电信息移动到页缓冲区
for(i=0;i<3;i++)
{
transDataBuf[i+16] = leakageCurrentMsg[i];
}
}
//---------------------------------------------------------------------------
//函数名称:void PageTransBuf(uchar command)
//功能描述:将待发送数据放入发送缓冲区
//输入: command-- 上位机的命令字
//输出:无
//---------------------------------------------------------------------------
void PageTransBuf(uchar command)
{
//将本机地址、命令、数据字节数放入发送缓冲区
transDataBuf[0] = ReadID();
transDataBuf[1] = command;
transDataBuf[2] = EEPROM_PAGE_SIZE;
if(command == COM_RD_ALL_DATA)
{
EEPROMRdAddr = EEPROM_ORG_ADDR;
while(IRcvStr(0xA0, EEPROMRdAddr, transDataBuf+3, EEPROM_PAGE_SIZE)) //0xA0:AT24C512固有地址
EEPROMRdAddr += 128;
}
else
{
EEPROMRdAddr = EEPROMWrAddr - EEPROM_PAGE_SIZE * recRdBatDataSize[1] * recRdBatDataSize[0];
while(IRcvStr(0xA0, EEPROMRdAddr, transDataBuf+3, EEPROM_PAGE_SIZE))
EEPROMRdAddr += 128;
}
}
//---------------------------------------------------------------------------
//函数名称:void ChkLeakageCurrentLine(void)
//功能描述:检测漏电线路
//输入:无
//输出:无
//---------------------------------------------------------------------------
//void ChkLeakageCurrentLine(void)
//{
//}
//---------------------------------------------------------------------------
//函数名称:rut
//功能描述:外部中断1
//输入:无
//输出:无
//---------------------------------------------------------------------------
void rut(void) interrupt 2
{
lightControl = FALSE ;
TH1 = Time_1s_H ;
TL1 = Time_1s_L ;
TR1 = 1;
ET1 = 1;
}
//---------------------------------------------------------------------------
//函数名称:Timer1_Int
//功能描述:定时1的中断程序
//输入:无
//输出:无
//---------------------------------------------------------------------------
void Timer1_Int(void) interrupt 3
{
static uchar second_c = 100;
TR1 = 0 ;
second_c--;
if(!second_c)
{
lightControl = TRUE ;
TR1 = 0 ;
}
else
TR1 = 1;
}
//---------------------------------------------------------------------------
//函数名称:Timer0_Int
//功能描述:定时10 ms 的中断程序
//输入:无
//输出:无
//---------------------------------------------------------------------------
void Timer0_Int(void) interrupt 1
{
static uchar second_cnt = 100;
TR0 = 0;
TH0 = TIME_10ms_H;
TL0 = TIME_10ms_L;
second_cnt --;
if(second_cnt == 50)
workIndication = !workIndication; //500ms 翻转一次
//时间已达1 秒
if(!second_cnt)
{
sampleTimeFlag = TRUE;
second_cnt = 100;
}
TR0 = 1;
}
//---------------------------------------------------------------------------
//函数名称:Serial_Int()
//功能描述:串行口中断程序
//输入:无
//输出:无
//---------------------------------------------------------------------------
void Serial_Int(void) interrupt 4
{
uchar recBuf;
static uchar scnt;
EA = 0;
scnt++; //关闭中断
if(_testbit_(TI)) //JBC指令 是发送中断
{
if(transDataPtr < transDataBuf[2] + 3) //是否已经发送完毕
{
SBUF = transDataBuf[transDataPtr]; //发送数据 对SBUF覆值,即为发送数据
transCheckSum += transDataBuf[transDataPtr];
transDataPtr++;
if(transDataPtr == transDataBuf[2]+2) //发送校验字 发送结束
SBUF = transCheckSum;
}
}
if(_testbit_(RI)) //是接收中断
{
recBuf = SBUF;
switch(recStatus)
{
case INIT_STAT:
if(recBuf == SYNC) //是同步信号
{
recStatus = ADDR_STAT;
recChkSum = SYNC; //初始化校验和
}
break;
case ADDR_STAT:
if(recBuf == ReadID()) //是本机地址
{
recChkSum += recBuf;
recStatus = COMMAND_STAT;
}
else
{
recStatus = INIT_STAT;
recChkSum = 0;
}
break;
case COMMAND_STAT:
recCommandBuf = recBuf;
recChkSum += recBuf;
if((recCommandBuf==COM_INIT)||(recCommandBuf==COM_TIME)\
||(recCommandBuf==COM_RD_CUR_DATA)||(recCommandBuf==COM_RD_BATCH_DATA)\
||(recCommandBuf==COM_RD_ALL_DATA))
{//合法命令
recStatus = SIZE_STAT;
}
else if(recCommandBuf == TERM_CUR_TX_ERR) //上位机回应终端接收当前数据错误
{
curTransErrFlag = TRUE;
recStatus = INIT_STAT;
}
else if(recCommandBuf==TERM_BAT_TX_ERR) //上位机回应终端接收批量数据错误
{
batTransErrFlag = TRUE;
recStatus = INIT_STAT;
}
else if(recCommandBuf==TERM_ALL_TX_ERR) //上位机回应终端接收所有数据错误
{
allDataTransErrFlag = TRUE;
recStatus = INIT_STAT;
}
else //其它不确定错误
{
recStatus = INIT_STAT;
recChkSum = 0;
}
break;
case SIZE_STAT:
recDataSize = recBuf;
recChkSum += recBuf;
if(recDataSize > 0)
recStatus = DATA_STAT;
else
recStatus = VERIFY_STAT;
break;
case DATA_STAT:
switch(recCommandBuf)
{
case COM_INIT: //上位机发出 读取预置信息(消防控制类型) 命令
recChkSum += recBuf;
recPresetData[recDataCnt] = recBuf;
recDataCnt++;
if(recDataCnt == recDataSize) //数据接收完毕
{
recDataCnt = 0;
recStatus = VERIFY_STAT;
}
break;
case COM_TIME:
recChkSum += recBuf;
recCurrentTimeBuf[recDataCnt] = recBuf;
recDataCnt++;
if(recDataCnt==recDataSize) //数据接收完毕
{
recDataCnt = 0;
recStatus = VERIFY_STAT;
}
break;
case COM_RD_CUR_DATA:
recChkSum += recBuf;
recStatus = VERIFY_STAT;
break;
case COM_RD_BATCH_DATA:
recChkSum += recBuf;
recRdBatDataSize[recDataCnt] = recBuf;
recDataCnt++;
if(recDataCnt==recDataSize) //数据接收完毕
{
recDataCnt = 0;
recStatus = VERIFY_STAT;
}
break;
case COM_RD_ALL_DATA:
recChkSum += recBuf;
recStatus = VERIFY_STAT;
break;
}
break;
case VERIFY_STAT:
if(recChkSum==recBuf) //校验正确
{
recErrorFlag = FALSE;
switch(recCommandBuf) //根据不同命令置相应标志
{
case COM_INIT:
initFlag = TRUE;
break;
case COM_TIME:
timeVerifyFlag = TRUE;
break;
case COM_RD_CUR_DATA:
rdCurDataFlag = TRUE;
break;
case COM_RD_BATCH_DATA:
rdBatDataFlag = TRUE;
break;
case COM_RD_ALL_DATA:
rdAllDataFlag = TRUE;
break;
}
}
else
{
recErrorFlag = TRUE;
}
break;
default:
recStatus = INIT_STAT;
break;
}
}
EA = 1; //打开中断
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -