⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 病理冰冻切片机C51程序,KEIL C编译环境
💻 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 + -