Регистратор контроля параметров технологического процесса

Разработка системы контроля состояния параметров технологического процесса, обеспечивающего контроль термосопротивлений с различными диапазонами. Использование каналов с транзисторными ключами и звукового индикатора превышения установленных диапазонов.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 26.12.2012
Размер файла 1,2 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Содержание

Техническое задание

1. Описание функциональной схемы

2. Разработка принципиальной схемы

2.1 Выбор микроконтроллера

2.2 Выбор датчиков

3. Разработка программы управления

3.1 Общее описание работы программы

3.2 Описание используемых интерфейсов

Заключение

Приложение

Техническое задание

Необходимо разработать систему контроля состояния параметров технологического процесса, обеспечивающую контроль 8 термосопротивлений с диапазонами температур 0°-300° и 8 термосопротивлений с диапазоном температур -50°-+150°.

Для обеспечения интерфейса необходимо установить клавиатуру на 4 клавиши.

Для индикации использовать ЖК индикатор, который имеет 2 строки по 32 символа, что позволяет одновременно отображать несколько параметров.

Для обеспечения контроля температуры необходимо выбрать соответствующий тип термосопротивлений.

В качестве исполнительных устройств используются два канала с транзисторными ключами и звуковой индикатор превышения установленных диапазонов.

Вся информация передается автоматически на удаленный компьютер по RS485 интерфейсу и фиксируется в ПЗУ микроконтроллера.

В дальнейшем информация может быть просмотрена на индикаторе.

Также могут быть заданы необходимые параметры времени, режим калибровки системы. Опрос ведется с частотой задаваемой пользователем с привязкой к реальному времени.

термосопротивление диапазон транзисторный индикатор

1. Описание функциональной схемы

Рис.1. Функциональная схема

БК - блок клавиатуры, блок многофункциональных клавиш, которые используют специальные микросхемы.

Т1-Т9 - цифровые датчики температуры.

Т9-Т18 - аналоговые датчики температуры, реализованные с помощью термосопротивлений.

АЦП1, АЦП2 - аналогово-цифровые преобразователи, преобразовывающие измеряемую аналоговую величину в цифровой сигнал.

НУ1-НУ8 - нормирующие усилители, усиливающие сигналы с аналоговых датчиков температуры и передающие эти сигналы на входы АЦП.

МК - управляющий контроллер

LCD - жидкокристаллический, буквенно-цифровой, построчный индикатор, на который выводится вся информация.

ЗИПУД - звуковой индикатор превышения установленных диапазонов, динамик подающий звуковой сигнал при превышении уровня допустимых температур.

ФПЗУ - флеш ПЗУ, на которой фиксируются полученные при измерении данные.

БСУК - блок связи с удаленным компьютером, передает данные полученные при измерении на удаленный компьютер по RS485 интерфейсу.

При включении регистратора через клавиатуру выбирается режим: режим калибровки или режим измерения, задаются параметры времени (если необходимо изменить уже заданные параметры). При выборе режима калибровки осуществляется единичное измерение температуры на всех датчиках, полученные данные программно сравниваются с данными введенными пользователем, и осуществляется подстройка значений таблицы сопоставления напряжения и температуры. При выборе режима измерения в соответствии с заданными интервалами времени происходит цикличное измерение температуры на всех датчиках в соответствии с заданной последовательностью опроса датчиков. Каждый раз после получения данных они записываются во флеш-ПЗУ, отправляются на удаленный компьютер и отображаются на LCD-дисплее по требованию пользователя. Если полученные значения температур превышают заранее заданный критический уровень подается звуковой сигнал через динамик.

2. Разработка принципиальной схемы

2.1 Выбор микроконтроллера

Для обеспечения использования наиболее подходящего контроллера оптимально рассмотреть несколько различных контроллеров, удовлетворяющих следующим требованиям:

· 8-ми разрядный,

· с низким энергопотреблением,

· наличие статичного режима,

· гарвардская архитектура,

Мною были выбраны контроллеры следующих серий: AVR (ATiny2313), PIC (16C745), MK-51 (AT89C4051). В каждой серии выбирается примерно аналогичных по характеристикам контроллеры сравниваются их параметры и оценивается на сколько они подходят для оценивания конкретной задачи. Информация о выбранных микроконтроллерах для удобства представлена в таблице, наглядно показывающей различия между ними:

AVR (ATiny2313)

PIC (16C745)

MK-51 (AT89S4051)

ПЗУ (память программ)

2 Кб

8 Кб

4 Кб

Таймеры/счетчики

1(8 разрядов)

1(16 разрядов)

2(16 разрядов)

2(16 разрядов)

Число портов ввода/вывода

18

22

32

Питание

2,7-5,5

2,0-5,5

4,0-5,5

Архитектура

RISC

RISC

CISC

Тактовая частота

20МГц

24МГц

24МГц

Режим экономии энергии

Idle, Power-down, Standby

Sleep

Idle, Power-down

Память данных

128 байт

256 байт

128 байт

Стоимость

50 руб.

300 руб.

50

AVR-микроконтроллер фирмы Атмел - это 8-разрядные RISC микроконтроллер для встраиваемых приложений. Они привлекают внимание наилучшим соотношением показателей быстродействие/энергопотребление, удобными режимами программирования, доступностью программно-аппаратных средств поддержки и широкой номенклатурой выпускаемых кристаллов. Микроконтроллеры обычно поставляются со стертыми встроенными FLASH и EEPROM блоками памяти (содержимое всех ячеек = $FF), готовыми к программированию. Улучшенная RISC (enhanced RISC) архитектура AVR-микроконтроллеров объединяет в себе комплекс решений, направленных на повышение быстродействия микропроцессорного ядра AVR. Арифметико-логическое устройство (ALU), в котором выполняются все вычислительные операции, имеет доступ к 32-м оперативным регистрам, объединенным в регистровый файл. Выборка содержимого регистров, выполнение операции и запись результата обратно в регистровый файл выполняются за один машинный цикл. Большинство встраиваемых микроконтроллеров имеют только один такой регистр, непосредственно доступный ALU, - аккумулятор, что требует включения в программу дополнительных команд его загрузки и считывания. В качестве контроллера рассмотрим ATiny2313, представляющий собой 8-битовый микроконтроллер, имеющий, следующие характеристики: построен на основе расширенной RISC-архитектуры; 2К загружаемой флэш-памяти; 32 рабочих регистра; 2 таймера/счетчика; 128 байтов EEPROM; 15 линий ввода/вывода общего назначения; внешние и внутренние прерывания; встроенный последовательный порт.

Альтернативой может быть контроллер другой серии например PIC 16С745. PIC16F84 - это 8-pазpядные микpоконтpоллеpы с RISC аpхитектуpой, производимые фирмой Microchip Technology. Это семейство микpоконтpоллеpов отличается низким энеpгопотpеблением и высокой скоростью. Микpоконтpоллеpы имеют встроенное ЭППЗУ пpогpамм, ОЗУ данных и выпускаются в 20 выводных корпусах. Память данных (ОЗУ) имеет pазpядность 8 бит, память пpогpамм (ППЗУ) для PIC16C84 14. Использование Гаpваpдской аpхитектуpы позволяет достичь высокой скорости выполнения битовых, байтовых и pегистpовых операций.

