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

📄 system_alarm.c

📁 通过感应器侦测实时温度 然后根据不同的温度进行不同的运行
💻 C
📖 第 1 页 / 共 2 页
字号:
	WriteOneChar(0xBE); 	//读取温度寄存器等(共可读9个寄存器) 前两个就是温度

	delay_18B20(100);

	a=ReadOneChar();    	//读取温度值低位
	b=ReadOneChar();   		//读取温度值高位
	temp1=b<<4;
	temp1+=(a&0xf0)>>4;
	temp2=a&0x0f;

   temp=((b*256+a)>>4);    //当前采集温度值除16得实际温度值


}

/***************液晶显示子函数1正常显示*****************/

void displayfun1(void)
{	
	WriteCommandLCM(0x0c,1);   					 //显示屏打开,光标不显示,不闪烁,检测忙信号	
	DisplayListChar(0,0,str0);	
	DisplayListChar(0,1,str1);	
											    	  
	DisplayOneChar(3,0,hour/10+0x30);		    //液晶上显示小时
	DisplayOneChar(4,0,hour%10+0x30);

	DisplayOneChar(6,0,minite/10+0x30);			//液晶上显示分
	DisplayOneChar(7,0,minite%10+0x30);
	
	DisplayOneChar(9,0,seconde/10+0x30);	    //液晶上显示秒
	DisplayOneChar(10,0,seconde%10+0x30);

	DisplayOneChar(4,1,K/10+0x30);			    //液晶上显示设定的温度
	DisplayOneChar(5,1,K%10+0x30);
 
   	DisplayOneChar(11,1,temp1/10+0x30);         //液晶上显示测得的温度  
	DisplayOneChar(12,1,temp1%10+0x30);
	DisplayOneChar(14,1,temp2/10+0x30);

	if(ON_OFF==0)						      //若温控标志为0
	{
		DisplayOneChar(14,0,0x4f);			   // 液晶上显示不控温的标志
		DisplayOneChar(15,0,0x46);
	}
	else
	{
		DisplayOneChar(14,0,0x4f);			   // 液晶上显示控温的标志
		DisplayOneChar(15,0,0x4e);
		if(outflag==1)
		    DisplayOneChar(0,0,0x7c);			   
	    else
			DisplayOneChar(0,0,0xef);
	}

	
}
/************液晶显示子函数2***************/

void displayfun2(void)
{
	WriteCommandLCM(0x0c,1);                     //显示屏打开,光标不显示,不闪烁,检测忙信号	
	DisplayListChar(0,0,str0);	
	DisplayListChar(0,1,str1);	
		
	DisplayOneChar(6,0,minite/10+0x30);
	DisplayOneChar(7,0,minite%10+0x30);
	
	DisplayOneChar(9,0,seconde/10+0x30);
	DisplayOneChar(10,0,seconde%10+0x30);

	DisplayOneChar(4,1,K/10+0x30);			   
	DisplayOneChar(5,1,K%10+0x30);
 
   	DisplayOneChar(11,1,temp1/10+0x30);         
	DisplayOneChar(12,1,temp1%10+0x30);
	DisplayOneChar(14,1,temp2/10+0x30);

   	WriteCommandLCM(0x0f,1);   					 //显示屏打开,光标显示,闪烁,检测忙信号	
    DisplayOneChar(3,0,hour/10+0x30);
	DisplayOneChar(4,0,hour%10+0x30);
}

/**************液晶显示子函数3*****************/

void displayfun3(void)
{
	WriteCommandLCM(0x0c,1);    				//显示屏打开,光标不显示,不闪烁,检测忙信号	
	DisplayListChar(0,0,str0);	
	DisplayListChar(0,1,str1);	
	
	DisplayOneChar(3,0,hour/10+0x30);
	DisplayOneChar(4,0,hour%10+0x30); 

	DisplayOneChar(9,0,seconde/10+0x30);
	DisplayOneChar(10,0,seconde%10+0x30);

	DisplayOneChar(4,1,K/10+0x30);			   
	DisplayOneChar(5,1,K%10+0x30);

   	DisplayOneChar(11,1,temp1/10+0x30);         
	DisplayOneChar(12,1,temp1%10+0x30);
	DisplayOneChar(14,1,temp2/10+0x30);

   
	WriteCommandLCM(0x0f,1);   					 //显示屏打开,光标显示,闪烁,检测忙信号
	DisplayOneChar(6,0,minite/10+0x30);
	DisplayOneChar(7,0,minite%10+0x30);

}

/**************液晶显示子函数4 *****************/

