📄 main.c
字号:
#include "mqb.h"#include "x25045.h"#define ZERO 66#define STOPTIME 360 #define STOPTIME1 30 /*单位秒 停机时间 */#define DOORTIPD 2 #define DOORTIME 240 /*单位秒 开门时间大于DOORTIME秒后每DOORTIPD半秒鸣响一次*/#define TESTTIME 10 /*测试压缩机时间单位min */#define VOLTHIGH 230 /*244V*/#define VOLTLOW 50 /*175V*//*Pt100:-60 76.33 0 100 40 115.54 0.3921欧姆/度 1.91字/度 <--Vref=2.5V,Vcc=5V *//*故障码:E01:电压高于240E02:电压低于187E03:开门时间超时E04:键盘短路E05:压缩机1故障E06:压缩机2故障E07:E08:*/#define PPRESSTOP P00 /*电磁阀*/#define PPRESSTOPPOWER P04 /*压缩机2*/#define PKNIFEMOVEN P01 /*进刀*/#define PPRESSBOX P02 /*压缩机1*/#define PKNIFEMOVEP P03 /*退刀*/#define PLAMP P05 /*照明*/#define PDISINFECTION P06 /*消毒*/#define PBELL P07 /*蜂鸣器*/#define DOOR_SW P21 /*门开关*/#define MOVEP P22 /*电机向前限位开关*/#define MOVEN P23 /*电机向后限位开关*/#define DESNOW P27 /*除霜*/BYTE BadTimes;BYTE BadTimes1;BYTE WaitWriteTime,DOOR_SWTime;BYTE DispBuf[8];bit FlagCoolBoot;BYTE CoolBoot1, CoolBoot2,MoveNFlag,MovePFlag;BYTE desnowtime;bit FlagSnow;#define TCC 500 /* 5000*/ /*6mhz晶体*/ /*8333 10mhz晶体*/ /*10ms 定时常数*/BYTE Time1s,Time1m,Time1h; /*timer*/BYTE Count,Count10ms,Count1s,Count1m;BYTE Count1ms,Con1ms;WORD StopTime,StopTime1;WORD KnifeDelayTime;WORD SuLingTime = 0;BYTE KeyDownCount;char SetTempBox,SetTempTop;char TempBox1,TempBox,TempTop;BYTE PowerV;BYTE InitFlag,InitFlag1;char BeginTempBox,BeginTempTop;BYTE BeginTimeBox,BeginTimeTop;bit PressTopOn;PressBoxOn; /*压缩机工作标志*/bit Flag500ms,Flag1s,Flag1m,Flag1h; /*timer flag*/bit FLampKeyOn,FDisinfectionKeyOn,FPressTopKeyOn;/*对硬键按下标志*/void DispErr(BYTE i){ DispBuf[7]=0x0e;DispBuf[6]=i/10;DispBuf[5]=i%10; DispBuf[2]=0x11;DispBuf[3]=0x11;DispBuf[4]=0x11; DispLED(); Delay10ms(100);}Timer0() interrupt 1 using 1{ TH0=(65536-TCC)/256; TL0+=(65536-TCC)%256; if (Count1ms) Count1ms--; Con1ms--; if (!Con1ms) { Con1ms=10; if (Count) Count--; if (WaitWriteTime) WaitWriteTime--; Count10ms--; if (Count10ms==50) Flag500ms=1; if (!Count10ms) { Flag1s=1;Flag500ms=1; Count1s--; Count10ms=100; if (StopTime) StopTime--; if (StopTime1) StopTime1--; if (KnifeDelayTime) KnifeDelayTime--; Time1s++; if (DOOR_SWTime) DOOR_SWTime--; if (Time1s>=60) { if (BeginTimeBox!=0xff) if (BeginTimeBox) BeginTimeBox--; if (BeginTimeTop!=0xff) if (BeginTimeTop) BeginTimeTop--; if (Count1m) Count1m--; if (SuLingTime) SuLingTime--; Time1s=0; Time1m++; if (desnowtime) desnowtime--; Flag1m=1; if (Time1m>=60) { desnowtime=10; Time1m=0; Time1h++; if (Time1h>=24) { Time1h=0; Flag1h=1; } } } } }} void Delay10ms(BYTE T) /*T*10毫秒定时*/{ RstWatchDog(); /*复位看门狗*/ if (T>100) { Count=100; while (Count) { } Count=T-100; } else Count=T; RstWatchDog(); /*复位看门狗*/ while (Count) { }}void ClrDispBuf(void) /*清显示*/{BYTE i; for (i=0;i<2;i++) DispBuf[i]=0xff; for (i=2;i<8;i++) DispBuf[i]=0x10; DispLED();}void DispConvertCode(char x,char y) /*显示有符号两位数*/{ if (y>=0) DispBuf[4]=0x10; else {y=-y;DispBuf[4]=0x11;} DispBuf[2]=y%10; DispBuf[3]=y/10; if (x>=0){DispBuf[7]=0x10;} else { x=-x; DispBuf[7]=0x11; } DispBuf[5]=x%10; DispBuf[6]=x/10; DispLED();}void OnLed(BYTE No) /*点亮第No个发光管*/{BYTE i,j;j=1;No=No-1; if (No>7) { No=No-8; for (i=No;i<7;i++) j=j<<1; j=~j; DispBuf[0]=DispBuf[0]&j; } else { for (i=No;i<7;i++) j=j<<1; j=~j; DispBuf[1]=DispBuf[1]&j; }DispLED();}void OffLed(BYTE No) /*关第No个发光管*/{BYTE i,j;j=1;No=No-1; if (No>7) { No=No-8; for (i=No;i<7;i++) j=j<<1; DispBuf[0]=DispBuf[0]|j; } else { for (i=No;i<7;i++) j=j<<1; DispBuf[1]=DispBuf[1]|j; }DispLED();}void AlarmBell(void) /*蜂鸣器鸣响一次*/{ PBELL=0;Delay10ms(20);PBELL=1;}void MyKBOff(BYTE Delay) /*等待按键释放(等待时间单位秒)*/{BYTE i;for (i=0;i<Delay;i++) { Count=100; /*1秒*/ while (Count) { if (!MyHitKB()) return; }} while (MyHitKB()) { PBELL=0;Delay10ms(20);PBELL=1;Delay10ms(20); if (KeyDownCount) KeyDownCount--; if (!KeyDownCount) DispErr(4); }} char tempSetTempBox;BYTE ProcSetKey(bit ib) /*设置温度值*/{ BYTE ch; char i; if (ib) i=SetTempTop; else i=tempSetTempBox; ch=MyGetKB(); if (!ch) return 0; switch (ch) { case 0x6: /*+*/ i=i+1; if (i>-5) i=-5; break; case 0x7: /*-*/ i=i-1; if (i<-60) i=-60; break; case 0x8: /*Setup*/ return ch; break; } /* while (MyGetKB()){PBELL=0;} PBELL=1;*/ OnLed(ch); AlarmBell(); OffLed(ch); if (ib) SetTempTop=i; else tempSetTempBox=i; return ch;}void FunSetTemp(void){BYTE i,ch; tempSetTempBox=RdLByte25045(0x2);for (i=0;i<40;i++){ DispConvertCode(tempSetTempBox,SetTempTop); Count=40; while (Count) { ch=ProcSetKey(0); if (ch) i=0; if (ch==0x8) goto Next; } DispBuf[5]=0x10; DispBuf[6]=0x10; DispBuf[7]=0x10; DispLED(); Count=40; while (Count) { ch=ProcSetKey(0); if (ch) i=0; if (ch==0x8) goto Next; } }Next: DispConvertCode(tempSetTempBox,SetTempTop); MyKBOff(5);for (i=0;i<40;i++){ DispConvertCode(tempSetTempBox,SetTempTop); Count=40; while (Count) { ch=ProcSetKey(1); if (ch) i=0; if (ch==0x8) goto Next1; } DispBuf[2]=0x10; DispBuf[3]=0x10; DispBuf[4]=0x10; DispLED(); Count=40; while (Count) { ch=ProcSetKey(1); if (ch) i=0; if (ch==0x8) goto Next1; } }Next1:DispConvertCode(tempSetTempBox,SetTempTop); WrLByte25045(0x2,tempSetTempBox);WrLByte25045(0x3,SetTempTop);Delay10ms(100);} /*主程序*/main(){BYTE ch,i; int ix;MoveNFlag=1;MovePFlag=1;PressTopOn=0;PressBoxOn=0;BeginTimeBox=0xff;BeginTimeTop=0xff;SuLingTime=8*60;BadTimes=0;BadTimes1=0;desnowtime=0; TMOD=0x21; /*CTC0 mode 1 CTC1 mode 2*/ TH0=(65536-TCC)/256; TL0=(65536-TCC)/256; Count10ms=100; EA=1; ET0=1;TR0=1; /*enable T0 int,Start CTC0*/ WriteEn25045(); WrSR25045(0x00); /*0x0-1.4s看门狗时间*//* WrSR25045(0x30); 屏蔽看门狗*/ ch=RdLByte25045(0x0); if ((RdLByte25045(0x0)==0x55)&&(RdLByte25045(0x1)==0xaa)) { SetTempBox=RdLByte25045(0x2); SetTempTop=RdLByte25045(0x3); } else { SetTempBox=-10; SetTempTop=-20; WrLByte25045(0x0,0x55); WrLByte25045(0x1,0xaa); WrLByte25045(0x2,SetTempBox); WrLByte25045(0x3,SetTempTop); } DOOR_SWTime=DOORTIME; if (StopTime>STOPTIME) StopTime=STOPTIME; StopTime=STOPTIME; StopTime1=2; Time1h=0; Time1m=0; Time1s=0; if ((CoolBoot1==0x12)&&(CoolBoot2==0x34)) { FlagCoolBoot=0; } else { FlagCoolBoot=1; CoolBoot1=0x12; CoolBoot2=0x34; } if (FlagCoolBoot) { for (i=0;i<1;i++) { PBELL=0; ClrDispBuf(); Delay10ms(50); PBELL=1; DispBuf[0]=0x00; DispBuf[1]=0x00; DispConvertCode(-88,-88); Delay10ms(50); } } DispBuf[0]=0xff; DispBuf[1]=0xff; DispConvertCode(SetTempBox,SetTempTop); PBELL=1; if (FlagCoolBoot) { Delay10ms(100); } /*A=10,5字/欧姆*/ FlagSnow=1;for(;;){ ix=0; for (i=0;i<20;i++) { RstWatchDog(); ix=ix+GetADCData(0x0); } TempBox=ix/33-ZERO; /*箱体温度*/ ix=0; for (i=0;i<20;i++) { RstWatchDog(); ix=ix+GetADCData(0x1); } TempTop=ix/33-ZERO; /*冷台温度*/ ix=0; for (i=0;i<20;i++) { RstWatchDog(); ix=ix+GetADCData(0x2); } TempBox1=ix/33-ZERO; /*结霜监测*/ if (Time1h==12) { if (desnowtime) { DESNOW=0; FlagSnow=0; } else { DESNOW=1; FlagSnow=1; } } else { DESNOW=1; FlagSnow=1; } if (FlagSnow==1) { if (FPressTopKeyOn) /*设置压缩机2工作*/ { if (KnifeDelayTime==0) { if ((PressTopOn==1)&&(TempTop<SetTempTop)) /*压缩机2在工作并低于设定温度*/ { PPRESSTOP=1;PressTopOn=0;StopTime1=STOPTIME1; /*stop停机*/ } } if ((TempTop>SetTempTop)&&(StopTime1==0)&&(PressTopOn==0)) /*压缩机2未工作并高于设定温度,停机时间到*/ { PPRESSTOPPOWER=0; PPRESSTOP=0;Delay10ms(50);PressTopOn=1; /*开机*/ BeginTempTop=TempTop; BeginTimeTop=TESTTIME; } } if ((TempBox<SetTempBox)&&(PressBoxOn==1)) /*箱体温度低于设定温度关机*/ { PPRESSBOX=1;PressBoxOn=0;StopTime=STOPTIME; } if ((TempBox>SetTempBox)&&(StopTime==0)&&(PressBoxOn==0)) /*箱体温度高于设定温度&停机时间到&未开机则开机*/ { PPRESSBOX=0;Delay10ms(50);PressBoxOn=1; BeginTempBox=TempBox; BeginTimeBox=TESTTIME; } } else {// PPRESSBOX=1; 原来仅有这一行,可能造成不能启动 PPRESSBOX=1;PressBoxOn=0;StopTime=STOPTIME; } if (Flag500ms) { OnLed(9); Flag500ms=0; } if (Flag1s) { OffLed(9); DispConvertCode(TempBox,TempTop); /*每500毫秒更新温度显示*/ Flag1s=0; } if (Flag1m) { Flag1m=0; } /*分标志*/ if (Flag1h) { Flag1h=0; } /*时标志*/ /*检测门开关0-关;1-开*/ DOOR_SW=1; if (DOOR_SW) { if (!DOOR_SWTime) {DOOR_SWTime=DOORTIPD; DispErr(3);AlarmBell();} } else DOOR_SWTime=DOORTIME; /*4 minute */ KeyDownCount=100; MOVEP=1;MOVEN=1; if (!MOVEP) {AlarmBell();} if (!MOVEN) {AlarmBell();} if (MyHitKB()) { ch=MyGetKB(); if (ch) AlarmBell(); switch (ch) { case 0x1: //照明 if (FLampKeyOn){FLampKeyOn=0;PLAMP=1;OffLed(1);} else{FLampKeyOn=1;PLAMP=0;OnLed(1);} break; case 0x2: // if (FDisinfectionKeyOn){FDisinfectionKeyOn=0;PDISINFECTION=1;OffLed(2);} else{FDisinfectionKeyOn=1;PDISINFECTION=0;OnLed(2);} break; case 0x3: OnLed(3); while (MyGetKB()==0x3) { MOVEN=1; if (MOVEN) {PKNIFEMOVEN=0;} else {PKNIFEMOVEN=1; AlarmBell();break;} } PKNIFEMOVEN=1; OffLed(3);/* if (MoveNFlag) { PKNIFEMOVEN=0; OnLed(3); } else { PKNIFEMOVEN=1; OffLed(3); } MoveNFlag=!MoveNFlag; */ break; case 0x4: /*Back*/ OnLed(4); while (MyGetKB()==0x4) { MOVEP=1; if (MOVEP) {PKNIFEMOVEP=0;} else {PKNIFEMOVEP=1;AlarmBell();break;} } PKNIFEMOVEP=1; OffLed(4);/* if (MovePFlag) { PKNIFEMOVEP=0; OnLed(4); } else { PKNIFEMOVEP=1; OffLed(4); } MovePFlag=!MovePFlag; */ break; case 0x6: /*慢进*/ Count = 10; while (Count) { MOVEN=1; if (MOVEN) {PKNIFEMOVEN=0;} else {PKNIFEMOVEN=1; AlarmBell();break;} } PKNIFEMOVEN=1; break; case 0x7: /*慢退*/ Count = 10; while (Count) { MOVEP=1; if (MOVEP) {PKNIFEMOVEP=0;} else {PKNIFEMOVEP=1;AlarmBell();break;} } PKNIFEMOVEP=1; break; case 0x5: /*速冷*/ if (FPressTopKeyOn) { FPressTopKeyOn=0;OffLed(5);PPRESSTOP=1;PPRESSTOPPOWER=1; BeginTempTop=TempTop; BeginTimeTop=TESTTIME; if (PressTopOn==1) { PressTopOn=0;StopTime1=300; } } else { KnifeDelayTime=60+StopTime1; /*19991123*/ FPressTopKeyOn=1;OnLed(5); SuLingTime=8*60; SetTempBox = RdLByte25045(0x2); } break; case 0x8: OnLed(8);FunSetTemp();OffLed(8); break; } MyKBOff(5); } if (SuLingTime == 1) { FPressTopKeyOn=0;OffLed(5);PPRESSTOP=1;PPRESSTOPPOWER=1; BeginTempTop=TempTop; BeginTimeTop=TESTTIME; PressTopOn=0;StopTime1=300; } if (!FPressTopKeyOn) //非速冷状态,箱体温度为-15度 { SetTempBox = -15; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -