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

📄 rudongbeng.c.bak

📁 这个是我们刚刚批量生产的工业蠕动泵的控制程序。单片机采用AVR系列单片机。该蠕动泵采用直流电机控制。主要根据用户设定的控制时间以及通断时间控制蠕动泵的出水量。程序内包含的自动模式和手动模式
💻 BAK
📖 第 1 页 / 共 2 页
字号:
				
			}
			//无法有效触发
			else 
			{
				keyResetCounter=0;
				keyResetStatus=KEY_WAITING;
			}
		}
	}

}




/*********************************************************
//按键处理程序
//假定时间单位是100ms
//假定运行时间以及间隔时间单位都是100ms
*********************************************************/
void keyProcess(void)
{
	//按键TINY ADD松开了
	if(keyTinyAddStatus==KEY_OPEN)
	{
		//微调运行时间,增量为100ms
		if(timeSetMode==TIME_SET_WORK)
		{
			if(outputWorkTimeSetting<65530)outputWorkTimeSetting+=1;
			unionData.intData=outputWorkTimeSetting;
			dataSaveBuffer[WORK_TIME_HIGH]=unionData.charData[0];
			dataSaveBuffer[WORK_TIME_LOW]=unionData.charData[1];
			
		}
		else //if(timeSetMode==TIME_SET_STOP)
		{
			if(outputStopTimeSetting<65530)outputStopTimeSetting+=1;
			unionData.intData=outputStopTimeSetting;
			dataSaveBuffer[STOP_TIME_HIGH]=unionData.charData[0];
			dataSaveBuffer[STOP_TIME_LOW]=unionData.charData[1];
		}
		writeEEPROM(dataSaveBuffer,1);
		timeSwitchTimeCounter=200;
		unitTimeCounter=600;
		keyTinyAddStatus=KEY_WAITING;
	}

	//按键TINY SUB松开了
	if(keyTinySubStatus==KEY_OPEN)
	{
		//微调运行时间,减量为100ms
		if(timeSetMode==TIME_SET_WORK)
		{
			if(outputWorkTimeSetting>0)outputWorkTimeSetting-=1;
			unionData.intData=outputWorkTimeSetting;
			dataSaveBuffer[WORK_TIME_HIGH]=unionData.charData[0];
			dataSaveBuffer[WORK_TIME_LOW]=unionData.charData[1];
		}
		else //if(timeSetMode==TIME_SET_STOP)
		{
			if(outputStopTimeSetting>0)outputStopTimeSetting-=1;
			unionData.intData=outputStopTimeSetting;
			dataSaveBuffer[STOP_TIME_HIGH]=unionData.charData[0];
			dataSaveBuffer[STOP_TIME_LOW]=unionData.charData[1];
		}
		writeEEPROM(dataSaveBuffer,1);
		timeSwitchTimeCounter=200;
		unitTimeCounter=600;
		keyTinySubStatus=KEY_WAITING;
	}

	//按键LARGE ADD松开了
	if(keyLargeAddStatus==KEY_OPEN)
	{
		//粗调运行时间,增量为100x100ms
		if(timeSetMode==TIME_SET_WORK)
		{
			if(outputWorkTimeSetting<65430)outputWorkTimeSetting+=100;
			unionData.intData=outputWorkTimeSetting;
			dataSaveBuffer[WORK_TIME_HIGH]=unionData.charData[0];
			dataSaveBuffer[WORK_TIME_LOW]=unionData.charData[1];
		}
		else //if(timeSetMode==TIME_SET_STOP)
		{
			if(outputStopTimeSetting<65430)outputStopTimeSetting+=100;
			unionData.intData=outputStopTimeSetting;
			dataSaveBuffer[STOP_TIME_HIGH]=unionData.charData[0];
			dataSaveBuffer[STOP_TIME_LOW]=unionData.charData[1];
		}
		writeEEPROM(dataSaveBuffer,1);
		timeSwitchTimeCounter=200;
		unitTimeCounter=600;
		keyLargeAddStatus=KEY_WAITING;
	}

	//按键LARGE SUB松开了
	if(keyLargeSubStatus==KEY_OPEN)
	{
		//粗调运行时间,减量为100x100ms
		if(timeSetMode==TIME_SET_WORK)
		{
			if(outputWorkTimeSetting>100)outputWorkTimeSetting-=100;
			unionData.intData=outputWorkTimeSetting;
			dataSaveBuffer[WORK_TIME_HIGH]=unionData.charData[0];
			dataSaveBuffer[WORK_TIME_LOW]=unionData.charData[1];
		}
		else //if(timeSetMode==TIME_SET_STOP)
		{
			if(outputStopTimeSetting>100)outputStopTimeSetting-=100;
			unionData.intData=outputStopTimeSetting;
			dataSaveBuffer[STOP_TIME_HIGH]=unionData.charData[0];
			dataSaveBuffer[STOP_TIME_LOW]=unionData.charData[1];
		}
		writeEEPROM(dataSaveBuffer,1);
		timeSwitchTimeCounter=200;
		unitTimeCounter=600;
		keyLargeSubStatus=KEY_WAITING;
	}

	//按键HandControl松开了
	if(keyHandControlStatus==KEY_OPEN)
	{
		outPutEnable=1;
		outputWorkTimeCounter=0;
		outputStopTimeCounter=0;
		keyHandControlStatus=KEY_WAITING;
		timeSwitchTimeCounter=200;
		unitTimeCounter=600;
	}

	//按键HandAuto松开了
	if(keyHandAutoStatus==KEY_OPEN)
	{
		//假如是自动状态,切换到手动状态
		if(outPutMode==OUTPUT_AUTO)
		{
			outPutMode=OUTPUT_HAND;
			outPutEnable=1;
			//outputWorkTimeCounter=0;
		    //outputStopTimeCounter=0;
		}
		//假如是手动状态,切换到自动状态		
		else //if((outPutMode==OUTPUT_HAND))
		{
			outPutMode=OUTPUT_AUTO;
			outPutEnable=1;
			//outputWorkTimeCounter=0;
		    //outputStopTimeCounter=0;
		}
		timeSwitchTimeCounter=0;
		unitTimeCounter=0;
		keyHandAutoStatus=KEY_WAITING;
	}

	//按键TimeSwitch松开了
	if(keyTimeSwitchStatus==KEY_OPEN)
	{
		//假如是运作时间设置状态,切换到间隔时间设置状态
		if(timeSetMode==TIME_SET_WORK)
		{
			timeSetMode=TIME_SET_STOP;
			//outputWorkTimeCounter=0;
		    //outputStopTimeCounter=0;
		}
		//假如是手动状态,切换到自动状态		
		else //if((timeSetMode==TIME_SET_STOP))
		{
			timeSetMode=TIME_SET_WORK;
			//outputWorkTimeCounter=0;
		   // outputStopTimeCounter=0;
		}
		timeSwitchTimeCounter=200;
		unitTimeCounter=600;
		keyTimeSwitchStatus=KEY_WAITING;
	}

	//按键RESET松开了
	//是短按的动作
	if(keyResetStatus==KEY_TIME_SHORT)
	{
		timeSetMode=TIME_SET_STOP;
		outPutMode=OUTPUT_HAND;
		//outPutEnable=0;
		outputWorkTimeCounter=0;
		outputStopTimeCounter=0;
		outputWorkTimeSetting=90;
		outputStopTimeSetting=30;
		unionData.intData=outputWorkTimeSetting;
		dataSaveBuffer[WORK_TIME_HIGH]=unionData.charData[0];
		dataSaveBuffer[WORK_TIME_LOW]=unionData.charData[1];
		unionData.intData=outputStopTimeSetting;
		dataSaveBuffer[STOP_TIME_HIGH]=unionData.charData[0];
		dataSaveBuffer[STOP_TIME_LOW]=unionData.charData[1];
		writeEEPROM(dataSaveBuffer,1);
		keyResetStatus=KEY_WAITING;
	}
	//是长按的动作
	else if(keyResetStatus==KEY_TIME_LONG)
	{
		timeSetMode=TIME_SET_STOP;
		outPutMode=OUTPUT_AUTO;
		outPutEnable=1;
		outputWorkTimeCounter=0;
		outputStopTimeCounter=0;
		outputWorkTimeSetting=65530;
		outputStopTimeSetting=10;
		unionData.intData=outputWorkTimeSetting;
		dataSaveBuffer[WORK_TIME_HIGH]=unionData.charData[0];
		dataSaveBuffer[WORK_TIME_LOW]=unionData.charData[1];		
		unionData.intData=outputStopTimeSetting;
		dataSaveBuffer[STOP_TIME_HIGH]=unionData.charData[0];
		dataSaveBuffer[STOP_TIME_LOW]=unionData.charData[1];
		writeEEPROM(dataSaveBuffer,1);
		keyResetStatus=KEY_WAITING;
		//LED3_ON();
	}	
	
}