МК семейства МК-51 используют гарвардскую архитектуру. Классический микроконтроллер семейства 51 и его улучшенная модификация 52 серии имеет следующие данные: целочисленный 8-разрядный CISC-процессор, использование CISK архитектуры позволяет упростить программу за счет поддержки команд умножения и деления; тактовая частота до 80 МГц; командный цикл до 12 тактов; раздельные адресные пространства программ и данных; встроенная память программ объёмом 2-64 кб; встроенное ОЗУ данных объёмом 128б-64Кб; 40 выводов, 32 линии ввода-вывода; два или 4 8/16-разрядных таймера; последовательный порт RS-232; возможность подключения внешней памяти программ и данных, до 64 кб каждая (некоторые модели до 4Мб); режим пониженного энергопотребления.

Различные модификации дополнительно имеют возможность работы с интерфейсами SPI, I2C, USB.

Обоснование выбора контроллера

Для данной задачи - разработки регистратора параметров технологического процесса - микроконтроллер семейства МК-51 является оптимальным, так как сочетает в себе большие возможности управления, необходимые для решения поставленной мной задачи. Кроме того по существенным параметрам: число портов ввода вывода (32), архитектура (CISC) - микроконтроллер MCS-51 АТ89C4051 превосходит микроконтроллеры подобных серий других производителей. Кроме того микроконтроллер серии МК-51 не уступает микроконтролерам AVR и PIC также в таких параметрах как: число таймеров счетчиков (2), тактовая частота (до 24 МГц), режимы экономии энергии(Idle, Power-down). А так же при серийном выпуске данного изделия большую роль будет играть его малая стоимость и высокая надежность работы.

Немаловажен тот факт, что архитектура данного контролера мной изучена в курсе лабораторных работ. А также важно, что у меня имеются средства программирования и средство моделирования элементов программы - лабораторный стенд на ADUC812

Краткие характеристики контроллера MCS-51 АТ89S2051:

Для использования в данном устройстве мной был выбран микропроцессор АТ89S2051 серии MSC-51.

Он обладает высокими техническими характеристиками:

1. Частота работы от 0 до 24МГц.

2. Объем встроенного флешь ПЗУ - 4КБ.

3. Объем регистрового ОЗУ 128 байт.

4. Два счетчика 16ти разрядных счетчика\таймера.

5. Порт выдерживает нагрузку до 20мА.

6. Число портов ввода вывода 32(оставлены порты P1 и P3).

7. Котроллер поставляется в сорокавыводном корпусе.

8. Напряжения питания от 5В +-20% (номинальное 5В).

Все выше сказанное позволяет реализовать требуемые функции и существенно упростить схему.

Распиновка выводов контроллера представлена на рис.2.

Рис.2. Разводка выводов контроллера и соответствие портам.

Обозначения:

· GND -- потенциал общего провода ("земли");

· Vcc -- основное напряжение литания +5 В;

*XTAL1,XTAL2 -- выводы для подключения кварцевого резонатора;

· RST -- вход общего сброса микроконтроллера;

· P1 -- восьми битный квази двунаправленный порт ввода/вывода: каждый разряд порта может быть запрограммирован как на ввод, так и на вывод информации, независимо от состояния других разрядов;

· РЗ -- восьми битный квази двунаправленный порт, аналогичный. Р1; кроме того, выводы этого порта могут выполнять ряд альтернативных функций, которые используются при работе таймеров, порта последовательного ввода-вывода, контроллера прерываний, и внешней памяти программ и данных;

Рис.3. Структурная схема АТ89C4051.

2.2 Выбор датчиков

Выбор датчика температуры и описание протокола обмена.

В качестве датчика температуры рассмотрен вариант реализации DS18B20. Они обеспечивают точность до 0.1, что позволяет использовать их в качестве надежного средства измерения. Не требуется АЦП, они сами преобразуют данные в цифровой вид. Подключение можно выполнить на одну двухпроводную линию, это возможно за счет того, что они обеспечивают возможность адресного обращения и питания по линии связи.

Отличительные особенности датчика DS18B20: микросхема цифрового термометра DS18S20, обеспечивает измерение температуры в диапазоне -55..+125°C с дискретностью 0.5°C; с помощью дополнительных вычислений дискретность представления температуры можно уменьшить, в нашем случае она равна 0.1°C; DS18S20 допускает напряжение питания от +3 до +5.5В. .

Каждая микросхема DS18B20 имеет уникальный и неизменяемый 64 битный серийный номер, который используется как узловой адрес датчика. Это позволяет множеству микросхем DS18B20 сосуществовать на одной 1 проводной шине. Для DS18S20 температура представляется в виде 9-битного значения в дополнительном коде. Поскольку это значение занимает 2 байта, все разряды старшего байта равны знаковому разряду.

Рис. 4. Внешний вид микросхемы цифрового термометра DS18S20.

Рис.5. Разводка выводов микросхемы цифрового термометра DS18S20.

Обозначения:

· GND -- потенциал общего провода ("земли");

· Vcc -- основное напряжение литания +5 В;

· DQ - ввод/вывод данных

· NC - не соединены

Контроллер полностью управляет обменом. Все пересылки начинаются с процесса инициализации. Инициализация производится в следующей последовательности (рис.6 ):

Рис.6. Инициализация обмена по 1-проводной шине.

Контроллер посылает импульс сброса (reset pulse) - сигнал низкого уровня длительностью не менее 480 мкс. За импульсом сброса следует ответ подчиненного устройства (presence pulse) - сигнал низкого уровня длительностью 60 - 240 мкс, который генерируется через 15 - 60 мкс после завершения импульса сброса.

Ответ подчиненного устройства даёт контроллеру понять, что на шине присутствует датчик температуры и он готов к обмену. После того, как контроллер обнаружил ответ, он может передать датчику одну из команд. Передача ведётся путём формирования контроллером специальных временных интервалов (time slots). Каждый временной интервал служит для передачи одного бита. Первым передаётся младший бит. Интервал начинается импульсом низкого уровня, длительность которого лежит в пределах 1 - 15 мкс. Поскольку переход из единицы в ноль менее чувствителен к ёмкости шины (он формируется открытым транзистором, в то время как переход из ноля в единицу формируется подтягивающим резистором), именно этот переход используют 1-проводные устройства для синхронизации с контроллером. В подчиненном устройстве запускается схема временной задержки, которая определяет момент считывания данных. Номинальное значение задержки равно 30 мкс, однако, оно может колебаться в пределах 15 - 60 мкс. За импульсом низкого уровня следует передаваемый бит. Он должен удерживаться контроллером на шине в течение 60 - 120 мкс от начала интервала. Временной интервал завершается переводом шины в состояние высокого уровня на время не менее 1 мкс. Нужно отметить, что ограничение на это время сверху не накладывается. Аналогичным образом формируются временные интервалы для всех передаваемых битов:

Рис.7. Передача бита нуля/единицы

Первой командой, которую должен передать контроллер для DS18S20 после инициализации, является одна из команд функций ПЗУ.

