📄 main.c
字号:
{
uchar i;
i = 0xFF;
while(--i); //延时140uS
if(PULSE==0)
{
if(REVP==1) //电能正向处理
{
if((Fee1==0)&&(Fee0==1)) Energy.PulseTmp1[0]++; //峰时段处理
else if((Fee1==1)&&(Fee0==1)) Energy.PulseTmp1[2]++; //谷时段处理
else Energy.PulseTmp1[1]++; //平时段处理
Energy.PulseTmp1[3] = ~(Energy.PulseTmp1[0]+Energy.PulseTmp1[1]+Energy.PulseTmp1[2]); //校验
}
else //电能反向处理
{
if((Fee1==0)&&(Fee0==1)) Energy.PulseTmp2[0]++; //峰时段处理
else if((Fee1==1)&&(Fee0==1)) Energy.PulseTmp2[2]++; //谷时段处理
else Energy.PulseTmp2[1]++; //平时段处理
Energy.PulseTmp2[3] = ~(Energy.PulseTmp2[0]+Energy.PulseTmp2[1]+Energy.PulseTmp2[2]); //校验
}
}
}
//**********************************************************
// 名称:keyboard_isr
// 功能:键盘中断处理程序
// 说明:RS485通讯信道切换、RTC报警
//**********************************************************
void Keyboard_isr(void)interrupt 7 using 1
{
if((CommFlag==0)&&(RXD485==0)) //选通RS485信道
{
KBMASK = 0x00; //屏蔽RXD485(P0.6脚)键盘中断
COMMSEL = 1; //选通RS485通道
CommTimer = 0x00;
}
KBCON &= 0xFE; //清楚键盘中断标志
}
//**********************************************************
// 名称: watchdogrtc_isr()
// 功能: 看门狗定时器和实时时钟(RTC)中断处理程序
// 说明:
//**********************************************************
void Watchdogrtc_isr(void) interrupt 10 using 1
{
//使用看门狗时不能清此标志位,不使用时最好清掉
//WDCON &= ~0x02;
if(RTCCON&0x80) //检查是否实时时钟中断
{
RTCCON &= ~0x80; //清楚实时时钟中断标志位
DspFlag = 1; //置位显示刷新标志
if(PROG==0) LCDShowMode = 0; //编程按键按下,正常轮显模式
if(Prog_Flag==1) ProgTimer++; //编程开关有效计时
RTCMonitor = 0; //监控RTC是否正常运行
MainMonitor++; //监控主循环是否正常运行
if(MainMonitor>3) AUXR1 |= 0x08; //软件复位
}
}
//**********************************************************
// 名称:Timer0_isr
// 功能:Timer0中断处理程序
// 说明:编程按键检测、通讯超时监控程序
//**********************************************************
void Timer0_isr(void) interrupt 1 using 1
{
uchar Temp;
TF0 = 0; //清中断标志
TR0 = 0;
TH0 = 0x70; //Timer0定时10mS初值
TL0 = 0x00;
TR0 = 1;
//监控Timer0是否正常运行
T0Monitor = 0;
//监控RTC是否正常运行
RTCMonitor++;
if(RTCMonitor>5000) AUXR1 |= 0x08; //软件复位
///////////////////////////////////////////////////////////
//编程开关处理
///////////////////////////////////////////////////////////
if(PROG==0)
{
ProgDeLayTimer++;
}
else
{
ProgDeLayTimer = 0; //按键检测延时计数器
ProgActiveFlag = 0x00; //按键有效标志
Last_Prog_Flag = 0x01; //上次状态为高,为下次判断作参考
if(ProgTimer>=240) //编程开关有效时间:4分钟
{
Prog_Flag = 0;
ProgTimer = 0x00;
}
}
if(ProgDeLayTimer>50)
{
ProgDeLayTimer = 62; //按键检测延时计数器
ProgActiveFlag = 0xFF; //按键有效标志
ProgLEDShow = 0x00; //编程键按下时,LED预置为全亮
if(Last_Prog_Flag==0x01) //上次编程状态为高
{
Prog_Flag = !Prog_Flag; //编程状态取反
ProgTimer = 0x00; //编程有效计时器清零
Last_Prog_Flag = 0x00; //上次状态为低,为下次判断作参考
}
}
///////////////////////////////////////////////////////////
//通讯超时监测
///////////////////////////////////////////////////////////
if(ReinitUARTFlag==1) //UART重新初始化
{
ReinitUARTFlag = 0; //清除UART重新初始化标志
//
SCON = 0xD0; //SM0=1,SM1=1,REN=1
SSTAT = 0x00;
BRGCON = 0x00; //配置内部波特率发生器
BRGR0 = 0xF0;
BRGR1 = 0x17;
BRGCON = 0x03;
IP0H &=~0x10; //设置中断服务优先级为0
IP0 &=~0x10;
//
Flag &= 0xE0;
//TimeAdj = 0; //校时时间
//TimeProg= 0; //编程时间
//RxdFlag = 0; //接收状态
//TxdFlag = 0; //通信应答
//TxdWork = 0; //发送状态
CommFlag = 0; //通讯状态标志清零
COMMSEL = 0; //默认红外通讯方式
CTRL485 = 1; //RS485接收状态
TR1 = 0; //Timer1关闭,无红外载波
//HW38K = 1; //P0.7置高
CommTimer = 0x00; //超时计数清零
ComPtr = 0x00; //通讯缓冲区指针置零
KBMASK = 0x40; //P0.6=1,打开RS485通讯唤醒
ES = 1; //打开UART中断允许
}
if(CommFlag==1) //UART通讯状态标志
{
CommTimer++; //+10mS
if(TxdWork==0) //接收状态
{
if(RxdFlag==0)
{
if(CommTimer>35) //允许接收数据时,字节间停顿<=350mS
{
ES = 0; //关闭UART中断允许
ReinitUARTFlag =1; //UART重新初始化标志
}
}
}
else //发送状态
{
Temp=RS_CmdPtr+RS_Len+2+2; //发送数据长度
if(ComPtr<=1)//数据发送
{
TB8 = 1; //偶校验
SBUF = 0xFE; //发送第一个字节值
ComPtr++;
}
else if((ComPtr<Temp)&&(CommTimer<20)) //数据发送,字节间停顿<=200mS
{
ACC = ComBuf[ComPtr-2];
TB8 = P;
SBUF = ComBuf[ComPtr-2];
ComPtr++;
}
else //数据发送完成
{
ES = 0; //关闭UART中断允许
ReinitUARTFlag =1; //UART重新初始化标志
}
}
}
}
//**********************************************************
// 名称: UART_isr()
// 功能: 串口接收发送中断处理程序
// 说明:
//**********************************************************
void UART_isr(void) interrupt 4 using 1
{
uchar Temp;
CommFlag = 1; //UART通讯状态标志
CommTimer = 0; //超时计数器清零
if(RI) //接收中断处理
{
RI = 0; //清除接收中断标志
if((TxdWork==0)&&(RxdFlag==0)) //不在发送状态,且无已接收数据需处理
{
Temp = SBUF; //读取接收缓冲区数据
ACC = Temp; //接收数据
if(P==RB8) //寄偶校验位比较,数据正确
{
if(ComPtr==0x00)
{
if(Temp==0x68) //帧头检查
{
ComBuf[0] = Temp;
ComPtr++; //指针+1
}
}
else
{
ComBuf[ComPtr] = Temp;
ComPtr++;
if(ComPtr>=RS_CmdPtr) //接收数据长度>10
{
Temp = RS_CmdPtr+RS_Len+2; //结束检查
if((ComPtr==Temp)||(ComPtr==RS_MaxSize)) //数据长度正确或达到最大值
{
ES = 0; //接收结束,关串口中断
RxdFlag = 1; //接收处理标志置位
CommFlag = 0; //UART通讯状态标志
}
}
}
}
}
}
if(TI)
{
TI = 0; //清除发送中断标志
TxdWork = 1; //标志UART处于发送状态
}
}
//**********************************************************
// 名称:Int0_isr()
// 功能:
// 说明:
//**********************************************************
void Int0_isr(void) interrupt 0 using 1
{
//IE0 = 0;
AUXR1 |= 0x08; //软件复位
}
//**********************************************************
// 名称: Timer1_isr()
// 功能: Timer1中断处理程序
// 说明:
//**********************************************************
void Timer1_isr(void) interrupt 3 using 1
{
//TF1 = 0; //清中断标志
AUXR1 |= 0x08; //软件复位
}
//**********************************************************
// 名称:PowerOff_isr
// 功能:
// 说明:
//**********************************************************
void PowerOff_isr(void) interrupt 5 using 1
{
//BOF = 0;
AUXR1 |= 0x08; //软件复位
}
//**********************************************************
// 名称:I2c_isr
// 功能:
// 说明:
//**********************************************************
void I2c_isr(void) interrupt 6 using 1
{
//SI = 0;
AUXR1 |= 0x08; //软件复位
}
//**********************************************************
// 名称: CMP_isr()
// 功能:
// 说明:
//**********************************************************
void CMP_isr(void) interrupt 8 using 1
{
//CMP1 &= 0xFE; //清楚比较器1的中断标志
//CMP2 &= 0xFE; //清楚比较器2的中断标志
AUXR1 |= 0x08; //软件复位
}
//**********************************************************
// 名称:Spi_isr
// 功能:
// 说明:
//**********************************************************
void Spi_isr(void) interrupt 9 using 1
{
//SPIF = 0;
AUXR1 |= 0x08; //软件复位
}
//**********************************************************
// 名称:Capture_isr
// 功能:
// 说明:
//**********************************************************
void Capture_isr(void) interrupt 11 using 1
{
AUXR1 |= 0x08; //软件复位
}
//**********************************************************
// 名称: TXSend_isr()
// 功能: 串口发送中断处理程序
// 说明:
//**********************************************************
void TXSend_isr(void) interrupt 13 using 1
{
//TI = 0;
AUXR1 |= 0x08; //软件复位
}
//**********************************************************
// 名称:ADC_isr
// 功能:
// 说明:
//**********************************************************
void ADC_isr(void) interrupt 14 using 1
{
//ADCI1 = 0;
//BNDI1 = 0;
AUXR1 |= 0x08; //软件复位
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -