基于15单片机的温度控制——蓝桥杯

这两天一直在刷蓝桥杯省赛试题,连着做了两套关于温度的采集试题,这一套是近几年来在温度方面比较有点难度的!

原因如下:

1.按键控制温度区间设置,需要适用矩阵键盘来进行相关按键控制。

2.温度区间设置的过程中需要实时检测数字设置是否合理,例如Tmax=20,Tmin=30。显然Tmax<Tmin,不符合逻辑,需要立马用L2亮起来进行提醒。并且错误的温度区间是无法保存的,只能等到温度区间设置合理,L2灭掉后,温度区间才可以被保存。

3.设置温度区间的保存。需要使用两个数组,第一个进行实时显示设置界面,第二个用来保存实时数据,然后在“确定按键”再次按下后,温度区间被通过第二个数组保存下来,从而设置成功!

4.当温度处于不同的温度区间时需要通过LED和继电器来表示,这时就会与之前的“LED亮灭提醒温度设置是否正确”产生了冲突,这也是一个待处理点。需要设置标志位来区分两种状态,消除冲突!

闲话不多说,来看看效果和代码吧!

 

这个就是温度的设置界面,经过调试后还算不错!

 这个界面表示此时温度处在自己预先设定的温度的哪个区间里,前面的序列号来显示相应的温度区间代号!

#include "STC15F2K60S2.h"	 //
#include "onewire.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 blink_flag;
bit error_flag;

u8 temperature;
u8 temp_type;
u8 set_max=30;
u8 set_min=20;
u8 set_number;
u8 display_inedx;
u8 display_mode;
u8 jiaru1,jiaru2;


u8 menu1[8];
u8 menu2[8];
u8 set_temp[8];


void main(void)
{
		u8 key_val=NO_KEY;
		P2=0xa0;P0=0x00;P2=0x00; // close buzzer and relay
		menu2[0]=0x40;
        menu2[5]=0x40;
		Timer_Init(); //1ms 
		while(1)
		{
		   temperature=rd_temperature();
		   menu1[0]=0x40;
		   menu1[1]=smg_du[temp_type];
		   menu1[2]=0x40;
		   menu1[3]=0x00;
		   menu1[4]=0x00;
		   menu1[5]=0x00;
		   menu1[6]=smg_du[temperature/10];
		   menu1[7]=smg_du[temperature%10];


		   if(temperature<set_min)
		   {
		       	temp_type=0;
		   }
		   else
		   {
		           if(temperature<=set_max)
				   {
				       temp_type=1;
				   }
				   else
				   {
				       temp_type=2; 
				   }
		   }
		   
		   if(display_inedx==2)	
		   {
		       	 display_inedx=5;
		   }
		  
		  if(display_inedx>7)
		  {
		        display_inedx=8;
		  }
		 
	
		  if(key_flag) 	//10ms
		  {
			 key_flag=0;
			 key_val=Key_Scan();
			 switch(key_val)                       
			 {                                              
				case 4:display_inedx++;menu2[display_inedx]=smg_du[9];set_temp[display_inedx]=9;   break;
				case 5:display_inedx++;menu2[display_inedx]=smg_du[6];set_temp[display_inedx]=6;   break;
				case 6:display_inedx++;menu2[display_inedx]=smg_du[3];set_temp[display_inedx]=3;   break;
				case 7:display_inedx++;menu2[display_inedx]=smg_du[0];set_temp[display_inedx]=0;   break;
				
				case 8:display_mode++;


				       		 if(display_mode==2)
							 {
							        display_mode=0;
							      	set_max=set_temp[1]*10+set_temp[2];
	                                set_min=set_temp[6]*10+set_temp[7];

							 }
					     
				   break;
				case 9:display_inedx++;menu2[display_inedx]=smg_du[7];set_temp[display_inedx]=7;  break;
				case 10:display_inedx++;menu2[display_inedx]=smg_du[4];set_temp[display_inedx]=4; break;
				case 11:display_inedx++;menu2[display_inedx]=smg_du[1];set_temp[display_inedx]=1; break;
				
				case 12:
				display_inedx=0;
				  menu2[1]=0x00;
				  menu2[2]=0x00;
				  menu2[6]=0x00;
				  menu2[7]=0x00;
				  break;
				case 13:display_inedx++;menu2[display_inedx]=smg_du[8];set_temp[display_inedx]=8;  break;
				case 14:display_inedx++;menu2[display_inedx]=smg_du[5];set_temp[display_inedx]=5;  break;
				case 15:display_inedx++;menu2[display_inedx]=smg_du[2];set_temp[display_inedx]=2;  break;
				
					
			   } 
			}
			if(display_mode==1)
			{
			    jiaru1=set_temp[1]*10+set_temp[2];
				jiaru2=set_temp[6]*10+set_temp[7];
				if(jiaru1<jiaru2)
				{
				     P2=0X80;P0=~0X02;P2=0X00;
				}
				else
				{
				     P2=0X80;P0=0XFF;P2=0X00;
					 error_flag=0;
				}
			}
			if(temp_type==0)
		   {
		        P2=0Xa0;P0=0X00;P2=0X00;
		   }
		   if(temp_type==1)
		   {
		        P2=0Xa0;P0=0X00;P2=0X00;
		   }
		   if(temp_type==2)
		   {
		        P2=0Xa0;P0=0X10;P2=0X00;
		   }	
		 }
}

void timer0() interrupt 1  using 1                   
{
	static int key_count=0,smg_count=0,led_count=0,i=0;
	key_count++;smg_count++;led_count++;
	if(key_count==10)			//10ms
	{
	 key_count=0;
	 key_flag=1;
	}
	
	if(smg_count==3)		//3ms
	{
			smg_count=0;
			P2=0xc0;P0=0;P2=0;				//???
			if(display_mode==0)
			{
			     P2=0xe0;P0=~menu1[i];P2=0;
			}
			if(display_mode==1)
			{
			     P2=0xe0;P0=~menu2[i];P2=0;
			}
			P2=0xc0;P0=smg_wei[i];P2=0;
			i++;
			if(i==8) i=0;
	}
	if(error_flag==0)
	{
		if(temp_type==0)
		{
			 if(led_count==800)
			 {
			      led_count=0;
			      blink_flag=~blink_flag;
				  if(blink_flag)
				  {
				       P2=0X80;P0=~0X01;P2=0X00;
				  }
				  else
				  {
				       P2=0X80;P0=0XFF;P2=0X00;
				  }
			 }
		}
		if(temp_type==1)
		{
			 if(led_count==400)
			 {
			      led_count=0;
			      blink_flag=~blink_flag;
				  if(blink_flag)
				  {
				       P2=0X80;P0=~0X01;P2=0X00;
				  }
				  else
				  {
				       P2=0X80;P0=0XFF;P2=0X00;
				  }
			 }
		}
		if(temp_type==2)
		{
			 if(led_count==200)
			 {
			      led_count=0;
			      blink_flag=~blink_flag;
				  if(blink_flag)
				  {
				       P2=0X80;P0=~0X01;P2=0X00;
				  }
				  else
				  {
				       P2=0X80;P0=0XFF;P2=0X00;
				  }
			 }
		}
	}
}

 

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值