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

📄 main.c

📁 美的的一个吸尘器程序
💻 C
字号:
#ifndef COMMON_H
#define COMMON_H

#include <avr/io.h>
#include <avr/delay.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
//#include <twi.h>
//#include <avr/pgmspace.h>
//#include <string.h> 
#include <stdio.h>
#include <deprecated.h>

#define uchar unsigned char
#define uint  unsigned int
#define ulong unsigned long int

#define FREQ 		4
//========================
#define  Lcd_CS			PD1
#define  Lcd_CLK		PD0
#define  Lcd_DATA       PD2
#define  LCD_PORT   	PORTD				//定义LCD口

#define  SPECK_PORT     PORTC				//定义语音口
#define  SBT            PC4

#define  MORT_PORT		PORTD				//定义真空口
#define  JRQ_PORT       PORTC				//定义蒸气口

#define  QD             0x10
#define  CM				0x08
#define  NoW			0x04
#define  POWER          0x20
#define  ZQ             0x80
#define  SYN            0x08
#define  MORT           PD4
#define  JR             PC5

#define  UP				0x01
#define  ZK				0x02
#define  ZQON			0x04
#define  ZQOFF			0x08
#define  DOWN           0x10

#define  VOICE1			0x00		//声音地址
#define  VOICE2		    0x01
#define  VOICE3		    0x02
#define  VOICE4		    0x03
#define  VOICE5 		0x04
#define  VOICE6         0x05
#define  VOICE7         0x06
#define  VOICE8         0x07

#define  KEY_ADC4V      0xcc			//A/D等于4V的值
#define  KEY_ADC2V      0x64			//A/D等于2V的值	127	0x7f
#define  KEY_ADC1V      0x1E			//A/D等于1V的值	42	0x2a

#define  LED_Power      0x7F			//电源灯
#define  LED_ZKHIG      0x1F			//真空高
#define  LED_ZKMID      0x37			//真空中
#define  LED_ZKLOW      0x3B			//真空低
#define  LED_ZKOFF      0x6C			//真空关
#define  LED_ZQ			0x6F			//蒸气灯
#define  LED_ZQOFF      0x10			//蒸气关
#define  LED_CM_OFF		0x01			//尘满关
#define  LED_CM_ON      0x7E			//尘满开
#define  LED_NoW_OFF    0x02			//无水关
#define  LED_NoW_ON		0x7D			//无水开

#define  OFF            0
#define  ON				1

//========================
uint SUM_Buf[10];
uint Sumn;
static uchar Sumn_T;					//时间平均值
static uchar Sumn_Key;					//A/D键平均值
static uchar Motol_Star;
static uchar Motol_End;
static uchar Motol_Mid;
static uchar Power_Hi;
static uchar Power_Mi;
static uchar Power_Li;

static uchar Work_Power=0;
static uchar Work_ZK   =0;
static uchar Work_ZQ   =0;

static uchar Put_Key = 0;
//------------------------
static uchar State_LED;			//LED指示灯
static uchar State_Speak;		//声音指示

static uchar State_Motol=0;		//Motol状态 1: 高速 2:中速 3:低速
//static uchar State_Motol_Js =0; //Motol状态 加速

