📄 leak.txt
字号:
//将电压数据移动到页缓冲区
for(i=0;i<3;i++)
{
transDataBuf[i+6] = lineVolt[i];
}
//将电流数据移动到页缓冲区
for(i=0;i<3;i++)
{
transDataBuf[i+9] = lineCurrent[i];
}
//将漏电信息移动到页缓冲区
for(i=0;i<3;i++)
{
transDataBuf[i+12] = 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))
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)
{
}
//---------------------------------------------------------------------------
//函数名称:Ex1_Int
//功能描述:漏电报警中断程序
//输入:无
//输出:无
//---------------------------------------------------------------------------
void Ex1_Int(void) interrupt 2
{
EA = 0;
leakageCurrentMsg[0] = 0x01; //有漏电发生,1=漏电,0=没漏电
ADConvert();
WriteI2CBufData();
switch(recPresetData[0])
{
case SWITCH_OFF:
if(leakageCurrentMsg[1]>=recPresetData[1])
powerSwitchControl = OPEN_SWITCH; //断开闸刀
else
powerSwitchControl = CLOSE_SWITCH; //不断开闸刀
break;
case NO_SWITCH_OFF:
powerSwitchControl = CLOSE_SWITCH; //不断开闸刀
break;
case DELAY_SWITCH_OFF: //延时断开闸刀
if(leakageCurrentMsg[1]>=recPresetData[1])
{
delayCount = 0;
delaySwitchFlag = TRUE;
}
else
{
powerSwitchControl = CLOSE_SWITCH; //不断开闸刀
delaySwitchFlag = FALSE;
}
break;
}
EA = 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;
}
/****************************************/
/* CPU 初始化子程序 */
/****************************************/
void Lpc935Init(void)
{
AUXR1 = 0x00;
//时钟的设置
TRIM |= 0x3F;
DIVM = 0x00; //cclk=Fosc
//端口设置
P0M1=0xDF; //P0.5 设置为推挽输出状态,其余为输入状态
P0M2=0x20;
P1M1=0xFC; //P1.0/P1.1 设置为准双向状态,P1.2/P1.3/P1.6 设置为开漏输出,
P1M2=0x4C; //其余为输入状态
P2M1=0xFF; //P2.0 设置为开漏输出,其余为输入状态
P2M2=0x01;
//------------------------
// ADINS=0xF7; //1111 0111, 选择除AD03 外所有channel
ADMODA=0x01; //0000 0001, 选择转换工作模式,单次转换模式
ADMODB=0x20; //500Khz < ADC CLK < 3.3Mh,二分频,6M/2 =3M, 001x 0000
ADCON0=0x00; //选择转换触发模式,立即启动,不中断,0000 0101
ADCON1=0x00;
EADEE=0; //ADC/EEPROM中断不使能
// RTC 设置
IEN0 = 0xC0; //使能RTC中断,使能EA中断
EWDRT = 1; //允许看门狗/时钟中断
WDCON = 0xE0; //关闭看门狗中断
RTCH = RTC_RELOAD_H;
RTCL = RTC_RELOAD_L; //CCLK=6MHz , 1s 中断1次时,RTC的定时值
RTCCON = 0x63; //开启RTC模块
//------------------------
PCONA = 0x25;
//------------------------
TMOD = 0x21; //设定T0为方式1,T1为方式2,定时器状态,由TR0和TR1起停
TH0 = TIME_10ms_H; //设定定时时间为10ms
TL0 = TIME_10ms_L;
//UART 设置
//TH1 = 0xf3;
//TL1 = 0xf3; //波特率为4800
//PCON = 0x80; //波特率倍增
SSTAT = 0x00; //双缓冲器禁止
SCON = 0x40; //串行口方式1
BRGCON = 0x00;
BRGR1 = 0x09; //波特率为2400, 6MHz/2400 = x + 16 --> x = 0x09B4
BRGR0 = 0xB4;
BRGCON = 0x03; //启动波特率发生器
REN = 1; //启动接收
//IT0 = 0; //外部中断0为电平触发
IT1 = 1; //外部中断1为下降沿触发
ES = 1;
EX1 = 1;
ET0 = 1; //T0中断使能
TR0 = 1;
//TR1 = 1;
EA=1;
}
//uint idata delayCount;
//uchar data recCurrentTimeBuf[7]; //暂存当前时间缓冲器[0]=世纪[1]=年[2]=月[3]=日[4]=时[5]=分[6]=秒
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -