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

📄 aircontroler.c

📁 通过数据通讯
💻 C
📖 第 1 页 / 共 2 页
字号:
		} while(--i);
	} while(--cnt);
}

void Delay_us(uint n)
{
	uchar t;
	t = (uchar)(n/(12/11.0592))|1;
	while(--t != 0);
}

/********************* Driver_LED.c**********************/
void INITBuf(uchar LData)
{
	uchar i;
	for(i=0;i<5;i++)
	{
		OldDisBuf[i]=LData;
	}
}

void SelectLED(uchar Index)
{
	P2=0xFF;
	if(CloseDelayTimer)LED_light=0;
	switch(Index)
	{
		case 0:	LED_0=0;break;
		case 1:	LED_1=0;break;
		case 2:	LED_2=0;break;
		case 3:	LED_3=0;break;
		case 4:	LED_4=0;break;
	}
}

void ScanLED()
{
	LEDDATAPORT=0xff;
	SelectLED(ScanIndex);
/*	switch(CurrLight)
	{
	case 0:PWM[0]=0;break;
	case 1:if(TL2<40)PWM[1]=0xff;else PWM[1]=0;break;
	case 2:if(TL2<80)PWM[2]=0xff;else PWM[2]=0;break;
	case 3:if(TL2<120)PWM[3]=0xff;else PWM[3]=0;break;
	case 4:if(TL2<160)PWM[4]=0xff;else PWM[4]=0;break;
	case 5:if(TL2<200)PWM[5]=0xff;else PWM[5]=0;break;
	case 6:if(TL2<240)PWM[6]=0xff;else PWM[6]=0;break;
	}
	LEDDATAPORT=(~LEDData[ScanIndex]) | PWM[CurrLight];
*/	
	if(CloseDisStatus==SYS_ERROR || LED_ON==1)LEDDATAPORT=~LEDData[ScanIndex];
	else LEDDATAPORT=0xff;
	ScanIndex++;
	if(ScanIndex==5) ScanIndex=0;
}

void MoveBufToLEDBuf()
{
	uchar i;
	switch(SystemStatus)
	{
	case DIS_SYS_WAIT:
		if(FlashType==WAIT_TIME)
		{
			for(i=0;i<4;i++)
			{
				if(FlashStatus==SYS_ERROR)
				LEDData[i]=OldDisBuf[i] | 0x80;
				else LEDData[i]=OldDisBuf[i] & 0x7f;
			}
		}
		if(FlashType==WAIT_CURRTEMP)
		{
			for(i=0;i<4;i++)
			{
//				if(FlashStatus==SYS_ERROR)
				LEDData[i]=OldDisBuf[i] & 0x7f;
			}
		}
		LEDData[4]=LED;
		break;
	case DIS_SYS_INPUT:
		for(i=0;i<4;i++)
		{
			if((FlashType&(0x80>>i)))
			{
				if(FlashStatus==SYS_OK)LEDData[i]=0;	/* 设置位闪烁 */	
				else if(FlashType==FLASH_CLOCK_HOUR ||FlashType==FLASH_CLOCK_MIN ||
						FlashType==FLASH_TIME_HOUR ||FlashType==FLASH_TIME_MIN)
						LEDData[i]=OldDisBuf[i] | 0x80;
				else LEDData[i]=OldDisBuf[i];
			}
			else if(FlashStatus==SYS_OK)LEDData[i]=OldDisBuf[i] & 0x7f;
				else if(FlashType==FLASH_CLOCK_HOUR ||FlashType==FLASH_CLOCK_MIN ||
						FlashType==FLASH_TIME_HOUR ||FlashType==FLASH_TIME_MIN)
						LEDData[i]=OldDisBuf[i] | 0x80;
				else LEDData[i]=OldDisBuf[i];
		}
		if(FlashStatus==SYS_OK)
			LEDData[4]=LED & 0xfe;
		else if(CLOCKLED==1)
			LEDData[4]=LED | 0x01;
		break;
	}
}

void SetFanStatus()
{
	LED &= 0xe1;
	switch(FanSpeed)
	{
	case 1:	FAN_LOW=1;break;
	case 2:	FAN_MIN=1;break;
	case 3:	FAN_HIGH=1;break;
	case 4:	FAN_AUTO=1;break;
	default:break;
	}
	LEDData[4] = LED;
}

void DisposeCurrTime()
{

	if(CurrSec<60) return;
	CurrSec=0;
	if(CurrTime[1]==59)
	{
		CurrTime[1]=0;
		if(CurrTime[0]==23) CurrTime[0]=0;
		else CurrTime[0]++;
	}
	else CurrTime[1]++; 
	SystemOldStatus=DIS_VOID;
}

