Аппаратно-программный комплекс контроля параметров в теплице
Системно–алгоритмическая модель аппаратно–программного комплекса автоматического контроля параметров микроклимата теплицы. Программная реализация работы клавиатурной матрицы, измерения влажности и 1-Wire интерфейса для связи с цифровым термометром.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 02.02.2016 |
Размер файла | 920,1 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
unsigned int Set_Turn_Data=0;
unsigned int Set_Period_Data=0;
unsigned int copy_param;
unsigned int period_ind_set;
unsigned int Cur_Turn_Data = 0;
unsigned int Cur_Period_Data = 0;
unsigned int Cur_Water_Data = 0;
void Button_Enter(void)
{
period_ind_set = 30;
switch (state_mode)
{
case MODE_INDICATOR:
state_mode = MODE_SETUP;
switch(menu_mode)
{
case MENU_TERMO:
copy_param = Set_Termo_Data;
Str_Menu(Set_Termo_Data); // вывести на индикатор
break;
case MENU_WATER:
copy_param = Set_Water_Data;
Str_Menu(Set_Water_Data); // вывести на индикатор
break;
case MENU_TURN:
copy_param = Set_Turn_Data;
Str_Menu(copy_param << 4); // вывести на индикатор
break;
case MENU_PERIOD:
copy_param = Set_Period_Data;
Str_Menu(copy_param << 4); // вывести на индикатор
break;
}
break;
case MODE_SETUP:
state_mode = MODE_INDICATOR;
switch(menu_mode)
{
case MENU_TERMO:
Set_Termo_Data = copy_param;
Str_Menu(Cur_Termo_Data);// вывести на индикатор
break;
case MENU_WATER:
Set_Water_Data = copy_param;
Str_Menu(Cur_Water_Data);// вывести на индикатор
break;
case MENU_TURN:
Set_Turn_Data = copy_param;
Cur_Turn_Data = Set_Turn_Data;
Str_Menu(copy_param << 4); // вывести на индикатор
break;
case MENU_PERIOD:
Set_Period_Data = copy_param;
Cur_Period_Data = 0;
Str_Menu(copy_param << 4); // вывести на индикатор
break;
}
break;
}
}
void Button_Left(void)
{
unsigned int data;
period_ind_set = 30;
switch (state_mode)
{
case MODE_INDICATOR:
menu_mode--;
menu_mode &= 0x03;
switch(menu_mode)
{
case MENU_TERMO:
Str_Menu(Cur_Termo_Data); // вывести на индикатор
break;
case MENU_WATER:
Str_Menu(Cur_Water_Data); // вывести на индикатор
break;
case MENU_TURN:
Str_Menu(Set_Turn_Data << 4); // вывести на индикатор
break;
case MENU_PERIOD:
Str_Menu(Set_Period_Data << 4); // вывести на индикатор
break;
}
break;
case MODE_SETUP:
switch (menu_mode)
{
case MENU_TERMO:
data = copy_param >> 4;
data++;
if (data > 38) data = 20;
copy_param = (copy_param && 0x000F) + (data << 4);
Str_Menu(copy_param); // вывести на индикатор
break;
case MENU_WATER:
data = copy_param;
if (data >= 5) data = data - 5;
if (data < 5) data = 0;
copy_param = data;
Str_Menu(copy_param << 4); // вывести на индикатор
break;
case MENU_TURN:
data = copy_param;
if (data >=2) data = data - 2;
if (data < 2) data = 0;
copy_param = data;
Str_Menu(copy_param << 4); // вывести на индикатор
break;
case MENU_PERIOD:
data = copy_param;
if (data >= 1) data = data - 1;
if (data < 1) data = 0;
copy_param = data;
Str_Menu(copy_param << 4); // вывести на индикатор
break;
}
break;
}
}
void Button_Right(void)
{
unsigned char data;
period_ind_set = 30;
switch (state_mode)
{
case MODE_INDICATOR:
menu_mode++;
menu_mode &= 0x03;
switch(menu_mode)
{
case MENU_TERMO:
Str_Menu(Cur_Termo_Data); // вывести на индикатор
break;
case MENU_WATER:
break;
case MENU_TURN:
Str_Menu(Set_Turn_Data << 4); // вывести на индикатор
break;
case MENU_PERIOD:
Str_Menu(Set_Period_Data << 4); // вывести на индикатор
break;
}
break;
case MODE_SETUP:
switch (menu_mode)
{
case MENU_TERMO:
data = copy_param & 0x00F;
data = Tab_Code_Dec[data];
data++;
if (data > 9) data = 0;
data = Tab_Dec_Code[data];
copy_param = (copy_param && 0x0FF0) + data;
Str_Menu(copy_param); // вывести на индикатор
break;
case MENU_WATER:
data = copy_param;
data = data + 5;
if (data >= 100){
data = 100;
Str_Menu(99 << 4); // вывести на индикатор
}else{
Str_Menu(data << 4); // вывести на индикатор
}
copy_param = data;
break;
case MENU_TURN:
data = copy_param;
if (data > 22) data = 22;
copy_param = data;
Str_Menu(copy_param << 4); // вывести на индикатор
break;
case MENU_PERIOD:
data = copy_param;
if (data > 22) data = 22;
copy_param = data;
Str_Menu(copy_param << 4); // вывести на индикатор
break;
}
break;
}
}
//******************************************************************************
// file task.h
//******************************************************************************
#ifndef TASK_H
#define TASK_H
//коды событий
#define TASK_NULL 0
#define TASK_TERMO 1
#define TASK_WATER 2
#define TASK_TURN 3
#define TASK_PERIOD 4
#define state_incub 1
#define NULL (void *)0
#define SIZE_BUF 16 //вместимость буфера/очереди событий
extern unsigned char currentState;
extern void TaskInit(void); //инициализация
extern unsigned char GetTask(void); //взять код события
extern void PlaceTask(unsigned char event); //разместить событие
extern void Dispatch(unsigned char event); //вызов диспетчера
extern unsigned int turnoff;
#define termooff BIT1
#define termodir BIT2
#define vaporizer BIT3
#define turnings BIT4
#define signal BIT5
#define controller P2OUT
#endif
//******************************************************************************
// file task.c
// процедуры управления кольцевым буфером
// дитспетчер задач и облуживаемые им подпрограммы
//******************************************************************************
#include "task.h"
#include "main.h"
#include "DS1820.h"
#include "PCF8812.h"
void Termostat(void);
void Moisture(void);
void Turning(void);
void Period(void);
void StopTask(void);
void Setsignal(void);
void Stopsignal(void);
//кольцевой буфер
static volatile unsigned char cycleBuf[SIZE_BUF];
static volatile unsigned char tailBuf = 0;
static volatile unsigned char headBuf = 0;
static volatile unsigned char countBuf = 0;
unsigned char GetTask(void)
{
unsigned char event;
if (countBuf > 0){ //если приемный буфер не пустой
event = cycleBuf[headBuf]; //считать из него событие
countBuf--; //уменьшить счетчик
headBuf++; //инкрементировать индекс головы буфера
if (headBuf == SIZE_BUF) headBuf = 0;
return event; //вернуть событие
}
return 0;
}
void PlaceTask(unsigned char event)
{
if (countBuf < SIZE_BUF){ //если в буфере еще есть место
cycleBuf[tailBuf] = event; //кинуть событие в буфер
tailBuf++; //увеличить индекс хвоста буфера
if (tailBuf == SIZE_BUF) tailBuf = 0;
countBuf++; //увеличить счетчик
}
}
unsigned char currentState = 0;
struct ROW_TABLE
{
unsigned char state; // состояние
unsigned char event; // событие
void (*pStateFunc)(void);
};
void TaskInit(void)
{
tailBuf = 0;
headBuf = 0;
countBuf = 0;
currentState = 0;
}
void EmptyFunc(void)
{
}
const struct ROW_TABLE table[] = {
// STATE EVENT STATE_FUNC
{state_incub, TASK_TERMO, Termostat},
{state_incub, TASK_WATER, Moisture},
{state_incub, TASK_TURN, Turning},
{state_incub, TASK_PERIOD, Period},
{ 0 , TASK_TERMO, StopTask},
{ 0 , 0 , EmptyFunc}
};
void Dispatch(unsigned char currentEvent)
{
unsigned char i;
for (i=0; table[i].state; i++){
if (table[i].state == currentState && table[i].event == currentEvent){
table[i].pStateFunc();
break;
}
}
}
unsigned int TermRead(void)
{
Rout_DS1820(); // получить данные от датчика
if (state_mode == MODE_INDICATOR){// если в режиме текущих показаний
if (menu_mode == MENU_TERMO){// температуры ,
Str_Menu(Cur_Termo_Data);// вывести на индикатор
}
}
return(Cur_Termo_Data);// вернуть текущие данные для обработки
}
void Termostat(void)
{
unsigned int temp = TermRead();
if (temp < (Set_Termo_Data - 0x008)){// сигнализировать если меньше на 0,5
Setsignal();
}else Stopsignal();
if (temp > (Set_Termo_Data + 0x008)){// сигнализировать если больше на 0,5
Setsignal();
}else Stopsignal();
if (temp < Set_Termo_Data){ // если меньше заданной
controller enable (termodir + termooff);// включить модуль на нагрев
}else{ // если не меньше
if (temp > Set_Termo_Data){ // если больше заданной
controller disable termodir; // направление на охлаждение
controller enable termooff; // включить модуль
}else{ // если равна заданной
controller disable (termodir + termooff);// если равна выключить
}
}
}
void Moisture(void)
{
unsigned long Temp;
ADC10CTL0 |= ENC + ADC10SC; // старт выборки и преобразования
_BIS_SR(CPUOFF + GIE); // ожидание окончания преобразования
Temp = ADC10MEM;
Temp = (Temp * 100) / 0x3FF; // измеренное значение в процентах
Cur_Water_Data = Temp & 0x00FF;
if (Set_Water_Data >= 5){
if (Cur_Water_Data < Set_Water_Data - 4){// сигнал
Setsignal();
}else Stopsignal();
if (Cur_Water_Data > Set_Water_Data + 4){// сигнал
Setsignal();
}else Stopsignal();
if (Cur_Water_Data < Set_Water_Data){// если влажность мала
controller enable vaporizer; // включить испаритель
}else{ // если велика
controller disable vaporizer; // выключить
}
}
}
unsigned int turnoff;
void Turning(void)
{
if (Cur_Turn_Data > 0){ // если установлен интервал
Cur_Turn_Data--; // уменьшить
if (Cur_Turn_Data == 0){ // если время вышло
Cur_Turn_Data = Set_Turn_Data;// востановить интервал
controller enable turnings; // включить двигатель
turnoff = 5; // время включенного состояния
}
}
}
void Period(void)
{
Cur_Period_Data++; // увеличить текущий день
if (Cur_Period_Data > Set_Period_Data){// если период инкубации окончен
Set_Period_Data = 0; // сбросить установку
currentState =0; // выключить активный режим
}
}
void StopTask(void)
{
controller disable (turnings+vaporizer+termooff);// все исполнительные устройства выключить
unsigned int Temp = TermRead();// индикация текущей температуры
}
void Setsignal(void)
{
TACCR2 = TAR + TCOMP(500);
TACCTL2 |= CCIE; // разрешить прерывание таймера А2
}
void Stopsignal(void)
{
TACCTL2 &= ~CCIE; // запретить прерывание таймера А2
controller disable signal;
}
Размещено на Allbest.ru
Подобные документы
Разработка аппаратно-программного комплекса для осуществления идентификации объектов управления на основе вещественного интерполяционного метода. Анализ работоспособности аппаратно-программного комплекса, пример идентификации объекта управления.
магистерская работа [2,2 M], добавлен 11.11.2013Обзор разнообразных методов теории линейных систем: методов корреляционного и регрессионного анализа, косинор-анализа. Особенности применения факторного анализа. Программная реализация метода главных компонент. Разработка нелинейных регрессионных моделей.
дипломная работа [390,2 K], добавлен 03.09.2016Вычисление вероятности безотказной работы микропроцессорного устройства, блока оперативной памяти, внешнего запоминающего устройства, программного обеспечения, работы оператора. Определение средней наработки на отказ аппаратно-программного комплекса.
контрольная работа [537,8 K], добавлен 07.07.2012Создание электронного учебника "Визуальные и не визуальные компоненты Delphi". Основные требования к организации интерфейса. Логическая структура и технические средства. Аппаратно–программный комплекс. Применение программы, тестирование и отладка.
курсовая работа [39,5 K], добавлен 03.12.2012Анализ аппаратно-программных средств для проекта системы удаленного контроля состояния объекта на основе модулей фирмы Advantech. Техническая характеристика программируемых контроллеров. Информационный расчёт системы, моделирование работы отдельных узлов.
дипломная работа [3,4 M], добавлен 24.01.2016Однопроводной интерфейс 1-Wire, разработанный фирмой Dallas Semiconductor Corp как информационная сеть, использующаяся для осуществления цифровой связи одну линию данных и один возвратный провод. Физическая реализация интерфейса и передача данных в сети.
реферат [204,4 K], добавлен 04.03.2009Анализ методов и средств контроля доступа к файлам. Проблемы безопасности работы с файлами, средства контроля доступа ним. Идеология построения интерфейса, требования к архитектуре. Работа классов системы. Оценка себестоимости программного продукта.
дипломная работа [2,5 M], добавлен 21.12.2012Проектирование аппаратно-программного комплекса оповещения населения по сигналам гражданской обороны и чрезвычайной ситуации на ПАО "Севералмаз". Настройка и программирование системы оповещения. Выбор оборудования. Настройка картографии и карты сети.
дипломная работа [2,8 M], добавлен 20.03.2017Формирование входных и выходных данных, SQL–скрипт генерации таблиц базы данных. Создание интерфейса программного приложения и проектирование форм базы данных. Требования к аппаратно–программному обеспечению. Инструкции по установке и эксплуатации.
курсовая работа [1,6 M], добавлен 08.02.2013Выбор базовых программных средств для разработки оригинального программного обеспечения. Компоненты программно-методического комплекса проектирования токарных операций. Программное обеспечение для организации интерфейса программно-методического комплекса.
дипломная работа [2,8 M], добавлен 14.05.2010