static uchar State_Ykonq=0;    //遥控器工作状态 0:无工作 1:以工作
static uchar Bj_QD = 0;			//倾倒报警标记  0是无报警
static uchar T1_Count=0;		//T1中断次数
static uchar T1_Gs =0;			//T1中断时间数
static uchar Bj_Count=0;		//报警1s记数器
static uchar Bj_Direct =0;		//报警方向
static uchar Bj_NoW =0;			//无水报警标记  0是无报警
static uchar Bj_CM=0;			//尘满报警标记  0是无报警
//------------------------
//#define		F_CPU	8000000		/* 单片机主频为8MHz,用于延时子程序 */
//***************************
extern 	void SUM_PINJS();
void DelayMs(uint t)
{
	uint i;
	for(i =0;i<t;i++)
		_delay_loop_2( 250*FREQ	);
}
void DelayUs(uint t)
{
	uint i,j;
	for(i=0;i<t;i++)
	{
		for(j=0;j<10;j++)
		{
			asm("nop");
		}
	}
}
#endif	
//===============================
void LED_Display(uchar x)		//LED显示
{
	uchar i=0;					
	cbi(LCD_PORT,Lcd_CS);
	for(i=0;i<8;i++)
	{
		cbi(LCD_PORT,Lcd_CLK);
		if((x&0x80)!=0)
		{
			sbi(LCD_PORT,Lcd_DATA);
			asm("nop");
		}
		else
		{
			cbi(LCD_PORT,Lcd_DATA);
			asm("nop");
		}
		x = x << 1;
		sbi(LCD_PORT,Lcd_CLK);
		asm("nop");
	}
	sbi(LCD_PORT,Lcd_CS);
}
void VO_Time()			//测量平均时间T,定时器T0
{
	uchar i;
	for(i=0;i<10;i++)
	{
		while((PIND & SYN) == 0);
		while((PIND & SYN) != 0);		
	    TCNT0 = 0X0;
		TCCR0B = _BV(CS02)|_BV(CS00);
		while((PIND & SYN) ==0 );
		while((PIND & SYN) != 0);
		SUM_Buf[i] = (uint)TCNT0;
	 }
    Sumn = 0;
	SUM_PINJS(SUM_Buf);
	Sumn_T = Sumn;
	Power_Hi = 3;
	Power_Mi = Sumn_T * 45 / 100 ;
	Power_Li = Sumn_T * 60 /100;
	Motol_Mid = Power_Mi;
	Motol_Star = Power_Li;//Sumn_T - 15;
	Motol_End = 3;
}
void INIT()				//初试
{
	DDRD = 0X17;		
	DDRB = 0x00;
	DDRC = 0X3F;
	PORTD = 0xFF;
	PORTB = 0xFF;
	PORTC = 0x00;
	//--------------------
	State_LED = 0xFF;
	State_Speak = 0xFF;
	Motol_Star = 0x0;
	Motol_End  = 0x0;
	Work_Power = OFF;		
	Work_ZK = OFF;
	Work_ZQ = OFF;
	Bj_QD = OFF;
	Bj_CM = OFF;
	Bj_NoW = OFF;	
	//--------------------
}
void KEY_ADC(uchar p)				//8位 A/D值
{
	uchar i=0;
	uint  ret;	
	ADMUX = _BV(REFS0)|_BV(ADLAR)|p;						
	ADCSRA = _BV(ADEN)|_BV(ADPS2)|_BV(ADPS1);	
	for(i=0;i<10;i++)
	{
		ADCSRA |=_BV(ADSC);
		while(ADCSRA & _BV(ADSC));	
		ret = (uint)ADCH;		
		SUM_Buf[i] = ret;		
	}
	ADCSRA = 0;
	SUM_PINJS(SUM_Buf);	
	Sumn_Key = Sumn;
}
void SPEAK()
{
	while(State_Speak != 0xFF)
	{
		PORTC &= 0XF0;
		PORTC |= State_Speak;
		asm("nop");		
		asm("nop");
		cbi(SPECK_PORT,SBT);
		asm("nop");
		asm("nop");
		sbi(SPECK_PORT,SBT);
	//	DelayUs(300);
		asm("nop");
		asm("nop");		
		State_Speak = 0xFF;
	}
}
void SUM_PINJS(uint *p)
{
	uchar i;
	uint  ret;
	uchar max_id,min_id,max_value,min_value;	
	ret = 0;
	for(i=1;i<10;i++)
		ret +=*(p+i);
	ret /= 9;
	max_id = min_id = 1;
	max_value = min_value = 0;
	for(i=1;i<10;i++)
	{
		if( *(p+i) >ret)
		{
			if(*(p+i)-ret > max_value)
			{
				max_value = *(p+i) - ret;
				max_id = i;
			}
		}
		else
		{
			if( ret-*(p+i)>min_value)
			{
				min_value = ret-*(p+i);
				min_id = i;
			}
		}
	}
	ret = 0;
	for(i=1;i<10;i++)
	{
		if((i !=min_id)&&(i != max_id))
			ret += *(p+i);
	}
	if(min_id != max_id)
		ret /=7;
	else
		ret /= 8;	
	Sumn = ret;
}
void Motol_Work()		//匀速加速,定时器T0
{
	uchar i=0,Fx;
	uchar Gs;
	Gs = 3;	
	Fx = (Motol_Star > Motol_End) ? 1 : 2;	
	if(Motol_Star ==Motol_End )
	{
		TCNT0 = 0;	
		OCR0A = Motol_Star;					//高速触发
		TCCR0B = _BV(CS02)|_BV(CS00);
		TIMSK0 =_BV(OCIE0A);
	}
	else
	{
		if(Fx == 1)
		{
			TCNT0 = 0;	
			OCR0A = Motol_Star;					//高速触发
			TCCR0B = _BV(CS02)|_BV(CS00);
			TIMSK0 =_BV(OCIE0A);
			i++;
			while (i<Gs)
			{
				while((PIND & SYN) == 0);
				while((PIND & SYN) != 0);
				TCNT0 = 0;	
				OCR0A = Motol_Star;					//高速触发
				TCCR0B = _BV(CS02)|_BV(CS00);
				TIMSK0 =_BV(OCIE0A);
				i++;			
			}
			Motol_Star--;
		}
		else
		{
			TCNT0 = 0;	
			OCR0A = Motol_Star;					//高速触发
			TCCR0B = _BV(CS02)|_BV(CS00);
			TIMSK0 =_BV(OCIE0A);
			i++;
			while (i<Gs)
			{
				while((PIND & SYN) == 0);
				while((PIND & SYN) != 0);
				TCNT0 = 0;	
				OCR0A = Motol_Star;					//高速触发
				TCCR0B = _BV(CS02)|_BV(CS00);
				TIMSK0 =_BV(OCIE0A);
				i++;				
			}
			Motol_Star++;
		}
	}
}
SIGNAL(SIG_OUTPUT_COMPARE0A)//SIG_OVERFLOW0)			//定时器0 ,中断触发
{
	TCNT0 = 0X0;
	TCCR0B = 0X00;
	cbi(PORTD,MORT);
	DelayUs(5);
	sbi(PORTD,MORT);
	DelayUs(13);
	cbi(PORTD,MORT);
	DelayUs(5);
	sbi(PORTD,MORT);		
}
SIGNAL(SIG_OVERFLOW2)			//定时器2 
{
	if(++Bj_Count > 100)
	{
		if(Bj_Direct)		//反向LED控制
		{
			if(Bj_CM == ON )
				State_LED |= LED_CM_OFF;
			if( Bj_NoW == ON )
				State_LED |= LED_NoW_OFF;
			LED_Display(State_LED);	
			Bj_Direct = 0;
		}
		else
		{
			if(Bj_CM == ON )
				State_LED &= LED_CM_ON;
			if(Bj_NoW == ON)
				State_LED &= LED_NoW_ON;
			LED_Display(State_LED);	
			Bj_Direct = 1;
		}	
		Bj_Count = 0;	
		if(Bj_CM == ON )	
		{
			if((PINB & CM) !=0)
			{
				State_LED |=0X01;
				LED_Display(State_LED);					
				Bj_CM = OFF;
			}
		}
		if(Bj_NoW == ON)	
		{
			if((PINB & NoW) ==0)
			{
				State_LED |=0X02;
				LED_Display(State_LED);					
				Bj_NoW = OFF;
			}
		}
		if((Bj_CM ==OFF ) &&( Bj_NoW ==OFF))
		{
			TIMSK2 &=~ _BV(TOIE2);
			TCCR2B = 0x00;
		}
	}
}
SIGNAL(SIG_OVERFLOW1)				//定时器1
{
	if(++T1_Count > T1_Gs)
	{
		T1_Count =0;			
		TCNT1 = 0X0;
		TCCR1B = 0;
		TIMSK1 &= ~_BV(TOIE1);
		State_Speak = VOICE8;
		SPEAK();		
	}
}
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
void POWER_Key()
{
	if( Work_Power == OFF)
	{
		Work_Power = ON;
		State_LED = LED_Power;
		LED_Display(State_LED);
		State_Speak = VOICE1;
		SPEAK();
	}
	else
	{
		Work_Power = OFF;
		cbi(JRQ_PORT,JR);
		cli();	
		TCCR0B = 0;
		TIMSK0 = 0;
		TCCR1B = 0;
		TIMSK1 = 0 ;	
		TCCR2B = 0;
		TIMSK2 = 0;		
		State_Motol = 0;
		Work_ZQ = OFF;
		Work_ZK = OFF;			
		State_LED = 0xFF;
		Bj_CM = 0;
		Bj_NoW = 0;
		Bj_QD = 0;			
		LED_Display(State_LED);
		State_Speak = VOICE7;
		SPEAK();			
		INIT();					
		while( (PINB & POWER) == 0 );
		DelayMs(1000);
	}			
}
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
void NoW_Key()						//无水
{
	Bj_NoW =ON;
	State_Speak = VOICE6;
	SPEAK();	
	Work_ZQ = OFF;
	cbi(JRQ_PORT,JR);	
	State_LED |= LED_ZQOFF;
	LED_Display(State_LED);	
	TCNT2 = 0;							//初始值
	TCCR2B = _BV(CS22)|_BV(CS20);		//1024分频
	TIMSK2 = _BV(TOIE2);					//T/C2中断允许
	TCCR1B = 0;
	TIMSK1 = 0;
}
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
void CM_Key()						//高速/尘满
{
	Bj_CM = ON;
	State_Speak = VOICE5;
	SPEAK();		
	TCNT2 = 0;							//初始值
	TCCR2B = _BV(CS22)|_BV(CS20);		//1024分频
	TIMSK2 = _BV(TOIE2);				//T/C2中断允许
	Work_ZK = OFF;		
	State_Motol = 0;				
	State_LED |= LED_ZKOFF;
	LED_Display(State_LED);						
}
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//void QD_Key()						//倾到
//{
//	Work_ZQ = OFF;
//	cbi(JRQ_PORT,JR);
//	State_LED |= LED_ZQOFF;
//	LED_Display(State_LED);	
//	Bj_QD = ON;
//}
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
void ZK_Key()
{
	if(Work_ZK == ON)
	{
		Work_ZK = OFF;
		State_Motol = 0;
		State_Speak = VOICE2;
		SPEAK();		
		State_LED |= LED_ZKOFF;
		LED_Display(State_LED);	
	}
	else
	{
		if( Bj_CM == OFF )
		{
			Work_ZK = ON;
			State_LED |= LED_ZKOFF;
			State_LED &= LED_ZKHIG;
			LED_Display(State_LED);				
			Motol_End = 3;
			Motol_Star = Power_Li;				
			State_Motol =1;
		}
	}
}
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
void UP_Key()
{
	switch (State_Motol)
	{
		case 3: {
					State_Motol = 2;
					State_LED |= LED_ZKOFF;
					State_LED &= LED_ZKMID;
					LED_Display(State_LED);								
					Motol_End  = Power_Mi;//((Sumn_T >> 1)-5);					//Sumn_T/2;											
					break;
				}
		case 2: {
					State_Motol = 1;
					State_LED |= LED_ZKOFF;
					State_LED &= LED_ZKHIG;
					LED_Display(State_LED);	
					Motol_End  = 3;													
					break;
				}
		default:	break;
	}
}
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
void DOWN_Key()
{
	switch (State_Motol)
	{
		case 1:	{
					State_Motol = 2;
					State_LED |= LED_ZKOFF;
					State_LED &= LED_ZKMID;
					LED_Display(State_LED);
					Motol_End  = Power_Mi;//((Sumn_T >> 1)-5);					//Sumn_T/2;											
					break;
				}
		case 2: {
					State_Motol = 3;
					State_LED |= LED_ZKOFF;
					State_LED &= LED_ZKLOW;
					LED_Display(State_LED);
					Motol_End  = Power_Li;//(Sumn_T-(Sumn_T>>2)-13);		//(Sumn_T*0.7);													
					break;
				}
		default:	break;

	}
}
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
void ZQ_Key()
{
	if((Bj_NoW == OFF) && (Bj_QD == OFF))
	{
		if(Work_ZQ == ON)
		{
			Work_ZQ = OFF;
			cbi(JRQ_PORT,JR);
			State_LED |= LED_ZQOFF;
			LED_Display(State_LED);	
			State_Speak = VOICE4;
			SPEAK();
			TCCR1B = 0X0;
			TIMSK1 &= ~_BV(TOIE1);			
		}
		else
		{
			Work_ZQ = ON;
			sbi(JRQ_PORT,JR);
			State_LED &= LED_ZQ;
			LED_Display(State_LED);	
			State_Speak = VOICE3;
			SPEAK();
			T1_Count = 0;
			T1_Gs = 7;//10;
			TCNT1 = 0X0;
			TCCR1B = _BV(CS12)|_BV(CS10);
			TIMSK1 =_BV(TOIE1);
			Bj_QD = 0;
		}		
	}	
}
//****************************************************************************************
int	main()
{
uchar Key1_In,Key2_In,Ad_Buf1,min,max;			
	  		INIT();
			State_LED =0xFF;
			LED_Display(State_LED);	
			DelayMs(10);
			VO_Time();			
First:		while( (PINB & POWER) != 0 );								//判断POWER键
						POWER_Key();			
			while( (PINB & POWER) == 0 );			
						sei();
START: 		while( Work_Power == ON)
			{
				if( Work_ZK == ON)
				{
					while((PIND & SYN) == 0);
					while((PIND & SYN) != 0);
					Motol_Work();
				}
				Key1_In = PINB;
				if((Key1_In & NoW )!= 0)								//无水
				{
					if(Bj_NoW == OFF)
						NoW_Key();			
				}
				if( (Key1_In & CM) == 0)								//尘满
				{
					if(State_Motol ==1)
					{
						if(Bj_CM == OFF )
							CM_Key();
					}
				}
//				if((Key1_In & QD ) != 0)								//倾到
//				{
//					if(Bj_QD == OFF )
//						QD_Key();
//				}
//				else
//					Bj_QD = OFF;
		//***************************************************************
				KEY_ADC(6);
				if(Sumn_Key > KEY_ADC4V)
				{
					KEY_ADC(7);
					if(Sumn_Key > KEY_ADC4V)
					Put_Key =0;
				}
		//***************************************************************
				if(Put_Key == 0)
				{
					KEY_ADC(6);
					Ad_Buf1 = Sumn_Key;
					KEY_ADC(6);
					min = (Ad_Buf1 >= Sumn_Key)?Sumn_Key : Ad_Buf1 ;
					max = (Ad_Buf1 <= Sumn_Key)?Sumn_Key : Ad_Buf1 ;
					if( (max -min ) < 50)
					{
						if( Sumn_Key < KEY_ADC4V )
						{
							if( Sumn_Key > KEY_ADC2V)
							{
								Put_Key = 1;
								if((Work_ZK == ON) && (State_Motol >1))
									UP_Key();					//真空键+
							}
							else
							{
								Put_Key = 1;
								ZK_Key();					//真空键
							}
						}
					}
					KEY_ADC(7);			
					Ad_Buf1 = Sumn_Key;
					KEY_ADC(7);
					min = (Ad_Buf1 >= Sumn_Key)?Sumn_Key : Ad_Buf1 ;
					max = (Ad_Buf1 <= Sumn_Key)?Sumn_Key : Ad_Buf1 ;
					if( (max-min) <50 )
					{
						if( Sumn_Key < KEY_ADC4V )
						{
							if( Sumn_Key > KEY_ADC2V )
							{
								Put_Key = 1;
								ZQ_Key();					//蒸汽键
							}
						else
							{
								Put_Key = 1;	
								if((Work_ZK == ON) && (State_Motol <3))
									DOWN_Key();					//真空键-
							}						
						}
					}			
				}				 			
				if((PINB & POWER) == 0 )
					POWER_Key();						
			}
			goto First;		
			return 0;
						
}			
	//		if((Key1_In & ZQ ) != 0)
	//			goto ZQ_Key;
	//		Key2_In = PINB;
	//		if((Key2_In & UP) != 0 )
	//			{
	//				State_Ykonq =1;					//遥控器工作
	//				goto UP_Key;
	//			}	
	//		if((Key2_In & ZK) != 0 )
	//			{
	//				State_Ykonq=1;
	//				goto ZK_Key;
	//			}
	//		if((Key2_In & ZQON) != 0 )
	//			{
	//				State_Ykonq=1;
	//				goto ZQON_Key;
	//			}
	//		if((Key2_In & ZQOFF) != 0 )
	//			{
	//				State_Ykonq=1;
	//				goto ZQOFF_Key;
	//			}
	//		if((Key2_In & DOWN) != 0 )
	//			{
	//				State_Ykonq=1;
	//				goto DOWN_Key;
	//			}
	//		else
	//			{		
			

⌨️ 快捷键说明

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