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

📄 我的空调程序.c

📁 51单片机实现空调控制程序
💻 C
📖 第 1 页 / 共 2 页
字号:
			ucCloseDelaySec = 5;	// 有按键,延时5秒关背光
			cKEYCode = SCANKEY();	// 取有效键值
		}
	}
}

/******************************** 键盘扫描 *********************************/
uchar SCANKEY(void)   //返回的是键值
{
	uchar Result = 0;
	bKey1 = 0;
	if(bKey3 == 0)
	{
		Result += 8;		// 开关
	}
	if(bKey4 == 0)
	{
		Result += 2;		// +
	}
	bKey1 = 1;
	bKey2 = 0;
	if(bKey3 == 0)
	{
		Result += 4;		// 风量
	}
	if(bKey4 == 0)
	{
		Result += 1;		// -
	}
	bKey2 = 1;
	return(Result);
}

/***************************** 按键处理 ********************************/
void DisposeKey()    //按键处理
{
	switch(cKEYCode)  //根据键值不同,分别进行处理
	{
	case KEYCODE_UP://up=1
	case KEYCODE_DOWN://down=02
		ucDelaySec = 5;			  			// 保持输入状态约5秒 */
		if(ucSystemStatus == DIS_SYS_WAIT)
		{
			aucTmpValue[0] = cSetTemp;
			ucFlashType = FLASH_SetTemp;
			ucSystemStatus = DIS_SYS_INPUT;
		}
		else if(ucSystemStatus == DIS_SYS_INPUT)
		{
			switch(ucFlashType)
			{
			case FLASH_SetTemp:				// 设置温度
				if(cKEYCode == KEYCODE_UP)
				{
					if(aucTmpValue[0] < MAX_TEMP)
					{
						cSetTemp = ++aucTmpValue[0];
					}
				}
				else 
				{
					if(aucTmpValue[0] > MIN_TEMP)
					{
						cSetTemp = --aucTmpValue[0];
					}
				}
				break;
			case FLASH_PWM:					// 设置占空比
				if(cKEYCode == KEYCODE_UP)
				{
					if(ucPWM < 100)
					{
						ucPWM += 5;
					}
				}
				else 
				{
					if(ucPWM != 0)
					{
						ucPWM -= 5;
					}
				}
				ucDelaySec = 5;			  	// 保持输入状态约5秒 */
				break;
			}
		}
		ucDelayKey = 60;
		break;
	case KEYCODE_FAN:						// 设置风速,案按键是设置风速的
		if(bStill == 0)                      //
		{
			bStill = 1;
			if(ucFanSpeed == 3)
			{
				ucFanSpeed = 0;				// 停止送风?????
			}
			else 
			{
				if(ucFanSpeed == 0)
				{
					ucFanSpeed = 4;			// 自动风
				}
				else
				{
					if (ucFanSpeed == 4)
					{
						ucFanSpeed = 1;		// 弱风
					}
					else
					{
						ucFanSpeed++;
					}
					if(ucFanSpeed == 5)
					{
						ucFanSpeed = 0;
					}
				}
			}
		}
		break;
	case KEYCODE_PWM://0c					// 设置时间
		if(ucSystemStatus == DIS_SYS_WAIT)
		{
			ucLongDelay++;
			if(ucLongDelay < 3)				//长按“风速”“-”组合键3秒才可设置时间
			{
				ucDelayKey = 240;
			}							
			else
			{
				ucLongDelay=0;
				ucFlashType = FLASH_PWM;
				ucSystemStatus = DIS_SYS_INPUT;
			}
		}
		ucDelaySec = 5;		  				// 保持输入状态约5秒 */
		break;
	case KEYCODE_ONOFF:				  		// 显示开关/确认键
		if(bStill == 0)
		{
			bStill = 1;
			if(ucSystemStatus == DIS_SYS_WAIT)
			{
				if(bPowerON == 1)
				{
					ucFanSpeed = 0;
					ucCloseDelaySec = 0;	/* 关背光 */
				}
				else
				{
					ucFanSpeed = 4;
				}
				ucSystemStatus = DIS_SYS_WAIT;
				ucDelaySec = 0;
				bPowerON = !bPowerON;
			}
			else //(ucSystemStatus == DIS_SYS_INPUT)
			{
				ucDelaySec = 5;			  	// 保持输入状态约5秒 */
				switch(ucFlashType)
				{
				case FLASH_SetTemp:
					ucSystemStatus = DIS_SYS_WAIT;
					ucFlashType = WAIT_cCurrTemp;
					break;
				default:
					ucSystemStatus = DIS_SYS_WAIT;
					ucDelaySec = 0;
					break;
				}
			}
		}
		break;
	default:
		break;
	}
	cKEYCode = 0;
}