//0,1,2,3,4,5,6,7,8,9,A,b,C,d,E,F,度,H,o,L,t
//const uchar code LEDNUMCODE[]={0x3F,0x6,0x5B,0x4F,0x66,0x6D,0x7D,0x7,0x7F,0x6F,0x77,0x7C,0x39,0x5e,0x79,0x71,0x63,0x76,0x5c,0x38,0x78};
void DisplayTemp(char Temp)
{	
    NN=SYS_ERROR;
	if(Temp<0){Temp=-Temp;	NN=SYS_OK;}
	OldDisBuf[0]=LEDNUMCODE[Temp/10];
	if(OldDisBuf[0]==0x3f)OldDisBuf[0]=0;
	if(NN==SYS_OK)OldDisBuf[0] |=0x40;		/* 显示负号 */
	OldDisBuf[1]=LEDNUMCODE[Temp%10];
	OldDisBuf[2]=LEDNUMCODE[0x10];	//"度"
	OldDisBuf[3]=LEDNUMCODE[0x0C];	//"C"
}

void DisplayValue(uchar * Value)
{
	OldDisBuf[0]=LEDNUMCODE[Value[0]/10];
	OldDisBuf[1]=LEDNUMCODE[Value[0]%10];
	OldDisBuf[2]=LEDNUMCODE[Value[1]/10];
	OldDisBuf[3]=LEDNUMCODE[Value[1]%10];
}

void DisplayFloorNo(uchar FloorNo)
{
	OldDisBuf[0]=LEDNUMCODE[0x0F];
	OldDisBuf[1]=LEDNUMCODE[FloorNo / 100];
	OldDisBuf[2]=LEDNUMCODE[(FloorNo % 100) / 10];
	OldDisBuf[3]=LEDNUMCODE[FloorNo % 10];
}

void DisplayRoomNo(uchar RoomNo)
{
	OldDisBuf[0]=LEDNUMCODE[0xA];
	OldDisBuf[1]=LEDNUMCODE[RoomNo / 100];
	OldDisBuf[2]=LEDNUMCODE[(RoomNo  % 100) / 10];
	OldDisBuf[3]=LEDNUMCODE[RoomNo % 10];
}

void DisplayMode(uchar True)
{
	if(True)
	{
		OldDisBuf[0]=LEDNUMCODE[0x11];	/* H */
		OldDisBuf[1]=LEDNUMCODE[0x12];	/* o */
		OldDisBuf[2]=LEDNUMCODE[0x14];	/* t */
		OldDisBuf[3]=0;	
	}
	else
	{
		OldDisBuf[0]=LEDNUMCODE[0xC];	/* C */
		OldDisBuf[1]=LEDNUMCODE[0x12];	/* o */
		OldDisBuf[2]=LEDNUMCODE[0x12];	/* o */
		OldDisBuf[3]=LEDNUMCODE[0x13];	/* L */
	}
}

void UpdateDis(uchar status)
{
	switch(status)
	{
		case DIS_SYS_WAIT:							//等待设置状态
			if(FlashType==WAIT_CURRTEMP)			//温度
			{
				DisplayTemp(CurrTemp);				//显示当前温度
				dot=0;								//小数点
			}
			else if(FlashType==WAIT_TIME)			//时间
			{
				DisplayValue(&CurrTime[0]);			//显示时间设置值
				dot=1;								//小数点
			}
			if(ClockStatus==SYS_ERROR)CLOCKLED=0;	//闹铃灯不亮
			else CLOCKLED=1;						//已设置闹铃,闹铃灯长亮
			break;
		case DIS_SYS_INPUT:
			switch(FlashType)
			{
			case FLASH_SETMODE:					//设置空调方式时
				DisplayMode(TmpValue[0]);	
				break;
			case FLASH_SETTEMP:					//温度设置状态时
				DisplayTemp(TmpValue[0]);	
				break;
			case FLASH_ADD_FLOOR:				//楼层设置状态
				DisplayFloorNo(TmpValue[0]);
				break;
			case FLASH_ADD_ROOM:				//房号设置状态
				DisplayRoomNo(TmpValue[0]);
				break;
			default: DisplayValue(&TmpValue[0]);//显示时间/设置时间
				break;
			}
			break;
		case DIS_SYS_TEST:							//测试LED全亮
			INITBuf(0xFF);
			dot=1;
			break;
		case DIS_SYS_CLEAR:							//测试LED全灭
			INITBuf(0x0);
			dot=0;
			break;	
	}
	OldDisBuf[4]=LED;
}

