📄 interpt.c
字号:
//模块监控中断服务程序
//定时器0中断服务程序
#include "fDETDeclare.H"
#include "DETConst.H"
#include "RS485BUF_EX.H"
unsigned char counter;//计数器,用于定时
void Initial(void)
{
unsigned char flag1,flag2;
TMOD=0x21; //初始化串口:方式1,波特率9600
TL1=0xfd;
TH1=0xfd;
TL0=0x00; //定时器0的时间常数,采用16位计数定时 工作方式1
TH0=0x28; //定时10msms
PCON=0x00;
SCON=0x70;
PCON|=0x80;
fEepromRead(&flag1,0x00ae,1);
fEepromRead(&flag2,0x00af,1);
if((flag1!=0x99)&&(flag2!=0x99)){ //若5045是空白的,执行写操作
flag1=0x99;flag2=0x99;
fEepromWrite(&flag1,0x00ae,1); //写标志位
fEepromWrite(&flag2,0x00af,1);
MODULEADDRESS=0x08;
fEepromWrite(&MODULEADDRESS,0x00b3,1);
}
fEepromRead(&MODULEADDRESS,0x00b3,1);
fEepromRead(&power1,0x0020,1); // 读功率值
fEepromRead(&power2,0x0030,1);
fEepromReadW(&powervolt1,0x0021); //读校准直线的两点AD采集值
fEepromReadW(&powervolt2,0x0031);
//fEepromRead(&ResetFlag1,0x0070,1);
ResetFlag1=1;
ResetFlag=0;
InitCounter=0;
RS485DE=0;
ComAnalysisFlag=0;
RecFlag=0; //开始将程序初始化为接受状态
RS485ReadPointer=0;
RS485WritePointer=0;
counter=0;
ADCCS =1;
ADCCLK =0;
MODULESELECT=0; //打到上行模块
STARTCHECK=0;
PowerCheckCount=0;
InterpCounter=0;
TESTFLAG=0;
PS=1;
PT0=0;
TR0=1;
TR1=1;
ET0=1;
ES=1;EA=1;
}
void SerialInterruptServe(void) interrupt 4
{
static unsigned char ComLen = 0;//存放数据包的长度
unsigned char i;
if(TI!=0){ //将485接口置于发送状态
TI=0;
if((--RS485SendLen) == 0x00) {
//发送完毕,RS485转换到接收状态
RS485DE=0;
REN = 1;
}
else SBUF=RS485Buffer[RS485ReadPointer++]; //发送
}
if(RI) { //收中断
RI=0;
i=SBUF;
if (ComAnalysisFlag)
return;
if(RS485WritePointer>=RS485BUFLEN){
ComAnalysisFlag=0;
RS485WritePointer = 0;
ComLen=0;
RecFlag=0;
return;
}
if(!RecFlag){
if (i!=FRAMESTART)
return;
RS485WritePointer = 0;
RS485Buffer[RS485WritePointer++]=i;
RecFlag=1;
return;
}
//收到起始帧以后继续接收
RS485Buffer[RS485WritePointer++]=i;
if(RS485WritePointer==6){
ComLen=RS485Buffer[RS485WritePointer-1];
}
if(RS485WritePointer==(ComLen+9)) {//停止接收
if(RS485Buffer[RS485WritePointer-1]!=0x7f){
ComAnalysisFlag=0;
}
else {
InterpCounter=0;
ComAnalysisFlag=1;
REN = 0;
}
RecFlag=0;
RS485WritePointer = 0;
ComLen=0;
}
}
}
//定时查询,每隔300ms查询一次
void TimerInterrupt(void) interrupt 1 using 2
{
//重新启动计数
counter++;
TL0=0x00; //定时器0的时间常数,采用16位计数定时 工作方式1
TH0=0x28; //
if(counter>5){ //
InterpCounter++;
counter=0; //记数器复位,目的是达到每隔1s 查询以次状态
STARTCHECK=1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -