📄 main.c
字号:
#include "MAIN.H"
#include "display.h"
#include "disdrive.h"
#include "KEY.H"
#include "X.H"
//定义串口缓冲区和结构体
#define ADDRESSL 0xFF //地址校验码地位
#define ADDRESSH 0xFF //地址校验码高位
#define BufferLen 30
#define SEARIALTIME 0x64 //串口接收完所有数据的最大时间,5s
unsigned char data RealReceiveLen ; //实际接收到个数
unsigned char data CheckSum ; //校验码
unsigned char data ReceivBuf[BufferLen];
unsigned char data SerialTime ; //串口接收数据时间计数器,在接收中大于一个数可以认为此次接收丢失
unsigned char data ReceiveState ; //接收状态标志位
//定义时间变量
unsigned int ResetLedBackTime; //背光灯熄灭时间计数器
unsigned int CountTimeTime; //累计时间计数器
unsigned char IsSaveTime; //是否保存累计时间数据
unsigned char data GuZhangState; //故障状态
unsigned char data GuZhangTime; //故障延时计数器
unsigned char idata WriteGuZhangPtr; //故障存储指针,指向当前可以存储的地址首位
unsigned char idata GuZhangNum; //当前已经存储了的故障数
unsigned long data GuZhangShiJian; //故障发生时间
//申明应用定义在KEY.C中的全局变量
extern unsigned long idata CountTime;
extern struct INCOME idata Incomedata;
extern unsigned char data IsKeyDown;
extern unsigned int data AutoKeyTime;
extern unsigned int data KeyDelayTime;
extern unsigned char data UpdataLEDTime;
void SYS_Init()
{
EA = 0;
ResetLedBackTime = 0; //变量初始化
CountTimeTime = 0;
SysReg_Init(); //system register initial block
Serial_Init(); //serial initial block;
HardInitialLED(); //display initial block
InitialKey(); //key initail block
SetWatchDog(); //set watch dog
FeedDog(); //Error Light off
TR1 = 1; //timer1 start
TR0 = 1; //timer0 start
EA = 1;
}
void SysReg_Init()
{
//IE setting
EX0 = 0; //int0 disable
ET0 = 1; //timer0 interrupt enable
EX1 = 0; //int1 disable
ET1 = 1; //tiemr1 interrupt disable
ES = 1; //serial intrrupt enable
ET2 = 0; //timer2 interrupt disable
IP = 0x10; //serial interrupt high
//TMOD setting
SCON = 0x50; //串口工作方式1,允许接收
//SM0=0; SM1=1;SM2=0;REN=1;TB8=0;RB8=0;TI=0;RI=0;
PCON = 0x00; //波特率倍频
T2CON = 0x30; // 定时器2作为串口1的波特率发生器
RCAP2 = -(SYSCLK/BAUDRATE/32);
TR2 = 1; // TR2=1
//TIMER0 SETTING
TMOD = 0x11; //定时器0和1都是方式1,16位计数器
TF0 = 0;
TH0 = TIMER0_H;
TL0 = TIMER0_L ;
//TIMER1 SETTING
TF1 = 0;
TH1 = TIMER1_H;
TL1 = TIMER1_L;
TI = 0; //初始化发送中断和接收中断
RI = 0;
}
void main(void)
{
unsigned int ErrorTemp; //故障中间变量
SYS_Init();
ErrorLight=ResetLight;
SetLEDBackLight();
LedFillNULL();
ShowWait();
FeedDog();
//初始化故障存储器
DataWrite25045EEROM(0,SAVEGUZHANG_ADD);
DataWrite25045EEROM(0,SAVEGUZHANG_ADD+2);
GuZhangState = NOGUZHANG;
//取出累计时间,高位存储在低地址
PageRead25045EEROM(SAVETIME_ADD,(unsigned char *)(&CountTime));
while(1)
{
FeedDog();
KeyPro();
if(ReceiveState == ENDRECEIVE) //接收完所有数据
{
if(CheckSum == 0x00)
{
SerialLight = SetLight; //点亮串口灯
ReadSerialBufData((unsigned int *)ReceivBuf,&(Incomedata.InputUA),14);//取出数据
if(Incomedata.ErrorCodeShuZi!=0)
{
ErrorTemp=DataRead25045EEROM(SAVEGUZHANG_ADD)|Incomedata.ErrorCodeShuZi;
DataWrite25045EEROM(ErrorTemp,SAVEGUZHANG_ADD);
GuZhangState = GUZHANGDELAY;
// GuZhangTime = 0;
ErrorLight = SetLight;
RunLight = ResetLight;
}
if(Incomedata.ErrorCodeMoNi!=0)
{
ErrorTemp=DataRead25045EEROM(SAVEGUZHANG_ADD+2)|Incomedata.ErrorCodeMoNi;
DataWrite25045EEROM(ErrorTemp,SAVEGUZHANG_ADD+2);
GuZhangState = GUZHANGDELAY;
// GuZhangTime = 0;
ErrorLight = SetLight;
RunLight = ResetLight;
}
delay(15);
SerialLight = ResetLight;
}
ReceiveState = STARTRECEIVE1;
RealReceiveLen = 0;
CheckSum = 0;;
}
//故障延时已到且当前没有收到故障
if(GuZhangState == GUZHANGDELAYOVER&&Incomedata.ErrorCodeShuZi==0&&Incomedata.ErrorCodeMoNi==0)
{
ErrorLight = ResetLight;
RunLight = SetLight;
GuZhangState = NOGUZHANG;
}
if(SerialTime >= SEARIALTIME) //串口通讯等待时间过长
Serial_Init();
if(IsSaveTime)
{
IsSaveTime = 0;
PageWrite25045EEROM(SAVETIME_ADD,(unsigned char *)(&CountTime));
}
}
}
void TO_INT(void) interrupt 1
{
TF0 = 0;
if (IsKeyDown == NO_KEY_DOWN)
{
if(AutoKeyTime < KEY_AUTOUPDATE_TIME) AutoKeyTime++;
if(ResetLedBackTime < RESET_LEDBACK_TIME) ResetLedBackTime++;
else ResetLEDBackLight(); //Reset LEDBackLight
}
if ( IsKeyDown == KEY_DOWN_TRIGGER) //按键处于延时状态
{
if (KeyDelayTime < KEY_DELAY ) KeyDelayTime++; //key down and delay time counting
else
{
IsKeyDown = KEY_DOWN_DELAY_OVER;//set key delay time is over;trigger IsKeyDown
SetLEDBackLight(); //LEDBack Light On
ResetLedBackTime = 0;
AutoKeyTime = 0;
UpdataLEDTime = 0;
}
}
if ( IsKeyDown == KEY_PRO_COMPLETE_DELAY) //key pro completed delay
{
if ( KeyDelayTime < KEY_COMPLETE_DELAY ) KeyDelayTime++;
else
{
KeyDelayTime = 0;
IsKeyDown = NO_KEY_DOWN;
}
}
TH0 = TIMER0_H; //定时1ms
TL0 = TIMER0_L;
}
void T1_INT(void) interrupt 3
{
TF1 = 0;
TH1 = TIMER1_H; //定时50ms
TL1 = TIMER1_L;
if(CountTimeTime<TIMER1S)
{
CountTimeTime ++;
return;
}
CountTimeTime = 0;
IsSaveTime = 1;
ountTime++;
if(GuZhangState == GUZHANGDELAY)
{
if(GuZhangTime<GUZHANGDELAYTIME)
GuZhangTime++;
else
{
GuZhangState = GUZHANGDELAYOVER;
GuZhangTime = 0;
}
}
if(SerialTime <= SEARIALTIME) SerialTime++; //串口延时计数器
}
void Receive_INT(void) interrupt 4
{
unsigned char datatemp;
RI = 0;
TI = 0;
datatemp = SBUF;
SerialTime = 0;
if( ReceiveState == STARTRECEIVE1 && datatemp == ADDRESSL ) //收第一个起始地址
{
ReceiveState = STARTRECEIVE2;
CheckSum = CheckSum + datatemp;
}
else if(ReceiveState == STARTRECEIVE2 && datatemp==ADDRESSH) //收第二个起始地址
{
ReceiveState = RECEIVING ;
CheckSum = CheckSum + datatemp;
}
else if(ReceiveState == RECEIVING) //处于数据接收中
{
ReceivBuf[RealReceiveLen]=datatemp;
RealReceiveLen++;
CheckSum = CheckSum + datatemp;
}
if( RealReceiveLen >= BufferLen ) //数据接收完成
{
ReceiveState = ENDRECEIVE;
}
}
void ReadSerialBufData(unsigned int *Bufferptr,unsigned int *Structptr,unsigned char num)
{
unsigned char i;
for(i=0;i<num;i++)
{
*( Structptr+i) = *(Bufferptr+i);
}
}
void Serial_Init(void)
{
unsigned char i;
ReceiveState = STARTRECEIVE1;
RealReceiveLen = 0;
CheckSum = 0;
for(i=0;i<14;i++)
{
*(&Incomedata.InputUA+i)=0;
}
}
//返回一个故障代码,从低位到高位的数字分别代表了从重要故障到不重要故障,1为发生故障
unsigned char GetGuZhangCode(void)
{
unsigned long GuZhangCode; //实际需要18位
unsigned char temp;
PageRead25045EEROM(SAVETIME_ADD,(unsigned char *)(&GuZhangShiJian));//取出故障时间
WriteGuZhangPtr = ByteRead25045EEROM(SAVEWRITEGUZHANG_ADD); //取出缓冲区当前可以存储的地址指针
GuZhangNum = ByteRead25045EEROM(SAVEGUZHANGNUM_ADD);
//分析故障
if((Incomedata.ErrorCodeShuZi&0x08)!=0) //IGBT A相短路
{
GuZhangCode = (GuZhangCode&0x3FFFE)|0x01;
temp=ByteRead25045EEROM(SAVEGUZHANGCOUNT_ADD);
if(temp < 255)
ByteWrite25045EEROM(temp++,SAVEGUZHANGCOUNT_ADD);
SAVEWRITEERROR_ADD += 8;
}
if((Incomedata.ErrorCodeShuZi&0x10)!=0) //IGBT B相短路
{
GuZhangCode = (GuZhangCode&0x3FFFD)|0x02;
temp=ByteRead25045EEROM(SAVEGUZHANGCOUNT_ADD+1);
if(temp < 255)
ByteWrite25045EEROM(temp++,SAVEGUZHANGCOUNT_ADD+1);
SAVEWRITEERROR_ADD += 8;
}
if((Incomedata.ErrorCodeShuZi&0x20)!=0) //IGBT C相短路
{
GuZhangCode = (GuZhangCode&0x3FFFB)|0x04;
temp=ByteRead25045EEROM(SAVEGUZHANGCOUNT_ADD+2);
if(temp < 255)
ByteWrite25045EEROM((temp++,SAVEGUZHANGCOUNT_ADD+2);
SAVEWRITEERROR_ADD += 8;
}
if((Incomedata.ErrorCodeShuZi&0x40)!=0||(Incomedata.ErrorCodeMoNi&0x900)!=0) //输出电压A相过压
{
GuZhangCode = (GuZhangCode&0x3FFF7)|0x08;
temp=ByteRead25045EEROM(SAVEGUZHANGCOUNT_ADD+3);
if(temp < 255)
ByteWrite25045EEROM(temp++,SAVEGUZHANGCOUNT_ADD+3);
SAVEWRITEERROR_ADD += 8;
}
if((Incomedata.ErrorCodeShuZi&0x80)!=0||(Incomedata.ErrorCodeMoNi&0x24!=0)) //输出电压A相欠压
{
GuZhangCode = (GuZhangCode&0x3FFE0)|0x10;
temp=ByteRead25045EEROM(SAVEGUZHANGCOUNT_ADD+4);
if(temp < 255)
ByteWrite25045EEROM(temp++,SAVEGUZHANGCOUNT_ADD+4);
SAVEWRITEERROR_ADD += 8;
}
if((Incomedata.ErrorCodeShuZi&0x100)!=0||(Incomedata.ErrorCodeMoNi&0x1200)!=0)//输出电压B相过压
{
GuZhangCode = (GuZhangCode&0x3FFD0)|0x20;
temp=ByteRead25045EEROM(SAVEGUZHANGCOUNT_ADD+5);
if(temp < 255)
ByteWrite25045EEROM(temp++,SAVEGUZHANGCOUNT_ADD+5);
SAVEWRITEERROR_ADD += 8;
}
if((Incomedata.ErrorCodeShuZi&0x200)!=0||(Incomedata.ErrorCodeMoNi&0x48)!=0)//输出电压B相欠压
{
GuZhangCode = (GuZhangCode&0x3FFB0)|0x40;
temp=ByteRead25045EEROM(SAVEGUZHANGCOUNT_ADD+6);
if(temp < 255)
ByteWrite25045EEROM(temp++,SAVEGUZHANGCOUNT_ADD+6);
SAVEWRITEERROR_ADD += 8;
}
if((Incomedata.ErrorCodeShuZi&0x400)!=0||(Incomedata.ErrorCodeMoNi&0x2400)!=0)//输出电压C相欠压
{
GuZhangCode = (GuZhangCode&0x3FF70)|0x80;
temp=ByteRead25045EEROM(SAVEGUZHANGCOUNT_ADD+7);
if(temp < 255)
ByteWrite25045EEROM(temp++,SAVEGUZHANGCOUNT_ADD+7);
SAVEWRITEERROR_ADD += 8;
}
if((Incomedata.ErrorCodeShuZi&0x800)!=0||(Incomedata.ErrorCodeMoNi&0x90)!=0)//输出电压C相欠压
{
GuZhangCode = (GuZhangCode&0x3FEFF)|0x100;
temp=ByteRead25045EEROM(SAVEGUZHANGCOUNT_ADD+8);
if(temp < 255)
ByteWrite25045EEROM(temp++,SAVEGUZHANGCOUNT_ADD+8);
SAVEWRITEERROR_ADD += 8;
}
if((Incomedata.ErrorCodeMoNi&0x01)!=0) //输入电压过压
{
GuZhangCode = (GuZhangCode&0x3FDFF)|0x200;
temp=ByteRead25045EEROM(SAVEGUZHANGCOUNT_ADD+9);
if(temp < 255)
ByteWrite25045EEROM(temp++,SAVEGUZHANGCOUNT_ADD+9);
SAVEWRITEERROR_ADD += 8;
}
if((Incomedata.ErrorCodeMoNi&0x02)!=0)//输入电压欠压
{
GuZhangCode = (GuZhangCode&0x3FBFF)|0x400;
temp=ByteRead25045EEROM(SAVEGUZHANGCOUNT_ADD+10);
if(temp < 255)
ByteWrite25045EEROM(temp++,SAVEGUZHANGCOUNT_ADD+10);
SAVEWRITEERROR_ADD += 8;
}
if((Incomedata.ErrorCodeMoNi&0x4000)!=0) //输入电流过流
{
GuZhangCode = (GuZhangCode&0x3F7FF)|0x800;
temp=ByteRead25045EEROM(SAVEGUZHANGCOUNT_ADD+11);
if(temp < 255)
ByteWrite25045EEROM(temp++,SAVEGUZHANGCOUNT_ADD+11);
SAVEWRITEERROR_ADD += 8;
}
if((Incomedata.ErrorCodeShuZi&0x1000)!=0) //直流电压过压
{
GuZhangCode = (GuZhangCode&0x3EFFF)|0x1000;
temp=ByteRead25045EEROM(SAVEGUZHANGCOUNT_ADD+12);
if(temp < 255)
ByteWrite25045EEROM(temp++,SAVEGUZHANGCOUNT_ADD+12);
SAVEWRITEERROR_ADD += 8;
}
if((Incomedata.ErrorCodeShuZi&0x2000)!=0) //直流电压欠压
{
GuZhangCode = (GuZhangCode&0x3DFFF)|0x2000;
temp=ByteRead25045EEROM(SAVEGUZHANGCOUNT_ADD+13);
if(temp < 255)
ByteWrite25045EEROM(temp++,SAVEGUZHANGCOUNT_ADD+13);
SAVEWRITEERROR_ADD += 8;
}
if((Incomedata.ErrorCodeShuZi&0x4000)!=0) //直流电流过流
{
GuZhangCode = (GuZhangCode&0x3BFFF)|0x4000;
temp=ByteRead25045EEROM(SAVEGUZHANGCOUNT_ADD+14);
if(temp < 255)
ByteWrite25045EEROM(temp++,SAVEGUZHANGCOUNT_ADD+14);
SAVEWRITEERROR_ADD += 8;
}
if((Incomedata.ErrorCodeShuZi&0x01)==0) //晶闸管过温
{
GuZhangCode = (GuZhangCode&0x37FFF)|0x8000;
temp=ByteRead25045EEROM(SAVEGUZHANGCOUNT_ADD+15);
if(temp < 255)
ByteWrite25045EEROM(temp++,SAVEGUZHANGCOUNT_ADD+15);
}
if((Incomedata.ErrorCodeShuZi&0x02)==0) //IGBT过温
{
GuZhangCode = (GuZhangCode&0x2FFFF)|0x10000;
temp=ByteRead25045EEROM(SAVEGUZHANGCOUNT_ADD+16);
if(temp < 255)
ByteWrite25045EEROM(temp++,SAVEGUZHANGCOUNT_ADD+16);
}
if((Incomedata.ErrorCodeShuZi&0x40)==0) //变压器过温
{
GuZhangCode = (GuZhangCode&0x1FFFF)|0x20000;
temp=ByteRead25045EEROM(SAVEGUZHANGCOUNT_ADD+17);
if(temp < 255)
ByteWrite25045EEROM(temp++,SAVEGUZHANGCOUNT_ADD+17);
}
PageWrite25045EEROM(WriteGuZhangPtr,(unsigned char *)(&GuZhangShiJian));
PageWrite25045EEROM(WriteGuZhangPtr+4,(unsigned char *)(&GuZhangCode));
WriteGuZhangPtr += 8;
if(GuZhangNum < 10)
GuZhangNum++;
if(WriteGuZhangPtr >= (SAVEGUZHANG_ADD+8*GUZHAHNGLEN));
WriteGuZhangPtr = SAVEGUZHANG_ADD;
ByteWrite25045EEROM(SAVEWRITEGUZHANG_ADD,WriteGuZhangPtr);
ByteWrite25045EEROM(SAVEGUZHANGNUM_ADD,GuZhangNum);
}
void delay(unsigned int delaydata)
{
while(delaydata--);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -