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

📄 storagecontrol.c

📁 温湿度监视系统
💻 C
字号:
/**
*  文件说明:仓库温湿度控制系统————主程序
*  作   者:
*  时   间:2009-05-03
*/

#include <reg52.h>
#include "LCD1602.h"
#include "DS18B20.h"
#include "hs1101.h"
#include "storageControl.h"
/*添加还需要的头文件*/


/*********************定义程序变量*********************/
unsigned char temperature;           /*检测温度*/
//unsigned char t_array[5];

unsigned char himidity;               /*检测湿度*/
//unsigned char h_array[4];

unsigned int frequency;              /*检测频率*/
unsigned char count;

unsigned char keyId;                 /*按键号*/

unsigned char sysRun, ParaSet, limitSet;                /*系统运行、设置标志位*/
unsigned char Paratemp;
unsigned char Parat[3];

unsigned char tmax, tmin, hmax, hmin;
unsigned char err_flag;
//extern unsigned int HStable[][2];         /*HS1101经典频率表, 由外部程序进行定义*/

/*主程序开始*/
void main(void)
{
	unsigned char t_array[5];
	unsigned char h_array[4];
	/**/
	initial();
	
	/*进入系统轮回处理*/
	while(1)
	{
		keyId = key_scan();            /*按键扫描*/		
		
		systemSet(keyId);
		
		if (sysRun == 1)
		{		
			monitor();
			
			if (count > 100)      /*1S刷新一次*/
			{
				EA = 0;
				temperature = ReadTemp();                      /*读取温度*/
				EA = 1;
				temp_to_str(&t_array, temperature);            /*将温度转换成可显示的数组*/
			
				frequency = getfreq();                         /*计算频率*/
			
			
				himidity = gethumidity(frequency);   /*读取湿度*/
				himi_to_str(&h_array, himidity);
				
				GotoXY(0, 0);
				Print("Temp: ");
				Print(t_array);		
				delay_ms(10);
				
				GotoXY(0, 1);
				Print("Himi: ");
				Print(h_array);
				delay_ms(10);
				/*
				GotoXY(11, 0);
				Print("key:");
				LCD_Write(1, keyId + 0x30);
				count = 0;
				*/
			}
		}
		//buzzer = ~buzzer;
	}
}

void initial(void)
{
	/*定时器初始化*/
	timerInit();
	
	/*液晶初始化*/
	LCD_Initial();
	GotoXY(0,0);
	Print("Storage Monitor");
	GotoXY(3,1);
	Print("Press MODE");
	
	/*参数初始化*/
	tmax = tMAX;
	tmin = tMIN;
	hmax = hMAX;
	hmin = hMIN;
	
	RUN = 1;
	ERR_MIN = 1;
	ERR_MAX = 1;
	buzzer = 1;
	
	/*其他初始化工作*/
	//sysRun = 1;
	
}

void timerInit(void)
{
	TMOD = 0x51;   /*timer0 方式1计时, timer1方式1计数*/
	TH0 = (65536 - 10000) / 256;
	TL0 = (65536 - 10000) % 256;
	TH1 = 0;
	TL1 = 0;
	RCAP2H = (65536 - 10000) / 256;      //T2自动重载 
	RCAP2L = (65536 - 10000) % 256;
	TH2 = RCAP2H;
	TL2	= RCAP2L;
	ET0 = 1;
	ET1 = 1;
	ET2 = 1;
	EA = 1;
	//TR0 = 1;       /*启动T*/
	//TR1 = 1;
	//TR2 = 1;
}

unsigned int getfreq(void)
{
	unsigned int f;
	
	TH1 = TL1 = 0;      /*计数器1清零*/
	TH0 = (65536 - 10000) / 256;
	TL0 = (65536 - 10000) % 256;
	
	TF0 = 0;            /*清定时器零溢出中断*/
	
	
	TR0 = TR1 = 1;      /*启动*/
	
    while(TF0 != 1);    /*等待定时时间到*/
	
    TR0 = TR1 = 0;      /*定时到, 关中断*/
	
    f = TH1*256 + TL1;  /*计算频率*/
	f *= 100;
	
	return f;
}


unsigned char key_scan(void)
{
	uchar a, b, c, key = 254;
	
	keyPort = 0xf0;
	
	if (keyPort != 0xf0)
	{
		delay_ms(10);
		keyPort = 0xf0;
		if(keyPort != 0xf0)
		{
			a = keyPort;
			keyPort = 0x0f;
			b = keyPort;
			
			c = a | b;
			if(c == 0xee) key = 1;
			if(c == 0xed) key = 2;	   
			if(c == 0xeb) key = 3;	   
			if(c == 0xe7) key = 15;      
			if(c == 0xde) key = 4;
			if(c == 0xdd) key = 5;
			if(c == 0xdb) key = 6;
			if(c == 0xd7) key = 12;
			if(c == 0xbe) key = 7;
			if(c == 0xbd) key = 8;
			if(c == 0xbb) key = 9;
			if(c == 0xb7) key = 14;
			if(c == 0x7e) key = 10;
			if(c == 0x7d) key = 0;
			if(c == 0x7b) key = 11;
			if(c == 0x77) key = 13;
			
			keyPort	= 0xf0;
			while(keyPort != 0xf0);
		}
	}
	return key;
}