При приеме данных от подчиненного устройства временные интервалы для принимаемых битов тоже формирует контроллер. Интервал начинается импульсом низкого уровня длительностью 1 - 15 мкс. Затем контроллер должен освободить шину, чтобы дать возможность термометру вывести бит данных. По переходу из единицы в ноль DS18S20 выводит на шину бит данных и запускает схему временной задержки, которая определяет, как долго бит данных будет присутствовать на шине. Это время лежит в пределах 15 - 60 мкс. Для того чтобы данные на шине, которая всегда обладает некоторой ёмкостью, гарантированно установились, требуется некоторое время. Поэтому момент считывания данных контроллером должен отстоять как можно дальше, но не более чем на 15 мкс от начала временного интервала:

Рис. 8. Чтение бита по 1-проводной шине.

Прием байта начинается с младшего бита. Вначале идет байт кода семейства. За кодом семейства идет 6 байт серийного номера, начиная с младшего.

После обработки одной из команд функций ПЗУ, DS18S20 способен воспринимать еще несколько команд:

· Write Scratchpad [4Eh]. Эта команда позволяет записать данные в промежуточное ОЗУ DS18S20.

· Read Scratchpad [BEh]. Эта команда позволяет считать данные из промежуточного ОЗУ.

· Convert T [44h]. Эта команда запускает процесс преобразования температуры.

· Recall E2 [B8h]. Эта команда действует обратным образом по отношению к команде Copy Scratchpad, т.е. она позволяет считать байты TH и TL из энергонезависимой памяти в промежуточное ОЗУ. При включении питания эта команда выполняется автоматически.

При использовании DS18S20 только для измерения температуры нужны всего две из этих команд: Convert T и Read Scratchpad.

Последовательность действий при измерении температуры должна быть следующей:

Посылаем импульс сброса и принимаем ответ термометра.

Посылаем команду Skip ROM [CCh].

Посылаем команду Convert T [44h].

Формируем задержку минимум 750мс.

Посылаем импульс сброса и принимаем ответ термометра.

Посылаем команду Skip ROM [CCh].

Посылаем команду Read Scratchpad [BEh].

Читаем данные из промежуточного ОЗУ (8 байт) и CRC.

Проверяем CRC, и если данные считаны, верно, вычисляем температуру.

Расчет мостовой схемы для каналов измерения от -50 до 150°С.

В качестве первичного преобразователя в канале измерения температуры от -50 до 150°С был выбран медный термометр сопротивления ТСМ 9418-75 (взрывозащищенный), предназначенный для измерения температуры жидких и газообразных сред во взрывоопасных зонах, в которых может содержаться аммиак, азотоводородная смесь, углекислый газ и его компоненты, а также агрессивные примеси сероводорода и сернистого ангидрида в допустимых пределах по ГОСТ 12 1 005. Мостовая схема питается напряжением от источника опорного напряжения AD588.

Рис.9. Разводка выводов микросхемы АЦП AD588.

Номинальная статическая характеристика термосопротивления ТСМ 9418-75 представлена на рисунке 10:

Рис. 10. Номинальная статическая характеристика ТСМ 100М

При расчете медных проводников в диапазоне от -50 до +180°С можно пользоваться формулой:

,

где [ ].

Отсюда

Ом,

Ом,

Тогда

Ом.

Для измерения температуры будем использовать измерительную мостовую схему, основанную на методе отклонения.

Для повышения чувствительности обычно используется измерительная равноплечая мостовая схема:

[ ].

Для обеспечения заданной точности измерения используются резисторы С2-29 с допуском ±0,05%. Номиналы резисторов выбираем из ряда Е192. Т.о. резисторы , , : С2-29В-0,125-100 Ом±0,05%.

При изменении сопротивления подводящих проводов (при измерении температуры) появляется ошибка. Для устранения этого недостатка используется схема подключения термометра сопротивления, представленная на рисунке 2.3.

Рис. 11. Мостовая схема

Произведем расчет подводящих проводов:

- длина подводящих проводов;

- удельное сопротивление меди;

.

Сопротивление подводящих проводов:

Ом.

Из расчета видно, что сопротивление подводящих проводов пренебрежимо мало.

Произведем расчет мостовой схемы:

Из рисунка 2.3 видно, что выходное напряжение мостовой схемы является разностью потенциалов точек 1 и 2, которые можно вычислить, рассчитав два делителя напряжения.

1) Делитель напряжения 1 представлен на рисунке 2.4.

Рис.12. Делитель напряжения 1

;

Отсюда

=5 В.

2) Делитель напряжения 2 представлен на рисунке 2.5.

Рис.13 . Делитель напряжения 2

;

Рассчитаем предельные значения напряжения при температурах -50°С и 150°С:

;

,

Т.о. напряжение разбаланса моста:

.

В качестве нормирующего усилителя выбран инструментальный усилитель (усовершенствованный дифференциальный усилитель). Такой усилитель имеет высокие входные сопротивления по обоим входам и обеспечивают установку заданного коэффициента усиления с помощью одного изменяемого сопротивления. Дифференциальный усилитель на трех ОУ обеспечивает более высокий коэффициент подавления синфазного сигнала.

Коэффициент усиления дифференциального каскада:

,

где - входное напряжение АЦП;

- выходное напряжение разбаланса моста.

.

Резисторы , входящие в этот усилитель, должны удовлетворять соотношению:

.

Для резисторов , выбираем номиналы из ряда Е192. Выбираем резисторы типа С2-29В-0,125-100 Ом±0,05.

Тогда значение сопротивления

,

Ом.

Выбираем значение резистора из ряда Е192. Выбираем резистор типа С2-29В-0,125-80,6 Ом±0,05%.

Рассчитываем инструментального усилителя при уточненном значении резистора :

,

.

Т.о. видно, что нормирующего усилителя соответствует аналого-цифрового преобразователя.

В качестве нормирующего преобразователя используется инструментальный усилитель на микросхеме AD623, коэффициент усиления которого зависит от номинала резистора R6, рассчитанного ранее.

Т.к. мостовая схема рассчитана на максимальный ток равный 0,1 А, а источник опорного напряжения - на 10 мА, то между ними необходимо поставить буферный повторитель.

Повторитель напряжения реализован на операционном усилителе К140УД17, который имеет следующие параметры:

Коэффициент усиления напряжения К ……………………......

150 тыс.

Напряжение питания ……………………………...…...…..

±3-18 В

Ток потребления …..………………………………………….

5 мА

Напряжение смещения нуля ...……….…………………......

0,25 мВ

ТК ………………..…………………………………..………..

±1,3

Входной ток ……………………………………………………..

10 нА

Разность входных токов ………………………………………...

5 нА

Напряжение дрейфа ………….……………………………...

±15 В

Максимальное синфазное входное напряжение ……………....

±13 В

Коэффициент ослабления синфазных входных напряжений

100 дБ

Частота единичного усиления ………………………………...

0,4 МГц

Максимальная скорость нарастания выходного напряжения .

0,1 В/мкс

Максимальное выходное напряжения …………………….

±12 В

Выходное сопротивление …………………………………….

2 кОм

Глубокая обратная связь обеспечивает высокое входное и низкое выходное сопротивление и широкую полосу пропускания повторителя напряжения, а также снижает искажения сигнала.

Рис.14. Разводка выводов микросхемы операционного усилителя К140УД17.

В качестве аналого-цифрового преобразователя используется DS2450.