/*********************************************************
//继电器输出控制
//假设时间单位是100ms
*********************************************************/
void outputControl(void)
{
	//在输出状态
	if(outPutEnable==1)
	{
		if(outputStep==OUTPUT_STEP_WORK)
		{
			outputWorkTimeCounter++;
			OUTPUT1_ON();
			OUTPUT2_ON();
			//LED3_ON();
			if(outputWorkTimeCounter>outputWorkTimeSetting)
			{
				outputWorkTimeCounter=0;
				outputStep=OUTPUT_STEP_STOP;
			}			
		}
		else //if(outputStep==OUTPUT_STEP_STOP)
		{
			outputStopTimeCounter++;
			OUTPUT1_OFF();
			OUTPUT2_OFF();
			if(outPutMode==OUTPUT_HAND)
			{
				outPutEnable=0;
				outputStep=OUTPUT_STEP_WORK;
			}
			//LED3_OFF();
			if(outputStopTimeCounter>outputStopTimeSetting)
			{
				outputStopTimeCounter=0;
				outputStep=OUTPUT_STEP_WORK;
				//完成一个周期,判断一下运作的模式,
				//假如是手动状态,设置该程序暂停,
				//假如是自动状态,继续运行。

			}			
		}
	}
}


/*********************************************************
//LED输出控制
//假设时间单位是100ms
*********************************************************/
void ledStatusShow(void)
{
	//恢复状态灯指示
	//设置状态
	if(unitTimeCounter>0)
	{
		//闪烁处理
		if(timeSwitchTimeCounter>0)
		{
			//点亮一次
			if(timeSwitchTimeCounter>150)
			{
				//运作时间的设置状态
				if(timeSetMode==TIME_SET_WORK)
				{
					LED1_ON();
					LED2_OFF();
				}
				//间隔时间的设置状态
				else //if(timeSetMode==TIME_SET_WORK)
				{
					LED1_OFF();
					LED2_ON();
				}
			}
			//关闭
			else if(timeSwitchTimeCounter>100)
			{
			
				//运作时间的设置状态
				if(timeSetMode==TIME_SET_WORK)
				{
					LED1_OFF();
					LED2_OFF();
				}
				//间隔时间的设置状态
				else //if(timeSetMode==TIME_SET_WORK)
				{
					LED1_OFF();
					LED2_OFF();
				}
			}
						//点亮一次
			else if(timeSwitchTimeCounter>50)
			{
				//运作时间的设置状态
				if(timeSetMode==TIME_SET_WORK)
				{
					LED1_ON();
					LED2_OFF();
				}
				//间隔时间的设置状态
				else //if(timeSetMode==TIME_SET_WORK)
				{
					LED1_OFF();
					LED2_ON();
				}
			}
			//关闭
			else //if(timeSwitchTimeCounter>100)
			{
			
				//运作时间的设置状态
				if(timeSetMode==TIME_SET_WORK)
				{
					LED1_OFF();
					LED2_OFF();
				}
				//间隔时间的设置状态
				else //if(timeSetMode==TIME_SET_WORK)
				{
					LED1_OFF();
					LED2_OFF();
				}
			}
		}
		//恢复原来的状态
		else
		{
			//运作时间的设置状态
			if(timeSetMode==TIME_SET_WORK)
			{
				LED1_ON();
				LED2_OFF();
			}
			//间隔时间的设置状态
			else //if(timeSetMode==TIME_SET_WORK)
			{
				LED1_OFF();
				LED2_ON();
			}
		}
	}
	//正常运行指示状态
	else //if(unitTimeCounter==0)
	{
		if(outPutMode==OUTPUT_AUTO)
		{
			LED1_ON();
			LED2_ON();
		}
		else //if(outPutMode==OUTPUT_HAND)
		{
			LED1_OFF();
			LED2_OFF();
		}
	}	

}


