📄 storagecontrol.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 + -