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

📄 rudongbeng.c.bak

📁 这个是我们刚刚批量生产的工业蠕动泵的控制程序。单片机采用AVR系列单片机。该蠕动泵采用直流电机控制。主要根据用户设定的控制时间以及通断时间控制蠕动泵的出水量。程序内包含的自动模式和手动模式
💻 BAK
📖 第 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	3
vuint 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		2

vuchar outputAlwaysStep=0;
vuchar outputStep=0;	//输出的步骤,工作时间和间隔时间
#define OUTPUT_STEP_WORK	0
#define OUTPUT_STEP_STOP	1

vuchar timeSetMode=0;
#define TIME_SET_WORK	0
#define TIME_SET_STOP	1

vuchar 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 peripherals
void 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;
				LED3_OFF();

⌨️ 快捷键说明

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