Рис.15. Разводка выводов микросхемы аналого-цифрового преобразователя DS2450.

Обозначения:

Vcc - линия питания 4.5-5.5 В;

NC - не используемые;

DATA- линия связи с МК по протоколу 1-Ware;

GND - потенциал общего провода ("земли");

AIN-A - аналоговый вход A;

AIN-B - аналоговый вход B;

AIN-C - аналоговый вход C;

AIN-D - аналоговый входD;

Основные параметры аналого-цифрового преобразователя DS2450:

Общее описание аналого-цифрового преобразователя DS2450:

DS2450 представляет собой четырехканальный АЦП. Он имеет 8-битную точность и может сопрягаться с широким множеством датчиков и приборов, оцифровывать сигнал и передавать его на устройства сбора и обработки данных по простой однопроводной сети 1-Wire. Встроенный уникальный серийный номер позволяет объединить множество DS2450 с помощью однопроводной сети 1-Wire и получить доступ к конкретному датчику в пределах сети.

Особенности аналого-цифрового преобразователя DS2450:

1. Четырехканальный АЦП на одном последовательном порту

2. Питание через вход Vcc или паразитное через линию передачи данных

3. 8-битная точность, 16-битная разрешающая способность

4. Два диапазона входных измерений: 0В-2.56В и 0В-5.12В

5. Напряжение питания от 4.5B до 5.5В; рабочий диапазон температур от -40°С до +85°С

6. Неиспользуемые аналоговые каналы могут быть сконфигурированы для работы в качестве ключа с открытым коллектором.

7. Время преобразования - 80 мкс/бит (в худшем случае). Пример: 3 канала, разрешение 9 бит = 3х9х80мкс+160мкс инициализация=2.32мс=140 выборок по каждому каналу в секунду

8. Уникальный серийный номер (ID) позволяет однозначно определить конкретный датчик в качестве источника измерений

9. Возможность объединения нескольких устройств по однопроводной сети 1-Wire

10. Передача данных по дешевому кабелю типа "витая пара"

Выбор других элементов схемы.

В основе схемы, контроллер МК-51, использующий все свои возможности. Стандартная схема включения МК-51 с использованием внешнего кварцевого резонатора и простейшей схемы сброса, обеспечивает достаточные и надежные эксплуатационные данные.

Для сопряжения с интерфейсом RS-232, для подключения к USB необходим специализированный чип преобразующий напряжение +-12В или полнофункциональный преобразователь уровней для RS-232. В нашем случае эффективно использовать типовые микросхемы MAX серии 85 или их аналог преобразователь MAX-485, обеспечивающий нужный нам интерфейс.

Рис.16. Разводка выводов микросхемы MAX-485

Основные параметры преобразователя MAX-485:

Микросхема включается по типу схемы с 4-мя конденсаторами и обеспечивает сопряжение 12В.

ЖКИ индикатор выбран типовой -PC2402LRS-ANH-H, двух строчный, с длиной на 22 отображаемых позиции, он подключается к контроллеру непосредственно по 4х проводной линии, что позволяет сэкономить заданное для работы число выводов самого контроллера.

3. Разработка управляющей программы

3.1 Описание работы программы

Интерфейс общения с пользователем представлен меню пошагово:

1. Меню:

1.1. Просмотр данных

1.1.1. Просмотреть последние измеренные температуры:

1.1.1.1. первого датчика

1.1.1.2. восемнадцатого датчика

1.2. Настройки:

1.2.1. Калибровка:

1.2.1.1. ввод температуры и начало калибровки

1.2.1.1.1. ввод температуры

1.2.1.1.1.1. старт

1.2.2. Установка временных параметров:

1.2.2.1. ввод времени

1.2.3. Установка критического уровня:

1.2.3.1. ввод температуры

Меню управляется четырьмя клавишами:

1. enter

2. +

3. -

4. return

При включении регистратора через клавиатуру выбирается режим: режим калибровки или режим измерения, задаются параметры времени м критического уровня (если необходимо изменить уже заданные параметры).

При выборе режима калибровки осуществляется единичное измерение температуры на всех датчиках, полученные данные программно сравниваются с данными введенными пользователем, и осуществляется подстройка значений таблицы сопоставления напряжения и температуры.

При выборе режима измерения в соответствии с заданными интервалами времени происходит цикличное измерение температуры на всех датчиках в соответствии с заданной последовательностью опроса датчиков. Каждый раз после получения данных они записываются во флеш-ПЗУ, отправляются на удаленный компьютер и отображаются на LCD-дисплее по требованию пользователя.

Если полученные значения температур превышают заранее заданный критический уровень подается звуковой сигнал через динамик.

3.2 Описание используемых интерфейсов

Интерфейс 1 Ware

Протокол 1 WIRE определяет структуру сообщений, которая используется и распознаётся устройствами, подключёнными к однопроводному интерфейсу.

Он описывает способ запроса устройством (ведущим) доступа к другим устройствам (ведомым) и способ ответа на запросы. Обмен сообщениями по линии связи возможен при наличии в сети одного ведущего устройства и одного или нескольких ведомых устройств. Сообщения могут быть нескольких видов: - инициализация линии; - команды доступа к ПЗУ; - команды доступа к памяти; - команды чтения данных. Обмен сообщениями по 1 WIRE начинается с инициализирующей последовательности, состоящей из импульса сброса, передаваемой ведущим и ответным импульсом присутствия. Появление импульса присутствия является признаком наличия в линии одного или нескольких ведомых устройств. После получения импульса присутствия ведущий может отправить одну из следующих команд доступа к ПЗУ: - Команда чтения ПЗУ [33h]. Эта команда позволяет прочитать идентификатор устройства, 48 битный серийный номер и контрольную сумму. Эта команда может быть использована только при наличии одного ведомого на линии во избежание коллизий при одновременном ответе нескольких устройств. - Команда совпадения ПЗУ [55h]. Эта команда, за которой следует 64 битный уникальный код устройства, позволяет ведущему получить доступ к конкретному устройству при наличии нескольких устройств на линии. - Команда пропуска ПЗУ [CCh]. Команда применима только в том случае, если на линии присутствует только одно устройство и обеспечивает доступ к нему без передачи уникального серийного номера. - Команда поиска ПЗУ [F0h]. Эта команда используется для определения серийных номеров всех устройств 1 WIRE После команды выбора ПЗУ в линию связи может быть передана одна из следующих команд транспортного уровня: - Команда чтения регистра статуса [20h]. Установленный в единицу 5 бит ответного сообщения указывает на готовность нового результата давления, ещё не прочитанного ведущим. Бит 5 сбрасывается в 0 при чтении результата. - Чтение значения давления [03h]. Ответное сообщение преобразователей содержит три информационных байта и CRC. Первый байт содержит старшую часть давления в двоично-десятичном виде; второй - младшую часть; третий байт имеет следующую структуру: D7 - знак числа (0 - положительное, 1 - отрицательное); D6…D4 - положение десятичной точки в числе, представленном 1 и 2 информационными байтами; D3 - резерв; D2…D0 - размерность полученной величины (0 - кПа, 1 - МПа, 2 - кГс/см2, 3 - % от верхнего предела измерений).

Вычисление контрольной суммы:

