?? 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 + -