//=====================================================
//10ms中断定时器
//=====================================================
SIGNAL(SIG_OVERFLOW0)
{
	//CLI();
	TCNT0 = 0x8b; 			//reload counter value
	keyScanProgram();

	outputCounter++;
	if(outputCounter>10)
	{
		outputCounter=0;
		outputControl();
	}

	//键盘执行程序
	keyProcessCounter++;

	if(unitTimeCounter>0)unitTimeCounter--;
	if(timeSwitchTimeCounter>0)timeSwitchTimeCounter--;




}

//===========================================================//
//===========================================================//
int main(void)
{
	init_devices();

	for(delay1=0;delay1<2000;delay1++)
	{
		if(delay2<3000)
		{
			delay2++;
		}
		else 
		{
			delay2=0;
		}
	}


	set_interrupt(); //re-enable interrupts

	outPutEnable=0;
	outputWorkTimeSetting=90;
	outputStopTimeSetting=30;
		
	readEEPROM(dataSaveBuffer,1);
	//读出工作时间设置
	//taSaveTemp=0;
	unionData.charData[0]=dataSaveBuffer[WORK_TIME_HIGH];
	unionData.charData[1]=dataSaveBuffer[WORK_TIME_LOW];
	outputWorkTimeSetting=unionData.intData;
	
	//读出间隔时间设置
	unionData.charData[0]=dataSaveBuffer[STOP_TIME_HIGH];
	unionData.charData[1]=dataSaveBuffer[STOP_TIME_LOW];
	outputStopTimeSetting=unionData.intData;
	
	
	while(1)
	{
		//处理键盘程序,
		//周期是100ms
		if(keyProcessCounter>10)
		{
			keyProcessCounter=0;
			keyProcess();
		}

		ledStatusShow();		
	}


return 0;
}

⌨️ 快捷键说明

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