void systemSet(unsigned char k)
{
	if (k == MODE)   //进入主模式
	{
		//显示提示
		LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
		delay_ms(10);	
		GotoXY(0,0);
		Print("1. temperature");
		//delay_ms(10);	
		GotoXY(0,1);
		Print("2. humidity");
		//delay_ms(10);
		sysRun = 0;
		ParaSet = 1;
	}
	if (k == ENT)
	{
		//完成设置
		LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
		sysRun = 1;
		TR2 = 1;
	}	
	if (sysRun == 0 && ParaSet == 1)
	{
		while(1)
		{
			keyId = key_scan();
			if (keyId == 1)            //进入温度设置
			{
				LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
				delay_ms(10);	
				GotoXY(0,0);
				Print("tMAX:");
				//delay_ms(10);	
				GotoXY(0,1);
				Print("tMIN:");
				//delay_ms(10);
				
				GotoXY(8,0);
				LCD_SetDisplay(LCD_SHOW|LCD_CURSOR|LCD_FLASH);
				
				limitSet = 0;
				Paratemp = tmax;
				while(1)
				{
					keyId = key_scan();
					if (keyId == UP)        //上限
					{
						GotoXY(7,0);
						tmin = Paratemp;
						limitSet = 0;
					}
					if (keyId == DOWN)         //下限
					{
						GotoXY(7,1);
						tmax = Paratemp;
						limitSet = 1;
					}
					if (keyId == ENT)         //确定退出设置
					{
						if (limitSet == 0)
							tmax = Paratemp;
						if (limitSet == 1)
							tmin = Paratemp;
						
						LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
						//delay_ms(10);
						GotoXY(0,0);
						Print("1. temperature");
						//delay_ms(10);	
						GotoXY(0,1);
						Print("2. humidity");
						delay_ms(10);
						
						break;
					}
					if (keyId < 10)
					{
						Paratemp = Paratemp * 10 + keyId;
					}
					
					//刷新显示
					if (limitSet == 0)
					{
						GotoXY(5,0);
						himi_to_str(&Parat, Paratemp);
						Print(Parat);
						//delay_ms(10);
						GotoXY(5,1);
						himi_to_str(&Parat, tmin);
						Print(Parat);
						//delay_ms(10);
					}
					if (limitSet == 1)
					{
						GotoXY(5,0);
						himi_to_str(&Parat, tmax);
						Print(Parat);
						//delay_ms(10);
						GotoXY(5,1);
						himi_to_str(&Parat, Paratemp);
						Print(Parat);
						//delay_ms(10);
					}
					delay_ms(100);
				}
				
			}
			if (keyId == 2)       //进入湿度设置
			{
				LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
				//delay_ms(10);	
				GotoXY(0,0);
				Print("hMAX:");
				//delay_ms(10);	
				GotoXY(0,1);
				//Print("hMIN:");
				delay_ms(10);
				
				GotoXY(8,0);
				LCD_SetDisplay(LCD_SHOW|LCD_CURSOR|LCD_FLASH);
				
				limitSet = 0;
				Paratemp = hmax;
				while(1)
				{
					keyId = key_scan();
					if (keyId == UP)        //上限
					{
						GotoXY(7,0);
						hmin = Paratemp;
						limitSet = 0;
					}
					if (keyId == DOWN)         //下限
					{
						GotoXY(7,1);
						hmax = Paratemp;
						limitSet = 1;
					}
					if (keyId == ENT)         //确定退出设置
					{
						if (limitSet == 0)
							hmax = Paratemp;
						if (limitSet == 1)
							hmin = Paratemp;
						
						LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
						//delay_ms(10);						
						GotoXY(0,0);
						Print("1. temperature");
						//delay_ms(10);	
						GotoXY(0,1);
						Print("2. humidity");
						//delay_ms(10);
						
						break;
					}
					if (keyId < 10)
					{
						Paratemp = Paratemp * 10 + keyId;
					}
					
					//刷新显示
					if (limitSet == 0)
					{
						GotoXY(5,0);
						himi_to_str(&Parat, Paratemp);
						Print(Parat);
						//delay_ms(10);
						GotoXY(5,1);
						himi_to_str(&Parat, tmin);
						Print(Parat);
						//delay_ms(10);
					}
					if (limitSet == 1)
					{
						GotoXY(5,0);
						himi_to_str(&Parat, tmax);
						Print(Parat);
						//delay_ms(10);
						GotoXY(5,1);
						himi_to_str(&Parat, Paratemp);
						Print(Parat);
						//delay_ms(10);
					}
					delay_ms(100);
				}
				
			}
			if (keyId == ENT)
			{
				if (limitSet == 0)
					tmax = Paratemp;
				if (limitSet == 1)
					tmin = Paratemp;
				
				LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);   //清屏
				//delay_ms(10);
				LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR|LCD_NO_FLASH);
				break;
			}
			delay_ms(100);
		}
	}	
	
}


void monitor(void)
{
	if (temperature < tmin)
		err_flag = err_flag | 0x01;
	else if (temperature > tmax)
		err_flag = err_flag | 0x02;
	else
		err_flag = err_flag & 0xfc;
	
	if (himidity < hmin)
		err_flag = err_flag | 0x04;
	else if (himidity > hmax)
		err_flag = err_flag | 0x08;
	else
		err_flag = err_flag & 0xf3;
	
	if (err_flag != 0)
	{
		GotoXY(0,1);
		if (err_flag == 1)
		{
			ERR_MIN = 0;
		}
		if (err_flag == 2)
		{
			ERR_MAX = 0;
		}
		if (err_flag == 4)
		{
			ERR_MAX = 0;
		}
		if (err_flag == 8)
		{
			ERR_MAX = 0;
		}
		buzzer = ~buzzer;
		RUN = 1;
	}
	else
	{
		RUN = 0;
		ERR_MIN = 1;
		ERR_MAX = 1;
		buzzer = 1;
	}
}


void Timer2_Server(void) interrupt 5 using 1
{            
	TF2=0;     /*T2定时器发生溢出中断时,需要用户自己清除溢出标记,而51的其他定时器是自动清除的 */                           

	count++;
	RUN = ~RUN;
	
}












⌨️ 快捷键说明

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