Прием байта начинается с младшего бита. Вначале идет байт кода семейства. За кодом семейства идет 6 байт серийного номера, начиная с младшего. Затем идет байт контрольной суммы (CRC). В вычислении байта контрольной суммы принимают участие первые 7 байт, или 56 передаваемых бит. Для вычисления используется следующий полином:

CRC = X8+X5+X4+1

После вычисления контрольной суммы мастер должен сравнить получившееся значение с переданной CRC. Если эти значения совпадают, значит прием данных прошел без ошибок. Можно также вычислить контрольную сумму для всех 64 принятых бит, тогда результат должен быть равен нулю. Блок-схема алгоритма вычисления контрольной суммы показана на рис. 9. Алгоритм использует операции сдвига и "исключающего или". Квадратиками показаны биты переменной, которая используется для вычисления CRC. Перед вычислением её необходимо обнулить, а затем на вход алгоритма нужно последовательно подать 56 принятых бит в том порядке, в котором они были приняты. В результате переменная будет содержать значение CRC.

Интерфейс I2C.

Две линии, данных (SDA) и синхронизации (SCL) служат для переноса информации. Каждое устройство распознается по уникальному адресу - будь то микроконтроллер, ЖКИ буфер, память или интерфейс клавиатуры - и может работать как передатчик или приёмник, в зависимости от назначения устройства. Обычно ЖКИ буфер - только приёмник, а память может как принимать, так и передавать данные. Кроме того, устройства могут быть классифицированы как ведущие и ведомые при передаче данных. Ведущий - это устройство, которое инициирует передачу данных и вырабатывает сигналы синхронизации. При этом любое адресуемое устройство считается ведомым по отношению к ведущему.

Данные на линии SDA должны быть стабильными в течение ВЫСОКОГО периода синхроимпульса. ВЫСОКОЕ или НИЗКОЕ состояние линии данных должно меняться, только если линия синхронизации в состоянии НИЗКОЕ (см. Рис 17).

Рисунок 17. Пересылка бита в шине I2C

1. Линия данных находится в стабильном состоянии, данные определены

2. Допускается изменение данных

Специальные ситуации на шине отмечают сигналы START и STOP (см. Рис 18). Переход линии SDA из ВЫСОКОГО состояния в НИЗКОЕ, в то время как SCL находится в ВЫСОКОМ состоянии означает START. Переход линии SDA из НИЗКОГО состояния в ВЫСОКОЕ при SCL в ВЫСОКОМ состоянии означает STOP. Сигналы СТАРТ и СТОП всегда вырабатываются ведущим. Считается, что шина занята после сигнала СТАРТ. Шина считается освободившейся через определенное время после сигнала СТОП. Определение сигналов СТАРТ и СТОП устройствами, подключенными к шине достаточно легко, если в них встроены необходимые цепи. Однако микроконтроллеры без таковых цепей должны осуществлять считывание значения линии SDA как минимум дважды за период синхронизации для того, чтобы определить переход состояния.

Рисунок 18. Сигналы СТАРТ и СТОП

1. Сигнал СТАРТ

2. Сигнал СТОП

Каждый байт, передаваемый по линии SDA, должен состоять из 8 бит. Количество байт, передаваемых за один сеанс связи неограничено. Каждый байт должен оканчиваться битом подтверждения. Данные передаются, начиная с наиболее значащего бита (см. Рис. 19). Если приёмник не может принять еще один целый байт, пока он не выполнит какую-либо другую функцию (например, обслужит внутреннее прерывание), он может удерживать линию SCL в НИЗКОМ состоянии, переводя передатчик в состояние ожидания. Пересылка данных продолжается, когда приёмник будет готов к следующему байту и отпустит линию SCL.

В некоторых случаях, необходимо использовать другой формат данных (например, CBUS). Посылка, которая передается с таким адресом, может быть закончена выдачей сигнала СТОП, даже если это происходит во время передачи байта. В этом случае подтверждение не генерируется.

Рисунок 19. Пересылка данных по шине I2C

1. Сигнал СТАРТ

2. Старший разряд байта

3. Сигнал подтверждения от приёмника

4. Прием байта завершен. Прерывание внутри приемника

5. Синхролиния удерживается в низком состоянии, пока обслуживается прерывание

6. Сигнал подтверждения от приемника

7. Сигнал СТОП

Подтверждение при передаче данных обязательно. Соответствующий импульс синхронизации генерируется ведущим. Передатчик отпускает (ВЫСОКОЕ) линию SDA в течение синхроимпульса подтверждения. Приёмник должен удерживать линию SDA в течение ВЫСОКОГО состояния синхроимпульса подтверждения в стабильно НИЗКОМ состоянии (рис. 20).

Обычно, приёмник, который был адресован, обязан генерировать подтверждение после каждого принятого байта, исключая те случаи, когда посылка начинается с адреса CBUS .

В том случае, когда ведомый-приёмник не может подтвердить свой адрес (например, когда он выполняет в данный момент какие-либо функции реального времени), линия данных должна быть оставлена в ВЫСОКОМ состоянии. После этого ведущий может выдать сигнал СТОП для прерывания пересылки данных. Если ведомый-приёмник подтвердил свой адрес, но через некоторое время больше не может принимать данные, ведущий также должен прервать пересылку. Для этого ведомый не подтверждает следующий байт, оставляет линию данных в ВЫСОКОМ состоянии и ведущий генерирует сигнал СТОП. Если в пересылке участвует ведущий-приёмник, то он должен сообщить об окончании передачи ведомому-передатчику путем не подтверждения последнего байта. Ведомый-передатчик должен освободить линию данных для того, чтобы позволить ведущему выдать сигнал СТОП или повторить сигнал СТАРТ.

Рисунок 20. Подтверждение

1. Данные, переданные передатчиком

2. Данные, переданные приёмником

3. SCL от ведущего

4. Сигнал СТАРТ

5. Синхроимпульс подтверждения

Заключение

В данном курсовом проекте разработан регистратор параметров технологического процесса. Данный регистратор обладает всеми необходимыми функциональными возможностями, с помощью чего осуществляется полностью автоматизированные измерения температуры.

Приложение

Temp.c (процедуры измерения температуры)

#include <reg2051.h>

#include <stdio.h>

// константы

#define TRUE 1

#define FALSE 0

// определение входов

#define IWARE P3.2 // температурный датчик

// задержка на временной интервал в 10 мсек

void Delay() {

unsigned int i;

for(i=0;i<2000; i++);

}

//инициализация датчика

unsigned int InitIWARE(void) {

unsigned int i, Tempin;

IWARE=0; // сброс IWARE

// удерживаем низкий уровень как минимум на 500 мсек

for (i=0; i<100; i++);

IWARE=1;

// ожидаем как минимум 60 мсек перед проверкой присутствия устройства

for (i=0; i<12; i++);

// проверяем присутствует ли датчик

Tempin=IWARE;

// ожидаем минимум 500 мсек

for (i=0; i<100; i++);

// возврат если датчик присутствует

return Tempin; }

// запись бита в датчик

void IWAREWBit(bit Data) {

unsigned int i;

// ициниализируем слот для записи

IWARE=0;

// позволяем датчику зафиксировать инициализацию

for (i=0; i<3; i++);

IWARE=Data; // выводим бит для записи

// ожидаем 45 мсек

for (i=0; i<9; i++);

IWARE=1;

}

