基于15单片机模拟自动售水机——蓝桥杯

        通过竞赛硬件平台模拟小区自动售水机的工作流程:通过按键控制售水机水流出和停止;通过数码管显示费率、出水量及总费用;通过光敏电阻检测环境亮度,在亮度过低的情况下,自动开灯。系统硬件电路主要由单片机控制电路、数码管显示电路、A/D 转换电路及功能按键组成。

        这套试题整体来说难度一般,仅仅使用了AD转换和定时器,便实现了全部功能。AD转换过程需要注意定时器的关闭,转换完成后再把定时器打开,否则会出现转换乱码的结果。

系统框图如图所示:基于15单片机模拟自动售水机——蓝桥杯_第1张图片

PCF8591 光敏电阻通道输入电压小于 1.25 V 时,L1 点亮

 

 售水结束,继电器关闭,显示水费

 

 售水正在进行,继电器打开,显示实时出水量

#include "STC15F2K60S2.h"	 //
#include "iic.h"
#define  u8 unsigned char

u8 code smg_du[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00}; //0-9 
u8 code smg_wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

#define KEY P3
#define NO_KEY  0xff  //?????????
#define KEY_STATE0  0   //?ж????????
#define KEY_STATE1  1  //??????????
#define KEY_STATE2  2  //???
unsigned char Key_Scan()
{
 static unsigned char key_state=KEY_STATE0; 
 u8 key_value=0,key_temp;
 u8 key1,key2;
 
 P30=0;P31=0;P32=0;P33=0;P34=1;P35=1;P42=1;P44=1;
 if(P44==0)	key1=0x70;
 if(P42==0)	key1=0xb0;
 if(P35==0)	key1=0xd0;
 if(P34==0)	key1=0xe0;
 if((P34==1)&&(P35==1)&&(P42==1)&&(P44==1))	key1=0xf0;
 
 P30=1;P31=1;P32=1;P33=1;P34=0;P35=0;P42=0;P44=0;
 if(P30==0)	key2=0x0e;
 if(P31==0)	key2=0x0d;
 if(P32==0)	key2=0x0b;
 if(P33==0)	key2=0x07;
 if((P30==1)&&(P31==1)&&(P32==1)&&(P33==1))	key2=0x0f;
 key_temp=key1|key2;
 
 switch(key_state)                                
 {
  case KEY_STATE0:
   if(key_temp!=NO_KEY)
   {
    key_state=KEY_STATE1;               
   }
   break;

  case KEY_STATE1:
   if(key_temp==NO_KEY)
   {
    key_state=KEY_STATE0;
   }
   else
   {
   switch(key_temp)                             
    {
		 case 0x77: key_value=4;break;
		 case 0x7b: key_value=5;break;
		 case 0x7d: key_value=6;break;
         case 0x7e: key_value=7;break;
			
		 case 0xb7: key_value=8;break;
		 case 0xbb: key_value=9;break;
		 case 0xbd: key_value=10;break;
         case 0xbe: key_value=11;break;
			
         case 0xd7: key_value=12;break;
		 case 0xdb: key_value=13;break;
		 case 0xdd: key_value=14;break;
		 case 0xde: key_value=15;break;
			
         case 0xe7: key_value=16;break;
		 case 0xeb: key_value=17;break;
		 case 0xed: key_value=18;break;
		 case 0xee: key_value=19;break;	
    }
    key_state=KEY_STATE2;
   }
   break;
	 
   case KEY_STATE2:
   if(key_temp==NO_KEY)
   {
    key_state=KEY_STATE0;
   }
   break;
 }
 return key_value;
}

void Timer_Init(void) //1ms
{
		AUXR |= 0x80;	//1T timer	
		TMOD &= 0xF0;	// 16bit 
		TL0 = 0xCD;		
		TH0 = 0xD4;		
		TF0 = 0;		
		TR0 = 1;		
		ET0 = 1;
		EA=1; 
}

bit key_flag;
bit output_flag;

u8 one_display[8];
u8 two_display[8];
u8 three_display[8];
u8 temp_val;

unsigned int all_v,all_fee;
void main(void)
{
		u8 key_val=NO_KEY;
		P2=0xa0;P0=0x00;P2=0x00; // close buzzer and relay
		Timer_Init(); //1ms 
		while(1)
		{
		      one_display[0]=0x00;
			  one_display[1]=smg_du[0]|0x80;
			  one_display[2]=smg_du[5];
			  one_display[3]=smg_du[0];
			  one_display[4]=smg_du[all_v/1000];
			  one_display[5]=smg_du[all_v/100%10]|0x80;
			  one_display[6]=smg_du[all_v/10%10];
			  one_display[7]=smg_du[all_v%10];

		      all_fee=all_v/2;
		      two_display[0]=0x00;
			  two_display[1]=smg_du[0]|0x80;
			  two_display[2]=smg_du[5];
			  two_display[3]=smg_du[0];
			  two_display[4]=smg_du[all_fee/1000];
			  two_display[5]=smg_du[all_fee/100%10]|0x80;
			  two_display[6]=smg_du[all_fee/10%10];
			  two_display[7]=smg_du[all_fee%10];

			  ET0=0;
              temp_val=read_adc(0x01);
			  ET0=1;
			  if(temp_val<64)
			  {
			      P2=0X80;P0=~0X01;P2=0X00;
			  }
			  else
			  {
			      P2=0X80;P0=0xff;P2=0X00;
			  }
			  if(all_v==10000)
			  {
			      output_flag=0;
			  }
			  if(output_flag)
			  {
			      P2=0XA0;P04=1;P06=0;P2=0X00;
			  }
			  else
			  {  
			      P2=0XA0;P04=0;P06=0;P2=0X00;
			  }
			  if(key_flag) 	//10ms
				{
					 key_flag=0;
					 key_val=Key_Scan();
					 switch(key_val)                       
					 {                                              
							case 4:
							
							   break;
							case 5:
							
							   break;
							case 6:
							
							   output_flag=0; 
					           break;
							case 7:
							   if(output_flag==0)
							   {
							       all_v=0;
							   }
							   output_flag=1;
							   break;

					 } 
				}
		 }
}

void timer0() interrupt 1  using 1                   
{
	static int key_count=0,smg_count=0,all_vcount=0,i=0;
	key_count++;smg_count++;
	if(key_count==10)			//10ms
	{
	 key_count=0;
	 key_flag=1;
	}
	if(output_flag)
	{
	    all_vcount++;
		if(all_vcount==100)
		{
		    all_vcount=0;
			all_v+=10;
		}
	}	
	if(smg_count==3)		//3ms
	{
			smg_count=0;
			P2=0xc0;P0=0;P2=0;				//???
			if(output_flag)
			{
			    P2=0xe0;P0=~one_display[i];P2=0;
			}
			else
			{
			    P2=0xe0;P0=~two_display[i];P2=0;
			}
			P2=0xc0;P0=smg_wei[i];P2=0;
			i++;
			if(i==8) i=0;
	}
}

 

你可能感兴趣的:(基于15单片机模拟自动售水机——蓝桥杯)