void displayfun4(void)
{
	WriteCommandLCM(0x0c,1);    				//显示屏打开,光标不显示,不闪烁,检测忙信号	
	DisplayListChar(0,0,str0);	
	DisplayListChar(0,1,str1);	
	
	DisplayOneChar(3,0,hour/10+0x30);
	DisplayOneChar(4,0,hour%10+0x30); 

	DisplayOneChar(6,0,minite/10+0x30);
	DisplayOneChar(7,0,minite%10+0x30);

	DisplayOneChar(9,0,seconde/10+0x30);
	DisplayOneChar(10,0,seconde%10+0x30);

	
   	DisplayOneChar(11,1,temp1/10+0x30);         
	DisplayOneChar(12,1,temp1%10+0x30);
	DisplayOneChar(14,1,temp2/10+0x30);

   
	WriteCommandLCM(0x0f,1);   					 //显示屏打开,光标显示,闪烁,检测忙信号
	DisplayOneChar(4,1,K/10+0x30);			   
	DisplayOneChar(5,1,K%10+0x30);

}

/**************键盘扫描子函数******************/

void keyscan(void)
{
	uchar xx;                                           //局部变量
	P1=0xff;
	if(P1!=0xff)
	  {
	    delay_LCM(50);

		if(P1!=0xff)
		  {	
			xx=P1;
			switch(xx)					               // 根据按键状态,调用不同的子函数
			{
				case 0xfe:set_adj();       break;               
				case 0xfd:inc_key();       break;               
				case 0xfb:dec_key();       break;               
				case 0xf7:ON_OFF=!ON_OFF;  break;
				default:break;
			}
		  }
		
	  }
  
}

/**************设定工作模式子函数****************/

void set_adj(void)
{
	delay_LCM(100);
	set++;
    if(set>=4)set=0;
		
}

/****************按键加法子函数******************/

void inc_key(void)
{
	delay_LCM(100);
		
	switch(set)
	{
		case 0:if(P1==0xf7)ON_OFF=!ON_OFF;       break;
		case 1:hour++;   if(hour>=23)hour=23;    break;
		case 2:minite++; if(minite>=59)minite=59;break;
		case 3:K++;if(K>=99)K=99;				 break; 
		default:break;
	}
		
}

/****************按键减法子函数*****************/

void dec_key(void)
{
	delay_LCM(100);
	
	switch(set)
	{
	   	case 0:if(P1==0xf7)ON_OFF=!ON_OFF;    break;
		case 1:hour--;  if(hour<=0)hour=0;    break;
		case 2:minite--;if(minite<=0)minite=0;break;
		case 3:K--;if(K<=1)K=1;				  break; 
		default:break;
	}
		
}

/***************定时器t0初始化*******************/

void init_timer0(void)
{
	 TMOD=0x01;                                  //time0为定时器,方式1
     TH0=0x3c;                                   //预置计数初值
     TL0=0xb0;
     EA=1;   								
     ET0=1;          											
     TR0=1;          		
}

/***********定时器t0中断子函数**************/

void timer0(void) interrupt 1 using 0          //定时器0方式1,50ms中断一次
{
     TH0=0x3c;
     TL0=0xb0;
     mstcnt++;
     if(mstcnt>=20 )  {seconde++; mstcnt=0; }
	 if(seconde>=60)  {minite++;  seconde=0;}
	 if(minite>=60 )  {hour++;    minite=0; }
	 if(hour>=24   )  {hour=0;}
	 keyscan( );                               //按键扫描
}

/***********the main funtion*************/
    
void main(void)
{ 

    P1=0xff;                                   				//初始化p1口,全设为1       
	delay_LCM(500);	                                        //延时500ms启动
	initLCM( );                               				//LCD初始化
	init_timer0( );	                           				//时钟定时器0初始化	
    Init_DS18B20( ) ;                          				//DS18B20初始化
	DisplayListChar(0,0,str0);	
	DisplayListChar(0,1,str1);  
                     	
    while (1)
    {   
       	keyscan();                                            //按键扫描		
	    ReadTemperature();                                    //温度采集
	    switch(set)                                           //LCD根据工作模式显示
		{
			case 0:displayfun1();delay_LCM(1000);break;       //正常工作显示
			case 1:displayfun2();delay_LCM(1000);break;       //调整时显示
			case 2:displayfun3();delay_LCM(1000);break;       //调整分显示
			case 3:displayfun4();delay_LCM(1000);break; 	  //温度设定
			default:break;
		} 	
		keyscan( );  	                                     //相当于延时
		if(ON_OFF==1)      								     //若温控标志位1, 控制LAMP动作
		{
			if(temp1>=K+1){outflag=1;OUT=0;}
			if(temp1<K)
			{ 
				delay_LCM(1000);
				if(temp1<K){outflag=0;OUT=1;}		        //
			}
		}
		else{outflag=0;OUT=1;}
    }
	
}


⌨️ 快捷键说明

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