// чтение бита с датчика

bit IWARERBit(void) {

unsigned int i;

bit Temp;

// инициализация слота для чтения

IWARE=0;

// позволяем датчику зафиксировать инициализацию

for (i=0; i<3; i++);

IWARE=1;

// позволяем датчику установить данные

for (i=0; i<3; i++);

// читаем бит

Temp=IWARE;

// позволяем слоту для чтения передать данные

for (i=0; i<6; i++);

// возвращаем состояние бита

return Temp;

}

// запись байта в датчик

void IWAREWByte(unsigned char Data) {

unsigned int i;

unsigned int Temp;

Temp=Data;

for (i=0; i<8; i++) {

IWAREWBit(Temp &0x01); //отсылаем бит

Temp >>=1; // переход к следующему биту

}

}

// чтение байта с датчика

unsigned int IWARERByte(void) {

unsigned int i;

unsigned int Temp=0;

for (i=0; i<8; i++) {

Temp >>=1; // переход к следующему биту

if (IWARERBit())

Temp |= 0x80; // считали '1'

else

Temp &= 0x7F; // считали '0'

}

return Temp;

}

// чтение температуры

unsigned int IWAREReadTemp(void) {

unsigned int j,i,k, temper;

EA=0; // запрещаем прерывания

InitIWARE(); // сбрасываем датчик

IWAREWByte(0xCC); // пропускаем команду памяти

IWAREWByte(0x44); // команда преобразования температуры

EA=1; // разрешаем прерывания

delay();

EA=0; // запрещаем прерывания

InitIWARE(); // перезапускаем датчик

IWAREWByte(0x55); // пропускаем команду памяти

for (k=1;k<8,k++)

{ IWAREWByte(0xa[k]);

}

IWAREWByte(0xBE); // читаем регистры блокнота датчика

j=IWARERByte(); // читаем температуры из регистров блокнота датчика

j+=IWARERByte() << 8;

temper=((j>>1)*10)+((j & 0x0001) * 5);

InitIWARE(); // перезапускаем датчик

EA=1; // разрешаем прерывания

}

}

return temper;

}

unsigned int DS2450ReadTemp(void) {

unsigned int j,i,k;

EA=0; // запрещаем прерывания

InitIWARE(); // сбрасываем датчик

IWAREWByte(0xCC); // пропускаем команду памяти

IWAREWByte(0x3C); // команда преобразования температуры

IWAREWByte(0x0F); // считать нужно показания всех датчиков подключенных к АЦП

EA=1; // разрешаем прерывания

delay();

EA=0; // запрещаем прерывания

InitIWARE(); // пеезапускаем датчик

IWAREWByte(0x55); // пропускаем команду памяти

for (k=1;k<8,k++)

{ IWAREWByte(0xa[k]);

}

IWAREWByte(0xBE); // читаем регистры блокнота датчика

ja=IWARERByte(); // читаем показания первого датчика

IWAREWByte(0xBE); // читаем регистры блокнота датчика

jb=IWARERByte(); // читаем показания второго датчика

IWAREWByte(0xBE); // читаем регистры блокнота датчика

jc=IWARERByte(); // читаем показания третьего датчика

IWAREWByte(0xBE); // читаем регистры блокнота датчика

jd=IWARERByte(); // читаем показания четвертого датчика

InitIWARE(); // перезапускаем датчик

EA=1; // разрешаем прерывания

b2=ja;

b2=b2<<8;

b2=jb;

b2=b2<<8;

b2=jc;

b2=b2<<8;

b2=jd;

}

}

return;

}

void Th_Crc1(int b, int crc) // процедура вычисления контрольной суммы

{

unsigned int i;

for(char i = 0; i < 8; b = b >> 1, i++)

if((b ^ *crc) & 1) *crc = ((*crc ^ 0x18) >> 1) | 0x80;

else *crc = (*crc >> 1) & ~0x80;

}

void Th_Crc2(int crc) // процедура вычисления контрольной суммы

{

unsigned int i;

for(char i = 0; i < 32; b = b >> 1, i++)

if((b2 ^ *crc) & 1) *crc = ((*crc ^ 0x18) >> 1) | 0x80;

else *crc = (*crc >> 1) & ~0x80;

}

// прерывания таймера 0

