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

📄 rudongbeng.c

📁 这个是我们刚刚批量生产的工业蠕动泵的控制程序。单片机采用AVR系列单片机。该蠕动泵采用直流电机控制。主要根据用户设定的控制时间以及通断时间控制蠕动泵的出水量。程序内包含的自动模式和手动模式
💻 C
📖 第 1 页 / 共 2 页
字号:
//ICC-AVR application builder : 2007-2-27 22:13:08// Target : M16// Crystal: 12.0000Mhz/*=============================================================================================================================================================================================================20090513_1CNL	设计一个蠕动泵的控制程序,保证几个按钮能够正常使用。=================================================================================================================================================================================================*/#define vuchar volatile unsigned char #define vuint volatile unsigned int #define uchar unsigned char #define uint unsigned int #include <avr/io.h>#include <avr/interrupt.h>#define clear_interrupt()	cli(); 	//禁止所有中断b#define set_interrupt()		sei();	//开全局中断vuchar outputCounter=0;		//执行外部程序的时间累加器vuchar keyProcessCounter=0;	//执行外部键盘程序的累加器vuchar dataSaveBuffer[12];#define  WORK_TIME_HIGH	0#define  WORK_TIME_LOW	1#define  STOP_TIME_HIGH	2#define  STOP_TIME_LOW	3vuint dataSaveTemp=0;vuint delay1=0;vuint delay2=0;union{	volatile uint intData;	volatile uchar charData[2];}unionData;////////////////////////////////////////键盘扫描程序设定///////////////////////////////////////微调增加按键端口#define KEY_TINY_ADD_SET		((PINA&(1<<3))==0x00)//#define KEY_TINY_ADD_CLR//微调减少按键端口#define KEY_TINY_SUB_SET		((PINA&(1<<4))==0x00)//#define KEY_TINY_SUB_CLR//粗调增加按键端口#define KEY_LARGE_ADD_SET		((PINA&(1<<5))==0x00)//#define KEY_LARGE_ADD_CLR//粗调减少按键端口#define KEY_LARGE_SUB_SET		((PINA&(1<<6))==0x00)//#define KEY_LARGE_SUB_CLR//手动控制按键端口#define KEY_HAND_CONTROL_SET	((PINB&(1<<0))==0x00)//#define KEY_HAND_CONTROL_CLR//手动自动切换按钮#define KEY_HAND_AUTO_SET		((PINB&(1<<1))==0x00)//#define KEY_HAND_AUTO_CLR//运行时间切换按钮#define KEY_TIME_SWITCH_SET		((PINB&(1<<2))==0x00)//#define KEY_TIME_SWITCH_CLR//复位按钮#define KEY_DORESET_SET			((PINB&(1<<3))==0x00)//#define KEY_RESET_CLR//键盘对应寄存器vuchar keyTinyAddStatus=0;vuchar keyTinyAddCounter=0;vuchar keyTinySubStatus=0;vuchar keyTinySubCounter=0;vuchar keyLargeAddStatus=0;vuchar keyLargeAddCounter=0;vuchar keyLargeSubStatus=0;vuchar keyLargeSubCounter=0;vuchar keyHandControlStatus=0;vuchar keyHandControlCounter=0;vuchar keyHandAutoStatus=0;vuchar keyHandAutoCounter=0;vuchar keyTimeSwitchStatus=0;vuchar keyTimeSwitchCounter=0;vuchar keyResetStatus=0;vuint  keyResetCounter=0;#define KEY_RESET_SHORT		200#define KEY_RESET_LONG		800#define KEY_WAITING 		0	//按键没有出发#define KEY_PRESS 			1	//按键被按下了#define KEY_OPEN			2	//按键由按下状态转到松开状态#define KEY_TIME_SHORT		3	//短按反应#define KEY_TIME_LONG		4	//长按反应#define KEY_PRESS_OK	3	//保证按钮按下的最小单位时间量//LED指示灯#define LED1_ON()	(PORTD&=~(1<<2))#define LED1_OFF()	(PORTD|=(1<<2))#define LED2_ON()	(PORTD&=~(1<<3))#define LED2_OFF()	(PORTD|=(1<<3))vuchar ledFlag=0;#define LED3_OFF()	(PORTD&=~(1<<7))#define LED3_ON()	(PORTD|=(1<<7))//输出口信号控制#define	OUTPUT1_ON()	(PORTC	&=~(1<<0))#define	OUTPUT2_ON()	(PORTC	|=(1<<1))#define	OUTPUT1_OFF()	(PORTC	&=~(1<<0))#define	OUTPUT2_OFF()	(PORTC	&=~(1<<1))vuint outputWorkTimeCounter=0;	//运行时间计数器vuint outputWorkTimeSetting=0;	//运行时间设定值vuint outputStopTimeCounter=0;	//间隔时间计数器vuint outputStopTimeSetting=0;	//间隔时间设定值vuchar outPutEnable=0;		//输出使能位,1,在输出状态,0,不在输出状态vuchar outPutMode=0;		//需要输出的方式状态#define OUTPUT_HAND		0#define OUTPUT_AUTO	1#define OUTPUT_WAIT		2vuchar outputAlwaysStep=0;vuchar outputStep=0;	//输出的步骤,工作时间和间隔时间#define OUTPUT_STEP_WORK	0#define OUTPUT_STEP_STOP	1vuchar timeSetMode=0;#define TIME_SET_WORK	0#define TIME_SET_STOP	1vuchar settingTimeCounter=0;vuint unitTimeCounter=0;vuchar timeSwitchTimeCounter=0;//==========================================================//从临时寄存器*eepromPtr里面读出数据,//根据设定行地址,把连续的12bytes动作表写入到EEPROM中//==========================================================void writeEEPROM(vuchar *eepromWPtr,uchar lineNumber){	uchar j;	uint byteNumber;	uint eepromAddress=0;	eepromAddress=12*lineNumber;	while(EECR&0x02); //确认已经没有写动作	j = SREG;//save the status	clear_interrupt();	for(byteNumber=0;byteNumber<12;byteNumber++)	{		while(EECR&0x02); //确认已经没有写动作		EEAR =eepromAddress++;		EEDR =*(eepromWPtr+byteNumber);		EECR |= 0x04;		EECR |= 0x02;	}	while(EECR&0x02);//确认已经没有写动作	SREG = j; //restore the status   }//================================================================//根据设定行地址,把连续的12bytes的动作表从EEPROM中读出来,//然后写入到指定的临时寄存器*eepromPtr里面//================================================================void readEEPROM(vuchar *eepromPtr,uchar lineNumber){	uchar j;	uchar byteNumber;	uint eepromAddress;	eepromAddress=12*lineNumber;	while(EECR&0x02);	//确认已经没有写动作	j = SREG;//save the register  	clear_interrupt();	for(byteNumber=0;byteNumber<12;byteNumber++)	{   		EEAR =eepromAddress++;   		EECR |=0x01;   		while(EECR&0x01);//确认已经完成读动作   		*(eepromPtr++)= EEDR;		while(EECR&0x02);//确认已经没有写动作	}	SREG = j;//restore the status   }//call this routine to initialise all peripheralsvoid init_devices(void){		//stop errant interrupts until set up	clear_interrupt(); //disable all interrupts	//port_init();	PORTA=0xFF;	DDRA =0x00;		PORTB = 0xFF;	DDRB  = 0x00;		PORTC = 0xFF; 	DDRC  = 0xFF;		PORTD = 0xFF;	DDRD  = 0xFF;	//timer0_init();	//TIMER0 initialize - prescale:8	// desired value: 50uSec	// actual value: 50.000uSec (0.0%)	TCCR0 = 0x00; //stop	TCNT0 = 0x8b; //set count	TCCR0 = 0x05; //start timer	MCUCR = 0x08;	GICR  = 0x00;	//TIMSK = 0x45; //timer interrupt sources	TIMSK = 0x01; //timer interrupt sources	//set_interrupt(); //re-enable interrupts	//all peripherals are now initialised}/*********************************************************//按键扫描程序//假定运行时间单位是10ms*********************************************************/void keyScanProgram(void){	//TINY ADD按钮按下	if(KEY_TINY_ADD_SET)	{		keyTinyAddStatus=KEY_PRESS;		if(keyTinyAddCounter<200)keyTinyAddCounter++;	}	//TINY ADD按键松开	else 	{		//按键是曾经是按过的		if(keyTinyAddStatus==KEY_PRESS)		{			//按键有效触发			if(keyTinyAddCounter>KEY_PRESS_OK)			{				keyTinyAddCounter=0;				keyTinyAddStatus=KEY_OPEN;			}			//无法有效触发			else			{				keyTinyAddCounter=0;				keyTinyAddStatus=KEY_WAITING;			}		}	}	/////////////////////////////////////////	//TINY SUB按钮按下	if(KEY_TINY_SUB_SET)	{		keyTinySubStatus=KEY_PRESS;		if(keyTinySubCounter<200)keyTinySubCounter++;	}	//TINY SUB按键松开	else 	{		//按键是曾经是按过的		if(keyTinySubStatus==KEY_PRESS)		{			//按键有效触发			if(keyTinySubCounter>KEY_PRESS_OK)			{				keyTinySubCounter=0;				keyTinySubStatus=KEY_OPEN;			}			//无法有效触发			else			{				keyTinySubCounter=0;				keyTinySubStatus=KEY_WAITING;			}		}	}	/////////////////////////////////////////	//LARGE ADD按钮按下	if(KEY_LARGE_ADD_SET)	{		keyLargeAddStatus=KEY_PRESS;		if(keyLargeAddCounter<200)keyLargeAddCounter++;	}	//LARGE ADD按键松开	else 	{		//按键是曾经是按过的		if(keyLargeAddStatus==KEY_PRESS)		{			//按键有效触发			if(keyLargeAddCounter>KEY_PRESS_OK)			{				keyLargeAddCounter=0;				keyLargeAddStatus=KEY_OPEN;			}			//无法有效触发			else			{				keyLargeAddCounter=0;				keyLargeAddStatus=KEY_WAITING;			}		}	}	/////////////////////////////////////////	//LARGE SUB按钮按下	if(KEY_LARGE_SUB_SET)	{		keyLargeSubStatus=KEY_PRESS;		if(keyLargeSubCounter<200)keyLargeSubCounter++;	}	//LARGE SUB按键松开	else 	{		//按键是曾经是按过的		if(keyLargeSubStatus==KEY_PRESS)		{			//按键有效触发			if(keyLargeSubCounter>KEY_PRESS_OK)			{				keyLargeSubCounter=0;				keyLargeSubStatus=KEY_OPEN;			}			//无法有效触发			else			{				keyLargeSubCounter=0;				keyLargeSubStatus=KEY_WAITING;			}		}	}	/////////////////////////////////////////	//HAND CONTROL按钮按下	if(KEY_HAND_CONTROL_SET)	{		keyHandControlStatus=KEY_PRESS;		if(keyHandControlCounter<200)keyHandControlCounter++;	}	//HAND CONTROL按键松开	else 	{		//按键是曾经是按过的		if(keyHandControlStatus==KEY_PRESS)		{			//按键有效触发			if(keyHandControlCounter>KEY_PRESS_OK)			{				keyHandControlCounter=0;				keyHandControlStatus=KEY_OPEN;			}			//无法有效触发			else			{				keyHandControlCounter=0;				keyHandControlStatus=KEY_WAITING;			}		}	}	/////////////////////////////////////////	//HAND AUTO SET按钮按下	if(KEY_HAND_AUTO_SET)	{		keyHandAutoStatus=KEY_PRESS;		if(keyHandAutoCounter<200)keyHandAutoCounter++;	}	//HAND CONTROL按键松开	else 	{		//按键是曾经是按过的		if(keyHandAutoStatus==KEY_PRESS)		{			//按键有效触发			if(keyHandAutoCounter>KEY_PRESS_OK)			{				keyHandAutoCounter=0;				keyHandAutoStatus=KEY_OPEN;			}			//无法有效触发			else			{				keyHandAutoCounter=0;				keyHandAutoStatus=KEY_WAITING;			}		}	}	/////////////////////////////////////////	//TIME SWITCH按钮按下	if(KEY_TIME_SWITCH_SET)	{		keyTimeSwitchStatus=KEY_PRESS;		if(keyTimeSwitchCounter<200)keyTimeSwitchCounter++;	}	//TIME SWITCH按键松开	else 	{		//按键是曾经是按过的		if(keyTimeSwitchStatus==KEY_PRESS)		{			//按键有效触发			if(keyTimeSwitchCounter>KEY_PRESS_OK)			{				keyTimeSwitchCounter=0;				keyTimeSwitchStatus=KEY_OPEN;			}			//无法有效触发			else			{				keyTimeSwitchCounter=0;				keyTimeSwitchStatus=KEY_WAITING;			}		}	}	/////////////////////////////////////////	//RESET按钮按下	if(KEY_DORESET_SET)	{				keyResetStatus=KEY_PRESS;		if(keyResetCounter<65500)keyResetCounter++;	}	//TIME SWITCH按键松开	else 	{			//按键是曾经是按过的		if(keyResetStatus==KEY_PRESS)		{			//reset按键长按触发			if(keyResetCounter>KEY_RESET_LONG)			{				keyResetCounter=0;				keyResetStatus=KEY_TIME_LONG;				LED3_ON();			}			//reset按键短按触发			else if(keyResetCounter>KEY_RESET_SHORT)			//else if(keyResetCounter>KEY_PRESS_OK)			{				keyResetCounter=0;				keyResetStatus=KEY_TIME_SHORT;

⌨️ 快捷键说明

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