/**************************** 显示刷新 *********************************/
void ScanLED(void)
{
	uchar a;
	P2 = 0;									// 先清显示
	a=P0 & 0xe0;							// 保护P0口高3位数据
	P0 = a|aucLEDcs[ucScanIndex];			// 输出位选
	if(bPowerON != 0)
	{
		P2 = ucLEDFlash[ucScanIndex];		// 输出段选数据
	}
	ucScanIndex++;							// 位选移位
	if(ucScanIndex==5)
	{
		ucScanIndex=0;
	}
}

/************************** 设置风机转速 ****************************/
void SetFanStatus(void)
{
	char cD;
	cD = cCurrTemp - cSetTemp;

	ucLED = 0;
	if(ucFanSpeed == 4)
	{									//自动风
		bFAN_AUTO = 1;
		if(cD >= 3 || cD <= -3)
		{
			ucPWM = 100;				//温差>=3度,大风
		}
		else
		{
			if(cD == 2 || cD == -2)
			{
				ucPWM = 50;				//温差=2度,中风
			}
			else
			{
				ucPWM = 25;				//温差=1度,小风
			}
		}
	}
	else
	{
		switch(ucFanSpeed)
		{
		case 0:
			ucPWM = 0;
			break;
		case 1:
			ucPWM = 25;
			bFAN_LOW = 1;
			break;
		case 2:
			ucPWM = 50;
			bFAN_MIN = 1;
			break;
		case 3:
			ucPWM = 100;
			bFAN_HIGH = 1;
			break;
		default:
			break;
		}
	}
	ucLEDFlash[4] = ucLED;
}

/**************************** 显示温度 *********************************/
void DisplayTemp(char Temp)
{	
	ucLEDData[0] = aucLEDNUMCODE[Temp/10];
	if(ucLEDData[0] == 0x3f)
	{
		ucLEDData[0] = 0;					// 第一位0不显示
	}
	if(bNeg)
	{
		ucLEDData[0] |= 0x40;				// 显示负号
	}
	ucLEDData[1] = aucLEDNUMCODE[Temp%10];
	ucLEDData[2] = aucLEDNUMCODE[0x0b];		//"度"
	ucLEDData[3] = aucLEDNUMCODE[0x0a];		//"C"
}

/*************************** 显示时间等 ********************************/


/*************************** 显示PWM比例 ********************************/
void DisplayPWM(uchar Value)
{
	ucLEDData[0] = 0x73;					/* "P" */
	ucLEDData[1] = 0x40;					/* "-" */
	if(Value == 100)
	{
		Value = 99;
	}
	ucLEDData[2] = aucLEDNUMCODE[Value/10];
	ucLEDData[3] = aucLEDNUMCODE[Value%10];
}

/**************************** 处理显示 *********************************/
void UpdateDis(uchar status)
{
	uchar cKey;
	if(status == DIS_SYS_WAIT)				// 非输入状态
	{
		if(ucFlashType == WAIT_cCurrTemp)	// 显示温度
		{
			DisplayTemp(cCurrTemp);			// 显示当前温度
		}
	}
	else									// 正在输入状态
	{
		cKey = SCANKEY();
		switch(ucFlashType)
		{
		case FLASH_SetTemp:					// 温度设置状态时
			DisplayTemp(aucTmpValue[0]);	
			if((bFlash == 0) && (cKey == 0))
			{
				ucLEDData[0] = 0;
				ucLEDData[1] = 0;
			}
			break;
		case FLASH_PWM:						// 占空比设置状态时
			DisplayPWM(ucPWM);	
			if((bFlash == 0) && (cKey == 0))
			{
				ucLEDData[2] |= 0;
				ucLEDData[3] |= 0;
			}
			break;
		default:
			break;
		}
	}
	ucLEDFlash[0] = ucLEDData[0];
	ucLEDFlash[1] = ucLEDData[1];
	ucLEDFlash[2] = ucLEDData[2];
	ucLEDFlash[3] = ucLEDData[3];
}

/***************************** 处理延时 ********************************/
void DisposeDelay(uchar LType)
{
	switch(LType)
	{
	case DIS_SYS_WAIT:
			if(ucFlashType==WAIT_cCurrTemp)
			{
				ucFlashType = WAIT_cCurrTemp;
				ucDelaySec = 5;			  			/* 显示温度约5秒 */
			}
		break;
	case DIS_SYS_INPUT:
		if(ucFlashType==FLASH_SetTemp)
		{
			cSetTemp = aucTmpValue[0];
			ucFlashType = WAIT_cCurrTemp;
		}
	
		ucSystemStatus = DIS_SYS_WAIT;				/* 自动退出输入状态 */
		break;
	default:
		break;
	}
}

/****************************** 处理当前时间 *******************************/

⌨️ 快捷键说明

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