Коэффициент усиления
напряжения К ……………………......
|
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:представляет
собой четырехканальный АЦП. Он имеет 8-битную точность и может сопрягаться с
широким множеством датчиков и приборов, оцифровывать сигнал и передавать его на
устройства сбора и обработки данных по простой однопроводной сети 1-Wire.
Встроенный уникальный серийный номер позволяет объединить множество DS2450 с
помощью однопроводной сети 1-Wire и получить доступ к конкретному датчику в
пределах сети.
Особенности аналого-цифрового преобразователя DS2450:
. Четырехканальный АЦП на одном последовательном порту
. Питание через вход Vcc или паразитное через линию передачи
данных
. 8-битная точность, 16-битная разрешающая способность
. Два диапазона входных измерений: 0В-2.56В и 0В-5.12В
. Напряжение питания от 4.5B до 5.5В; рабочий диапазон температур
от -40°С до +85°С
. Неиспользуемые аналоговые каналы могут быть сконфигурированы для
работы в качестве ключа с открытым коллектором.
. Время преобразования - 80 мкс/бит (в худшем случае). Пример: 3
канала, разрешение 9 бит = 3х9х80мкс+160мкс инициализация=2.32мс=140 выборок по
каждому каналу в секунду
. Уникальный серийный номер (ID) позволяет однозначно определить
конкретный датчик в качестве источника измерений
. Возможность объединения нескольких устройств по однопроводной
сети 1-Wire
. Передача данных по дешевому кабелю типа "витая пара"
Выбор других элементов схемы.
В основе схемы, контроллер МК-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.2. восемнадцатого датчика
.2. Настройки:
.2.1. Калибровка:
.2.1.1. ввод температуры и начало калибровки
.2.1.1.1. ввод температуры
.2.1.1.1.1. старт
.2.2. Установка временных параметров:
.2.2.1. ввод времени
.2.3. Установка критического уровня:
.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. Линия данных находится в стабильном состоянии, данные определены
. Допускается изменение данных
Специальные ситуации на шине отмечают сигналы START и STOP (см. Рис 18).
Переход линии SDA из ВЫСОКОГО состояния в НИЗКОЕ, в то время как SCL находится
в ВЫСОКОМ состоянии означает START. Переход линии SDA из НИЗКОГО состояния в
ВЫСОКОЕ при SCL в ВЫСОКОМ состоянии означает STOP. Сигналы СТАРТ и СТОП всегда
вырабатываются ведущим. Считается, что шина занята после сигнала СТАРТ. Шина
считается освободившейся через определенное время после сигнала СТОП.
Определение сигналов СТАРТ и СТОП устройствами, подключенными к шине достаточно
легко, если в них встроены необходимые цепи. Однако микроконтроллеры без таковых
цепей должны осуществлять считывание значения линии SDA как минимум дважды за
период синхронизации для того, чтобы определить переход состояния.
Рисунок 18. Сигналы СТАРТ и СТОП
. Сигнал СТАРТ
. Сигнал СТОП
Каждый байт, передаваемый по линии SDA, должен состоять из 8 бит.
Количество байт, передаваемых за один сеанс связи неограничено. Каждый байт
должен оканчиваться битом подтверждения. Данные передаются, начиная с наиболее
значащего бита (см. Рис. 19). Если приёмник не может принять еще один целый
байт, пока он не выполнит какую-либо другую функцию (например, обслужит
внутреннее прерывание), он может удерживать линию SCL в НИЗКОМ состоянии,
переводя передатчик в состояние ожидания. Пересылка данных продолжается, когда
приёмник будет готов к следующему байту и отпустит линию SCL.
В некоторых случаях, необходимо использовать другой формат данных
(например, CBUS). Посылка, которая передается с таким адресом, может быть
закончена выдачей сигнала СТОП, даже если это происходит во время передачи
байта. В этом случае подтверждение не генерируется.
Рисунок 19. Пересылка данных по шине I2C
1. Сигнал СТАРТ
. Старший разряд байта
. Сигнал подтверждения от приёмника
. Прием байта завершен. Прерывание внутри приемника
. Синхролиния удерживается в низком состоянии, пока обслуживается
прерывание
. Сигнал подтверждения от приемника
. Сигнал СТОП
Подтверждение при передаче данных обязательно. Соответствующий импульс
синхронизации генерируется ведущим. Передатчик отпускает (ВЫСОКОЕ) линию SDA в
течение синхроимпульса подтверждения. Приёмник должен удерживать линию SDA в
течение ВЫСОКОГО состояния синхроимпульса подтверждения в стабильно НИЗКОМ
состоянии (рис. 20).
Обычно, приёмник, который был адресован, обязан генерировать
подтверждение после каждого принятого байта, исключая те случаи, когда посылка
начинается с адреса CBUS .
В том случае, когда ведомый-приёмник не может подтвердить свой адрес
(например, когда он выполняет в данный момент какие-либо функции реального
времени), линия данных должна быть оставлена в ВЫСОКОМ состоянии. После этого
ведущий может выдать сигнал СТОП для прерывания пересылки данных. Если ведомый-приёмник подтвердил свой адрес, но через
некоторое время больше не может принимать данные, ведущий также должен прервать
пересылку. Для этого ведомый не подтверждает следующий байт, оставляет линию
данных в ВЫСОКОМ состоянии и ведущий генерирует сигнал СТОП. Если в пересылке участвует ведущий-приёмник, то он должен
сообщить об окончании передачи ведомому-передатчику путем не подтверждения
последнего байта. Ведомый-передатчик должен освободить линию данных для того,
чтобы позволить ведущему выдать сигнал СТОП или повторить сигнал СТАРТ.
Рисунок 20. Подтверждение
. Данные, переданные передатчиком
. Данные, переданные приёмником
. Сигнал СТАРТ
. Синхроимпульс подтверждения
Заключение
В данном курсовом проекте разработан регистратор параметров
технологического процесса. Данный регистратор обладает всеми необходимыми
функциональными возможностями, с помощью чего осуществляется полностью
автоматизированные измерения температуры.
Приложение
Temp.c (процедуры измерения температуры)
#include <reg2051.h>
#include <stdio.h>
// константы
#define TRUE 1
#define FALSE 0
// определение входов
#define IWARE P3.2 // температурный датчик
// задержка на временной интервал в 10 мсек
void Delay() {int i;(i=0;i<2000; i++);
}
//инициализация датчика
unsigned int InitIWARE(void) {int i, Tempin;=0; // сброс IWARE
// удерживаем низкий уровень как минимум на 500 мсек
for (i=0; i<100; i++);=1;
// ожидаем как минимум 60 мсек перед проверкой присутствия устройства
for (i=0; i<12; i++);
// проверяем присутствует ли датчик
Tempin=IWARE;
// ожидаем минимум 500 мсек(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 мсек(i=0; i<9; i++);=1;
}
// чтение бита с датчикаIWARERBit(void) {int i;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) {int i;int
Temp;=Data;(i=0; i<8; i++) {(Temp &0x01); //отсылаем бит
Temp
>>=1; // переход к следующему биту
}
}
// чтение байта с датчика
unsigned int IWARERByte(void) {
unsigned int i;int Temp=0; (i=0; i<8; i++) {
Temp
>>=1; // переход к следующему биту
if (IWARERBit())|= 0x80; // считали '1'&= 0x7F; // считали '0'
}Temp;
}
// чтение температурыint IWAREReadTemp(void) {int j,i,k, temper;=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;=((j>>1)*10)+((j &
0x0001) * 5);(); //
перезапускаем датчик
EA=1;
// разрешаем прерывания
}
}temper;
}int DS2450ReadTemp(void) {int j,i,k;=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<<8;=jb;=b2<<8;=jc;=b2<<8;=jd;
}
};
}
void Th_Crc1(int b, int crc) // процедура вычисления контрольной
суммы
{int i;(char i = 0; i < 8; b = b >> 1, i++)((b ^
*crc) & 1) *crc = ((*crc ^ 0x18) >> 1) | 0x80;*crc = (*crc >>
1) & ~0x80;
}Th_Crc2(int crc) // процедура вычисления контрольной суммы
{int i;(char i = 0; i < 32; b = b >> 1, i++)((b2 ^
*crc) & 1) *crc = ((*crc ^ 0x18) >> 1) | 0x80;*crc = (*crc >>
1) & ~0x80;
}
// прерывания таймера 0Timer0(void) interrupt 1 using 2 {int i,
min,m,b,Temperatyra,t,crc1, tb, tc, td, mindop;(min=minx){(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]; //номер датчика();
}
Th_Crc(int b, int crc); //вычисление контрольной суммы
crc1=IWARERByte(); // чтение байта контрольной суммы
if (crc1!=crc) Temperaryra=FFFF;(Temperatyra); // запись полученной температуры в
флеш-ПЗУ
zapmax(Temperatyra); //передача полученной температуры
по MAX485
adressjach++;(adressjach=FFFFFFFF )=0;
}(i=1,i<2,i++)
{ for (m=8,m<16,m++)[i]:=a2[i,m]; // номер
устройства с которого производится чтение
DS2450ReadTemp();//чтение температуры
Th_Crc(int b, int crc); //вычисление контрольной суммы
crc1=DSR1820Byte(); // чтение байта контрольной суммы
if (crc1!=crc) ja=jb=jc=jd=FFFF;=(ja-5)*kb; //вычисление температуры(ta>tbeep) {P3.7=1; delay;(m<10) text=’0x30,0x3’+num+’0x41’;
else {=’0x31,0x3’+i-10+’0x41’;();
}
tb=(jb-5)*kb; //вычисление температуры
if (tb>tbeep) {P3.7=1; delay;(m<10)
text=’0x30,0x3’+i+’0x42’; else {=’0x31,0x3’+i-10+’0x42’;();
}
tc=(jc-5)*kb; //вычисление температуры
if (tc>tbeep) //проверка не превышен ли допустимый уровень
{P3.7=1; delay; //подача
звукового сигнала(m<10) text=’0x30,0x3’+i+’0x43’; else
{=’0x31,0x3’+i-10+’0x43’;();
//вывод на экран номера датчика
}
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’;(); //вывод на экран номера датчика
}
zap(ta); запись полученной температуры в
флеш-ПЗУ
zapmax(ta); //передача полученной температуры
по MAX485
adressjach++;(adressjach= FFFFFFFF)=0;(tb); запись полученной температуры в флеш-ПЗУ
zapmax(tb); //передача полученной температуры
по MAX485
adressjach++;(adressjach= FFFFFFFF)=0;(tc); запись полученной температуры в флеш-ПЗУ
zapmax(tc); //передача полученной температуры
по MAX485
adressjach++;(adressjach= FFFFFFFF )=0;(td); запись полученной температуры в флеш-ПЗУ
zapmax(td); //передача полученной температуры
по MAX485
adressjach++;(adressjach= FFFFFFFF)=0;
}}else {if (mindop=9) min++; mindop=1; }else{mindop++;} }
}
Pam1.c (процедуры интерфейса I2c)
#include <io51.h>
#define SDA P1.6
#define SCL P1.7pause(void) //процедура задержки
{unsigned int p;(p=2; p>0; p--);();
}i2start(void) // реализация старт-бита
{ SDA=1; SCL=1; pause(); pause();=0; pause();=0; pause();();
}i2write(unsigned char byt) // передача байта
{ unsigned int k, m;int chek,y;(k=0;k<8;k++)
{ m=0x01 &(byt>>(7-k));=m; pause();=1; pause();=0;
pause();
}=1; pause();=1; (y=100; y>0; y--) //ожидание ответа
{pause();((chek=SDA)==0) break; //проверка ответа
}=0; pause();(check);
}i2stop(void) //реализация стоп-бита
{ SDA=0; pause();=1; pause();=1; pause();();
}char i2read (void) // чтение
байта
{ unsigned int k, s, d=0;=1;(s=k=0; k<8; k++)
{SCL=1;
pause();pause();=SDA<<(7-k);=d|s; pause; pause();=0; pause();pause();
}(d);
}
Pam2.c (процедуры чтения/записи в память)
#include
<io51.h>void i2start (void);void i2stop (void);void i2write
(void);unsigned char i2read (void);unsigned char i2ack (void);int ack=0, a9,a8,
d1,address; zap (void)
// запись во флеш-ПЗУ
{
IE.7=0; //запрет прерываний
ack=0;
adress=F0;
addressjach=addressjach<<1;=address^adressjach;start();
//посылаем старт-бит=i2write(0xadress); //адрес ячейки для записи(ack==0)
thenwrite(0xd1); //запись данных2stop();
//стоп бит
IE.7=1; //разрешение прерываний
}
void cht (void) //чтение
из флеш ПЗУ
{
IE.7=0; //запрет прерываний
ack=0;
adress=F1;
addressjach=addressjach<<1;=address^adressjach;start();//посылаем старт-бит=i2write(0xadress);
if (ack==0) then= i2read();//чтение бфйта данных=0;SDA=0; pause();SCL=1;pause();pause();
SCL=0;2stop();//стоп
бит
IE.7=1; //разрешение прерываний
}
LCD.c (процедура вывода на дисплей)
#include<aduc812.h>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.7char init[]={
x08,//displey off
x3c,
x06,
x0f,
x01
};int i,
j,k,pr;unsigned char text[];displey (void)
{=2;=0;(i<5)
{
rs=0;e=1; ( (out & 0x80) !=0 ); //ожидание готовности
rs=0;e=0;=init[i]; //инициализация
if (pr&80) k1=1; else k1=0;
//передача старшей половины байта
if (pr&40)
k2=1; else k2=0;(pr&20) k3=1; else k3=0;(pr&10) k4=1; else k4=0;( (out
& 0x80) !=0 ); (pr&08) k1=1; else k1=0; //передача младшей половины байта(pr&04)
k2=1; else k2=0;(pr&02) k3=1; else k3=0;(pr&01) k4=1; else k4=0;++;
}=40;(i>0)
{rs=0;e=1;( (out
& 0x80) !=0 ); =1;e=0;//установка
режима приема данных
pr=text[i]; //запись данных
if (pr&80) k1=1; else k1=0;
//передача старшей половины байта
if (pr&40)
k2=1; else k2=0;(pr&20) k3=1; else k3=0;(pr&10) k4=1; else k4=0;( (out
& 0x80) !=0 ); (pr&08)
k1=1; else k1=0; //передача младшей половины
байта
if (pr&04)
k2=1; else k2=0;(pr&02) k3=1; else k3=0;(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 в
передающий режим
// инициализация
MAX485char InitHACNET(unsigned char DevType, unsigned char Size) {
// отключение передатчика
HACTX=0;
TI = 1; //установка TI для посылки
первого слова
return;
}
// посылка одного байтаunsigned
char Send(unsigned char Data) {=Data;
return Data;
}
// посылка одного байта как
двух ASCII hex байта
static unsigned
char SendHex(unsigned char Data) {char Tmp;=((Data >> 4) & 0x0F);(Tmp
<= 9 ? Tmp+0x30 : Tmp+0x37);= Data & 0x0F;(Tmp <= 9 ? Tmp+0x30 :
Tmp+0x37);Data;
}HacTransmit(unsigned
char *Buffer, Length) {int Index, Sum;unsigned int LastLength;=1; // активируем
передатчик(Length==0xFF)=LastLength;
//установка длины сообщения
else=Length; = 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.3unsigned char text[];char num,viv,int;menu(void)
{
text=[0x8C,0xA5,0xAD,0xEE]; //Меню();((key1=0)&(key2=0))
{
text=[0x8F,0xE0,0xAE, 0xE1, 0xAC, 0xAE, 0xE2, 0xE0, 0x00, 0xA4, 0xA0, 0xAD,
0xAD, 0xEB, 0xE6]; //просмотр данных();=1;((key1=0)&(key2=0))(1){(num<9)
viv=’0x3’+num;(num>9) viv=’0x31,0x3’+num-10;=[0x84,0x70,0xE2, 0xE7, 0xA8,
0xAA, 0xA0, 0x00, viv]; //датчика
1();
if
((key1=0)&(key2=0))
{=adressjach-17+num;=
cht(); //вывод температуры();((key1=1)&(key2=1)) break;
}((key1=1)&(key2=0))
num++;((key1=0)&(key2=1)) num--;((key1=1)&(key2=1)) break;
}
((key1=1)&(key2=0))
{
text=[0x8D,0xA0,0xE1, 0xE2, 0xE0, 0xAE, 0xA9, 0xAA, 0xA8]; //настройки();=1;
if
((key1=0)&(key2=0)) (1)
{ switch int of
: {
text=[0x8A,0xA0,0xAB, 0xA8, 0xA1, 0xE0, 0xAe, 0xA2, 0xAA,0xA0]; //калибровка();((key1=0)&(key2=0))
{
text=[0x82,0xA2,0xAE, 0xA4, 0x00, 0xE2, 0xA5, 0xAC, 0xAF,0xA5, 0xE0, 0xA0,
0xE2, 0xE3,0xE0,0xEB]; //ввод температуры();((key1=0)&(key2=0))
{ while(1)
{ if (num<9)
viv=’0x3’+num; else {(num<19) viv=’0x31,0x3’+num-10; else{(num<29)
viv=’0x32,0x3’+num-20; else{(num<39) viv=’0x33,0x3’+num-30; else{(num<49)
viv=’0x34,0x3’+num-40; else{(num<59) viv=’0x35,0x3’+num-50; else{(num<69)
viv=’0x36,0x3’+num-60; else{(num<79) viv=’0x37,0x3’+num-70; else{(num<89)
viv=’0x38,0x3’+num-80; else{(num<99) viv=’0x39,0x3’+num-90; else{(num=100)
viv=’ 0x31,0x30,0x30’;}}}}}}}}}}=viv; //ввод температуры();((key1=1)&(key2=0))
num++;((key1=0)&(key2=1)) num--;((key1=1)&(key2=1)) break;(num=101)
num=0;(num=-1) num=100;((key1=0)&(key2=0))
{
ta=num;
a[1]:=a2[1,8]; // номер устройства с которого производится
чтение
DS2450ReadTemp();//чтение температуры
Th_Crc(char b, char crc);
//вычисление контрольной суммы
crc1=DSR1820Byte(); // чтение байта контрольной суммы
if (crc1!=crc)
break;=ta/(ja-5); break;
}
}((key1=1)&(key2=0)) int=++;(int=4) int=1;((key1=0)&(key2=1))
int--;(int=0) int=3;((key1=1)&(key2=1)) break;
}}}
:{=[0x82,0xA2,0xAE,
0xA4, 0x00, 0xA8, 0xA0, 0xE2, 0xA5,0xE0, 0xA2, 0xA0, 0xAB,
0xAE,0xA2,0x00,0xA2,0xE0, 0xA5, 0xAC, 0xA5, 0xAD, 0xA8]; //ввод интервалов времени();
num=0;((key1=0)&(key2=0))
{
while(1){(num<9) viv=’0x3’+num; else {(num<19) viv=’0x31,0x3’+num-10;
else{(num<29) viv=’0x32,0x3’+num-20; else{(num<39) viv=’0x33,0x3’+num-30;
else{(num<49) viv=’0x34,0x3’+num-40; else{(num<59) viv=’0x35,0x3’+num-50;
else{(num<69) viv=’0x36,0x3’+num-60; else{(num<79) viv=’0x37,0x3’+num-70;
else{(num<89) viv=’0x38,0x3’+num-80; else{(num<99) viv=’0x39,0x3’+num-90;
else{(num=100) viv=’ 0x31,0x30,0x30’;}}}}}}}}}}=viv; //ввод интервала времени
display();((key1=1)&(key2=0))
num++;((key1=0)&(key2=1)) num--;((key1=1)&(key2=1)) break;(num=101)
num=0;(num=-1) num=100;((key1=0)&(key2=0))
{=num;;
}}((key1=1)&(key2=1))
break;((key1=1)&(key2=0)) int=++;(int=4) int=1;((key1=0)&(key2=1))
int--;(int=0) int=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]; //ввод критической температуры();
num=0;((key1=0)&(key2=0))
{
while(1){(num<9) viv=’0x3’+num; else {(num<19) viv=’0x31,0x3’+num-10;
else{(num<29) viv=’0x32,0x3’+num-20; else{(num<39) viv=’0x33,0x3’+num-30;
else{(num<49) viv=’0x34,0x3’+num-40; else{(num<59) viv=’0x35,0x3’+num-50;
else{(num<69) viv=’0x36,0x3’+num-60; else{(num<79) viv=’0x37,0x3’+num-70;
else{(num<89) viv=’0x38,0x3’+num-80; else{(num<99) viv=’0x39,0x3’+num-90;
else{(num<109) viv=’ 0x31,0x30,0x3’+num-100; else{(num<119) viv=’
0x31,0x30,0x3’+num-110; else{(num<129) viv=’ 0x31,0x30,0x3’+num-120;
else{(num<139) viv=’ 0x31,0x30,0x3’+num-130; else{(num<149) viv=’
0x31,0x30,0x3’+num-140; else{
}}}}}}}}}}}}}}}=viv;();((key1=1)&(key2=0))
num++;((key1=0)&(key2=1)) num--;((key1=1)&(key2=1))
break;((key1=0)&(key2=0))
{ tbeep=num;
break;}
}((key1=1)&(key2=0))
int++;(int=4) int=1;((key1=0)&(key2=1)) int--;(int=0)
int=3;((key1=1)&(key2=1)) break;
} } }.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>int
minx, a2[8], ja,jb,jc,jd,b2,ta,adressjach;kb =82.6446;a[8] =
{2801h,2802h,2803h,2804h,2805h,2806h,2807h,2808h};main (void)
{
TH0=0;=0;.7=1;=1;=1;=True;=60;(1){((key1=0)&(key2=0)) menu();
}
}