Аппаратно-программный комплекс контроля параметров в теплице

Системно–алгоритмическая модель аппаратно–программного комплекса автоматического контроля параметров микроклимата теплицы. Программная реализация работы клавиатурной матрицы, измерения влажности и 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

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.