void Timer0(void) interrupt 1 using 2 {

unsigned int i, min,m,b,Temperatyra,t,crc1, tb, tc, td, mindop;

if (min=minx){

for (i=1,i<8,i++)

{ for (m=1,m<8,m++)

a[i]:=a2[i,m]; // номер устройства с которого производится чтение

b=Temperatyra=IWAREReadTemp(); //чтение температуры

if (t>tbeep) {P3.7=1; delay;

text=[0x30,0x3+i]; //номер датчика

display();

}

Th_Crc(int b, int crc); //вычисление контрольной суммы

crc1=IWARERByte(); // чтение байта контрольной суммы

if (crc1!=crc) Temperaryra=FFFF;

zap(Temperatyra); // запись полученной температуры в флеш-ПЗУ

zapmax(Temperatyra); //передача полученной температуры по MAX485

adressjach++;

if (adressjach=FFFFFFFF )

adressjach=0;

}

for (i=1,i<2,i++)

{ for (m=8,m<16,m++)

a[i]:=a2[i,m]; // номер устройства с которого производится чтение

DS2450ReadTemp();//чтение температуры

Th_Crc(int b, int crc); //вычисление контрольной суммы

crc1=DSR1820Byte(); // чтение байта контрольной суммы

if (crc1!=crc) ja=jb=jc=jd=FFFF;

ta=(ja-5)*kb; //вычисление температуры

if (ta>tbeep) {P3.7=1; delay;

if (m<10) text='0x30,0x3'+num+'0x41'; else {

text='0x31,0x3'+i-10+'0x41';

display();

}

tb=(jb-5)*kb; //вычисление температуры

if (tb>tbeep) {P3.7=1; delay;

if (m<10) text='0x30,0x3'+i+'0x42'; else {

text='0x31,0x3'+i-10+'0x42';

display();

}

tc=(jc-5)*kb; //вычисление температуры

if (tc>tbeep) //проверка не превышен ли допустимый уровень

{P3.7=1; delay; //подача звукового сигнала

if (m<10) text='0x30,0x3'+i+'0x43'; else {

text='0x31,0x3'+i-10+'0x43';

display(); //вывод на экран номера датчика

}

td=(jd-5)*kb; //вычисление температуры

if (td>tbeep) //проверка не превышен ли допустимый уровень

{P3.7=1; delay; //подача звукового сигнала

if (m<10) text='0x30,0x3'+num+'0x44';

else text='0x31,0x3'+m-10+'0x45';

display(); //вывод на экран номера датчика

}

zap(ta); запись полученной температуры в флеш-ПЗУ

zapmax(ta); //передача полученной температуры по MAX485

adressjach++;

if (adressjach= FFFFFFFF)

adressjach=0;

zap(tb); запись полученной температуры в флеш-ПЗУ

zapmax(tb); //передача полученной температуры по MAX485

adressjach++;

if (adressjach= FFFFFFFF)

adressjach=0;

zap(tc); запись полученной температуры в флеш-ПЗУ

zapmax(tc); //передача полученной температуры по MAX485

adressjach++;

if (adressjach= FFFFFFFF )

adressjach=0;

zap(td); запись полученной температуры в флеш-ПЗУ

zapmax(td); //передача полученной температуры по MAX485

adressjach++;

if (adressjach= FFFFFFFF)

adressjach=0;

}}else {if (mindop=9) min++; mindop=1; }else{mindop++;} }

}

Pam1.c (процедуры интерфейса I2c)

#include <io51.h>

#define SDA P1.6

#define SCL P1.7

void pause(void) //процедура задержки

{unsigned int p;

for (p=2; p>0; p--);

return();

}

void i2start(void) // реализация старт-бита

{ SDA=1; SCL=1; pause(); pause();

SDA=0; pause();

SCL=0; pause();

return();

}

void i2write(unsigned char byt) // передача байта

{ unsigned int k, m;

unsigned int chek,y;

for (k=0;k<8;k++)

{ m=0x01 &(byt>>(7-k));

SDA=m; pause();

SCL=1; pause();

SCL=0; pause();

}

SDA=1; pause();

SCL=1;

for (y=100; y>0; y--) //ожидание ответа

{pause();

if ((chek=SDA)==0) break; //проверка ответа

}

SCL=0; pause();

return(check);

}

void i2stop(void) //реализация стоп-бита

{ SDA=0; pause();

SCL=1; pause();

SDA=1; pause();

return();

}

unsigned char i2read (void) // чтение байта

{ unsigned int k, s, d=0;

SDA=1;

for (s=k=0; k<8; k++)

{SCL=1; pause();pause();

s=SDA<<(7-k);

d=d|s; pause; pause();

SCL=0; pause();pause();

}

return (d);

}

Pam2.c (процедуры чтения/записи в память)

#include <io51.h>

extern void i2start (void);

extern void i2stop (void);

extern void i2write (void);

extern unsigned char i2read (void);

extern unsigned char i2ack (void);

unsigned int ack=0, a9,a8, d1,address;

void zap (void) // запись во флеш-ПЗУ

{

IE.7=0; //запрет прерываний

ack=0;

adress=F0;

addressjach=addressjach<<1;

address=address^adressjach;

i2start(); //посылаем старт-бит

ack =i2write(0xadress); //адрес ячейки для записи

if (ack==0) then

i2write(0xd1); //запись данных

i2stop(); //стоп бит

IE.7=1; //разрешение прерываний

}

void cht (void) //чтение из флеш ПЗУ

{

IE.7=0; //запрет прерываний

ack=0;

adress=F1;

addressjach=addressjach<<1;

address=address^adressjach;

i2start();//посылаем старт-бит

ack =i2write(0xadress); if (ack==0) then

d1= i2read();//чтение бфйта данных

SCL=0;SDA=0; pause();SCL=1;pause();pause(); SCL=0;

i2stop();//стоп бит

IE.7=1; //разрешение прерываний

}

LCD.c (процедура вывода на дисплей)

#include<aduc812.h>

unsigned char xdata out _at_ 0x10;

#define rs R1.2

#define e R3.4

#define k1 P1.4

#define k2 P1.5

#define k3 P1.6

#define k4 P1.7

unsigned char init[]={

0x08,//displey off

0x3c,

0x06,

0x0f,

0x01

};

unsigned int i, j,k,pr;

extern unsigned char text[];

void displey (void)

{

DPP=2;

i=0;

while(i<5)

{

rs=0;e=1;

while ( (out & 0x80) !=0 ); //ожидание готовности

rs=0;e=0;

pr=init[i]; //инициализация

if (pr&80) k1=1; else k1=0; //передача старшей половины байта

if (pr&40) k2=1; else k2=0;

if (pr&20) k3=1; else k3=0;

if (pr&10) k4=1; else k4=0;

while ( (out & 0x80) !=0 );

if (pr&08) k1=1; else k1=0; //передача младшей половины байта

if (pr&04) k2=1; else k2=0;

if (pr&02) k3=1; else k3=0;

if (pr&01) k4=1; else k4=0;

i++;

}

i=40;

while(i>0)

{rs=0;e=1;

while ( (out & 0x80) !=0 );

rs=1;e=0;//установка режима приема данных

pr=text[i]; //запись данных

if (pr&80) k1=1; else k1=0; //передача старшей половины байта

if (pr&40) k2=1; else k2=0;

if (pr&20) k3=1; else k3=0;

if (pr&10) k4=1; else k4=0;

while ( (out & 0x80) !=0 );

if (pr&08) k1=1; else k1=0; //передача младшей половины байта

if (pr&04) k2=1; else k2=0;

if (pr&02) k3=1; else k3=0;

if (pr&01) k4=1; else k4=0;

i--;

}

while(1);

}

Max.c (процедуры для работы с передатчиком MAX485)

#include <reg2051.h>

#include <stdio.h>

#include <string.h>

#include <ctype.h>

// константы

#define TRUE 1

#define FALSE 0

#define STX 0x0D // начало кадра

#define ETX 0x0A // конец кадра

#define HACTX P3.5 // переводит MAX485 в передающий режим

// инициализация MAX485

unsigned char InitHACNET(unsigned char DevType, unsigned char Size) {

// отключение передатчика

HACTX=0;

TI = 1; //установка TI для посылки первого слова

return;

}

// посылка одного байта

static unsigned char Send(unsigned char Data) {

SBUF=Data;

return Data;

}

// посылка одного байта как двух ASCII hex байта

static unsigned char SendHex(unsigned char Data) {

unsigned char Tmp;

Tmp=((Data >> 4) & 0x0F);

Send(Tmp <= 9 ? Tmp+0x30 : Tmp+0x37);

Tmp= Data & 0x0F;

Send(Tmp <= 9 ? Tmp+0x30 : Tmp+0x37);

return Data;

}

void HacTransmit(unsigned char *Buffer, Length) {

unsigned int Index, Sum;

static unsigned int LastLength;

HACTX=1; // активируем передатчик

if (Length==0xFF)

Length=LastLength; //установка длины сообщения

else

LastLength=Length;

Sum = Send(STX); //начало кадра

// посылаем каждый байт как Hex ASCII слово

for (Index=0; Index<Length; Index++) Sum += SendHex(*(Buffer+Index));

// посылаем контрольную сумму

SendHex(Sum);

Send(ETX); // посылаем сигнал окончания передачи

// ожидаем завершения последнего байта

// отключаем передатчик

HACTX=0;

}

Menu.c

#include<aduc812.h>

#define key1 P3.2

#define key2 P3.3

extern unsigned char text[];

unsigned char num,viv,int;

void menu(void)

{ text=[0x8C,0xA5,0xAD,0xEE]; //Меню

display();

if ((key1=0)&(key2=0))

{ text=[0x8F,0xE0,0xAE, 0xE1, 0xAC, 0xAE, 0xE2, 0xE0, 0x00, 0xA4, 0xA0, 0xAD, 0xAD, 0xEB, 0xE6]; //просмотр данных

display();

num=1;

if ((key1=0)&(key2=0))

while (1){

if (num<9) viv='0x3'+num;

if (num>9) viv='0x31,0x3'+num-10;

text=[0x84,0x70,0xE2, 0xE7, 0xA8, 0xAA, 0xA0, 0x00, viv]; //датчика 1

display();

if ((key1=0)&(key2=0))

{

addressjach=adressjach-17+num;

disp= cht(); //вывод температуры

display();

if ((key1=1)&(key2=1)) break;

}

if ((key1=1)&(key2=0)) num++;

if ((key1=0)&(key2=1)) num--;

if ((key1=1)&(key2=1)) break;

}

if ((key1=1)&(key2=0))

{ text=[0x8D,0xA0,0xE1, 0xE2, 0xE0, 0xAE, 0xA9, 0xAA, 0xA8]; //настройки

display();

int=1;

if ((key1=0)&(key2=0))

while (1)

{ switch int of

1: { text=[0x8A,0xA0,0xAB, 0xA8, 0xA1, 0xE0, 0xAe, 0xA2, 0xAA,0xA0]; //калибровка

display();

if ((key1=0)&(key2=0))

{ text=[0x82,0xA2,0xAE, 0xA4, 0x00, 0xE2, 0xA5, 0xAC, 0xAF,0xA5, 0xE0, 0xA0, 0xE2, 0xE3,0xE0,0xEB]; //ввод температуры

display();

if ((key1=0)&(key2=0))

{ while(1)

{ if (num<9) viv='0x3'+num; else {

if (num<19) viv='0x31,0x3'+num-10; else{

if (num<29) viv='0x32,0x3'+num-20; else{

if (num<39) viv='0x33,0x3'+num-30; else{

if (num<49) viv='0x34,0x3'+num-40; else{

if (num<59) viv='0x35,0x3'+num-50; else{

if (num<69) viv='0x36,0x3'+num-60; else{

if (num<79) viv='0x37,0x3'+num-70; else{

if (num<89) viv='0x38,0x3'+num-80; else{

if (num<99) viv='0x39,0x3'+num-90; else{

if (num=100) viv=' 0x31,0x30,0x30';}}}}}}}}}}

text=viv; //ввод температуры

display();

if ((key1=1)&(key2=0)) num++;

if ((key1=0)&(key2=1)) num--;

if ((key1=1)&(key2=1)) break;

if (num=101) num=0;

if (num=-1) num=100;

if ((key1=0)&(key2=0))

{

ta=num;

a[1]:=a2[1,8]; // номер устройства с которого производится чтение

DS2450ReadTemp();//чтение температуры

Th_Crc(char b, char crc); //вычисление контрольной суммы

crc1=DSR1820Byte(); // чтение байта контрольной суммы

if (crc1!=crc) break;

kb=ta/(ja-5); break;

} }

if ((key1=1)&(key2=0)) int=++;

if (int=4) int=1;

if ((key1=0)&(key2=1)) int--;

if(int=0) int=3;

if ((key1=1)&(key2=1)) break;

}}}

2:{

text=[0x82,0xA2,0xAE, 0xA4, 0x00, 0xA8, 0xA0, 0xE2, 0xA5,0xE0, 0xA2, 0xA0, 0xAB, 0xAE,0xA2,0x00,0xA2,0xE0, 0xA5, 0xAC, 0xA5, 0xAD, 0xA8]; //ввод интервалов времени

display();

num=0;

if ((key1=0)&(key2=0))

{ while(1){

if (num<9) viv='0x3'+num; else {

if (num<19) viv='0x31,0x3'+num-10; else{

if (num<29) viv='0x32,0x3'+num-20; else{

if (num<39) viv='0x33,0x3'+num-30; else{

if (num<49) viv='0x34,0x3'+num-40; else{

if (num<59) viv='0x35,0x3'+num-50; else{

if (num<69) viv='0x36,0x3'+num-60; else{

if (num<79) viv='0x37,0x3'+num-70; else{

if (num<89) viv='0x38,0x3'+num-80; else{

if (num<99) viv='0x39,0x3'+num-90; else{

if (num=100) viv=' 0x31,0x30,0x30';}}}}}}}}}}

text=viv; //ввод интервала времени

display();

if ((key1=1)&(key2=0)) num++;

if ((key1=0)&(key2=1)) num--;

if ((key1=1)&(key2=1)) break;

if (num=101) num=0;

if (num=-1) num=100;

if ((key1=0)&(key2=0))

{

minx=num;

break;

}}

if ((key1=1)&(key2=1)) break;

if ((key1=1)&(key2=0)) int=++;

if (int=4) int=1;

if ((key1=0)&(key2=1)) int--;

if(int=0) int=3;

}

}

3: { text=[0x82,0xA2,0xAE, 0xA4, 0x00, 0xAA, 0xE0, 0xA8, 0xE2,0xA8, 0xE7, 0xA5, 0xE1, 0xAA,0xAE,0xA9,0x00,0xE0, 0xA5, 0xAC, 0xA5, 0xE0, 0xA0,0xE2,0xE3,0xE0,0xEB]; //ввод критической температуры

display();

num=0;

if ((key1=0)&(key2=0))

{ while(1){

if (num<9) viv='0x3'+num; else {

if (num<19) viv='0x31,0x3'+num-10; else{

if (num<29) viv='0x32,0x3'+num-20; else{

if (num<39) viv='0x33,0x3'+num-30; else{

if (num<49) viv='0x34,0x3'+num-40; else{

if (num<59) viv='0x35,0x3'+num-50; else{

if (num<69) viv='0x36,0x3'+num-60; else{

if (num<79) viv='0x37,0x3'+num-70; else{

if (num<89) viv='0x38,0x3'+num-80; else{

if (num<99) viv='0x39,0x3'+num-90; else{

if (num<109) viv=' 0x31,0x30,0x3'+num-100; else{

if (num<119) viv=' 0x31,0x30,0x3'+num-110; else{

if (num<129) viv=' 0x31,0x30,0x3'+num-120; else{

if (num<139) viv=' 0x31,0x30,0x3'+num-130; else{

if (num<149) viv=' 0x31,0x30,0x3'+num-140; else{

}}}}}}}}}}}}}}}

text=viv;

display();

if ((key1=1)&(key2=0)) num++;

if ((key1=0)&(key2=1)) num--;

if ((key1=1)&(key2=1)) break;

if ((key1=0)&(key2=0))

{ tbeep=num; break;}

}

if ((key1=1)&(key2=0)) int++;

if (int=4) int=1;

if ((key1=0)&(key2=1)) int--;

if(int=0) int=3;

if ((key1=1)&(key2=1)) break;

} } }

Main.c

#include<ADUC812.h>

#include<stdlib.h>

#include<temp.h>

#include<pam1.h>

#include<pam2.h>

#include<lcd.h>

#include<max.h>

#include<menu.h>

unsigned int minx, a2[8], ja,jb,jc,jd,b2,ta,adressjach;

float kb =82.6446;

unsigned a[8] = {2801h,2802h,2803h,2804h,2805h,2806h,2807h,2808h};

void main (void)

{ TH0=0;

TL0=0;

IE.7=1;

ET0=1;

XT0=1;

TR0=True;

minx=60;

while(1){

if ((key1=0)&(key2=0)) menu();

}

}

Размещено на Allbest.ru


Подобные документы

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