void DisposeDelay(uchar LType)
{
	switch(LType)
	{
		case DIS_SYS_WAIT:
			if(FlashType==WAIT_CURRTEMP)
			{
//				FlashType=WAIT_CURRTEMP;
				FlashType=WAIT_TIME;
				DelayTimer=4;			  /* 显示时钟约4秒 */
			}
			else
			{
				FlashType=WAIT_CURRTEMP;
				DelayTimer=12;			  /* 显示时钟约12秒 */
			}
			SystemOldStatus=DIS_VOID;
			break;
		case DIS_SYS_INPUT:
			if(FlashType==FLASH_SETTEMP)
			{
				SetTemp=TmpValue[0];
				PARA_TEMP=1;
			}
			FlashType=WAIT_CURRTEMP;
			DelayTimer=5;
			SystemStatus=DIS_SYS_WAIT;
			break;
	}
}

/********************* Keyboard.c**********************/
uchar SCANKEY()
{
	uchar Result=0;
//sbit bKey0		=	P1^7;		/* 键盘扫描线1,高有效 */
//sbit bKey1		=	P1^6;		/* 键盘扫描线2,高有效 */
//sbit bKey3		=	P1^5;		/* 键盘输入线1,低有效 */
//sbit bKey4		=	P1^4;		/* 键盘输入线2,低有效 */
	bKey1=1;
	Delay_us(100);
	if(bKey3==0) Result+=2;		//+
	if(bKey4==0) Result+=1;		//-
	bKey1=0;
	bKey2=1;
	Delay_us(100);
	if(bKey3==0) Result+=8;		//风量
	if(bKey4==0) Result+=4;		//闹铃
	bKey2=0;
	return(Result);
}

uchar GetKey(uchar OldStatus)
{
	uchar Status;
	Status=SCANKEY();
	if(Status==OldStatus) return(OldStatus);	//无键按下,或某键长按
	Delay_MS(30);								//有按键,延时30MS削颤
	if(Status!=SCANKEY()) return(0xFF);			//错误按键
	return(Status);								//正常按键
}

void DisposeKeyboard()
{
	InputStatus=GetKey(OldInputStatus);
	if(InputStatus==0xFF) return;			//错误按键,返回
	if(InputStatus==0)						//没按键或已松键,返回
	{
		OldInputStatus=InputStatus;
		return;
	}
	CloseDelayTimer=DELAY_CLOSEDIS;			//没按键,延时5秒关背光
	LED_light=0;							/* 有按键,开背光 */
	CloseDisStatus=SYS_ERROR;				//非关显示状态
	if(InputStatus==OldInputStatus)			//还是刚才的按键
	{		
		FlashStatus=SYS_ERROR;
		if(KeyTimer>0) return;
		if(InputStatus==KEYCODE_CLOCK || InputStatus==KEYCODE_FAN) return;//非上下键不做同键处理
	}
//	FlashStatus=SYS_OK;
	OldInputStatus=InputStatus;
	DisposeKey(InputStatus);
	KeyTimer=KEYDELAYTIME;
}
/*
3-1-3-2.工作原理及软件要求:
上电初始化,所有I/O口全部输出为高。
上电结束后,通过RC4、RC1、RC5、RC3、RC2对LED 显示进行扫描。在RB口输出显示数据。
4位LED数码管采用时间和环境温度交替显示的方式进行。翻屏时间为3秒。
如果与主机的通讯没有建立,显示的时间从00:00开始。建立通讯后,显示主机提供的时间。

风量调节
每按下一次风量调节按钮,风量显示从自动、小、中、大、停进行循环,将该状态提交主机,由主机通知控制器进行相应的
风量继电器切换。同时上传PC机。如果PC机设定插卡后空调自动运行,插卡后空调的风量在自动挡位;如果PC机设定插卡后
空调不自动运行,插卡后空调的风量在停止挡位。可以通过PC机开启房间风量和调节设定温度。

温度调节和控制
按一下向上调节开关,设定温度向上调节1℃,按一下向下调节开关,设定温度向下调节1℃。按钮长按,温度快速变化。
插卡后默认该温度为25℃。该温度的调节范围为15℃~30℃。
风量在自动挡位,房间温度与设定温度相差5℃以上风量为高;相差3℃风量为中,相差1℃为低。到达比设定温度高(制热)
或低(制冷)1℃时,关闭风机和水阀。温度回升到达比设定温度低(制热)或高(制冷)1℃时,开启风机和水阀。
风量如果在其它挡位,风量不进行变化,到达比设定温度高(制热)或低(制冷)1℃时,关闭水阀。温度回升到达比设定

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -