Прибор удобен в обращении, так как предоставляет возможности для его управления и отображает необходимую пользователю информацию на семисегментных индикаторах. Пользователь может получить информацию как об уровне жидкости, так и о емкости, вычисленных программно, используя код на выходах АЦП, пропорциональный измеренному уровню. Погрешность измерения - менее 1%. Кроме того, возможно отображение времени работы системы.
Система состоит из шести датчиков, каждый из которых имеет возможность измерения в высоту до 2 м. Наличие интерфейса RS-232C позволяет осуществлять передачу данных о текущем состоянии системы на внешнюю ПЭВМ.
Данное устройство обеспечивает надежный контроль за уровнем жидкости в резервуарах, а также соответствует заданным параметрам.
Приложения
Приложение 1
Текст программы для микроконтроллера
; Основная программа | |||
ORG 000H | ; начальный адрес | ||
JMP BEGIN | |||
ORG 100H | |||
BEGIN: | ACALL INIT | ; п/п инициализации ККД | |
START: | CLR P1.0 | ; запуск АЦП | |
WAIT: | JNB P1.1, WAIT | ; переход, если данные не готовы | |
CLR P1.2 | ; сброс Р1.2 | ||
MOV A, P0 | ; данные из АЦП в аккумуляторе | ||
MOV 30H, A | ; данные из АЦП в ячейке 30Н ОЗУ | ||
SETB P1.0 | ; гашение АЦП | ||
SETB P1.2 | ; регистр в Z-состояние | ||
ACALL LEVEL | ; вызов п/п вычисления уровня | ||
ACALL CAPACITY | ; вызов п/п вычисления емкости | ||
ACALL TIME | ; вызов п/п вычисления времени | ||
SETB P3.0 | ; установить сигнал DTR | ||
NOP | |||
NOP | |||
CLR P3.0 | ; снять сигнал DTR | ||
SETB EA | ; разрешение прерывания | ||
SETB ЕХ1 | |||
SETB ЕХ0 | |||
ACALL DELAY1 | ; п/п задержки на 1 минуту | ||
JMP START | ; цикл | ||
; Подпрограмма перекодировки из двоично-десятичного в семисегментный код | |||
ORG 40H | |||
TABLECOD: | DB 3FH | ; "0” | |
DB 06H | ; "1” | ||
DB 5BH | ; "2” | ||
DB 4FH | ; "3” | ||
DB 66H | ; "4” | ||
DB 6DH | ; "5” | ||
DB 7DH | ; "6” | ||
DB 87H | ; "7” | ||
DB 7FH | ; "8” | ||
DB 6FH | ; "9” | ||
; Подпрограмма инициализации контроллера клавиатуры и дисплея | |||
INIT: | MOV A, #C0H | ; очистка дисплея | |
Продолжение приложения 2 | |||
MOV P0, A | |||
SETB P1.4 | ; выбор ККД | ||
SETB P1.3 | ; РУС ККД | ||
MOV A, #00H | ; установка режима | ||
MOV P0, A | |||
SETB P1.3 | ; РУС ККД | ||
MOV A, #22H | ; управление частотой сканирования | ||
MOV P0, A | |||
SETB P1.3 | ; РУС ККД | ||
CLR P1.4 | ; ККД не выбран | ||
RET | |||
; Подпрограмма преобразования данных с АЦП в значение уровня жидкости. ; Входной параметр: ячейка 30Н - последние данные с АЦП ; Выходные параметры: ячейки 50Н, 51Н, 52Н, 53Н, 54Н - соответственно сотни, ; десятки, единицы, десятые, сотые значения уровня | |||
LEVEL: | MOV A, 30H | ; в (А) данные АЦП в двоичном коде | |
MOV B, #78 | ; (В) ←78 множитель | ||
MUL AB | ; (В) (А) ← (А) (В) | ||
MOV R7, A | ; (R7) ← (А) Мл.Б. произведения | ||
XCH A, B | ; (А) ↔ (В) | ||
MOV R6, A | ; (R6) ← (А) Ст.Б. произведения | ||
ACALL PREOBR2-210 | ; вызов п/п преобразования | ||
MOV 50H, R3 | ; по адресу 50Н количество сотен | ||
MOV A, R4 | ; (А) ← (R4) | ||
SWAP A | ; обмен тетрад в аккумуляторе | ||
ANL A, 00001111B | ; (А) ← (А) &0FH | ||
MOV 51H, A | ; по адресу 51Н количество десятков | ||
MOV A, R4 | ; (А) ← (R4) | ||
ANL A, 00001111B | ; (А) ← (А) &0FH | ||
MOV 52H, A | ; по адресу 52Н количество единиц | ||
MOV A, R5 | ; (А) ← (R5) | ||
SWAP A | ; обмен тетрад в аккумуляторе | ||
ANL A, 00001111B | ; (А) ← (А) &0FH | ||
MOV 53H, A | ; по адресу 53Н количество десятых | ||
MOV A, R5 | ; (А) ← (R5) | ||
ANL A, 00001111B | ; (А) ← (А) &0FH | ||
MOV 54H, A | ; по адресу 54Н количество сотых | ||
RET | |||
; Подпрограмма преобразования данных с АЦП в значение емкости. ; Входной параметр: ячейка 30Н - последние данные с АЦП. | |||
; Выходные параметры: ячейки 55Н, 56Н, 57Н, 58Н, 59Н - соответственно десятки, | |||
; единицы, десятые, сотые, тысячные значения емкости | |||
CAPACITY: | MOV A, 30H | ; в (А) данные АЦП в двоичном коде | |
MOV B, #59 | ; (В) ←59 множитель | ||
MUL AB | ; (В) (А) ← (А) (В) | ||
MOV R7, A | ; (R7) ← (А) Мл.Б. произведения | ||
XCH A, B | ; (А) ↔ (В) | ||
MOV R6, A | ; (R6) ← (А) Ст.Б. произведения | ||
ACALL PREOBR2-210 | ; вызов п/п преобразования | ||
MOV 55H, R3 | ; по адресу 55Н количество десятков | ||
MOV A, R4 | ; (А) ← (R4) | ||
SWAP A | ; обмен тетрад в аккумуляторе | ||
ANL A, 00001111B | ; (А) ← (А) &0FH | ||
MOV 56H, A | ; по адресу 56Н количество единиц | ||
MOV A, R4 | ; (А) ← (R4) | ||
ANL A, 00001111B | ; (А) ← (А) &0FH | ||
MOV 57H, A | ; по адресу 57Н количество десятых | ||
MOV A, R5 | ; (А) ← (R5) | ||
SWAP A | ; обмен тетрад в аккумуляторе | ||
ANL A, 00001111B | ; (А) ← (А) &0FH | ||
MOV 58H, A | ; по адресу 58Н количество сотых | ||
MOV A, R5 | ; (А) ← (R5) | ||
ANL A, 00001111B | ; (А) ← (А) &0FH | ||
MOV 59H, A | ; по адресу 59Н количество тысячных | ||
RET | |||
; Подпрограмма вычисления значения времени ; Выходные параметры: ячейка 5АН - десятки часов, ячейка 5ВН - единицы часов | |||
TIME: | SETB P1.6 | ; установка Р1.6 | |
MOV A, P0 | ; данные о времени в (А) | ||
CLR P1.6 | ; сброс Р1.6 | ||
ADD A, #00H | ; (А) ← (А) +00Н | ||
DA A | ; десятичная коррекция | ||
MOV R0, A | ; (R0) ← (А) | ||
ANL A, #00001111B | ; (А) ← (А) &0FH | ||
MOV 5BH, A | ; по адресу 5ВН единицы часов | ||
MOV A, R0 | ; (А) ← (R0) | ||
SWAP A | ; обмен тетрад аккумулятора | ||
ANL A, #00001111B | ; (А) ← (А) &0FH | ||
MOV 5AH, A | ; по адресу 5АН десятки часов | ||
RET | |||
; Подпрограмма преобразования двоичного целого беззнакового числа формата 16 | |||
; в двоично-десятичное число формата 5х4 | |||
; Входные параметры: R6 - Ст.Б., R7 - Мл.Б. | |||
; Выходные параметры: R3 - Ст.Б., R4 - Ср.Б., R5 - Мл.Б. | |||
; обнуление текущей суммы | |||
PREOBR2-210: | CLR A | ||
MOV R4, A | |||
MOV R5, A | |||
MOV A, R6 | |||
MOV R1, A | |||
MOV A, R7 | |||
MOV R2, A | |||
MOV R0, #16H | ; счетчик циклов | ||
CLR A | |||
; сдвиг двоичного числа влево | |||
CYCLE: | XCH A, R4 | ||
XCH R1, A | |||
XCH R4, A | |||
XCH A, R5 | |||
XCH R2, A | |||
XCH R5, A | |||
MOV A, R5 | |||
ADD A, R5 | |||
MOV R5, A | |||
MOV A, R4 | |||
ADDC A, R4 | |||
XCH A, R4 | |||
XCH R1, A | |||
XCH R4, A | |||
XCH A, R5 | |||
XCH R2, A | |||
XCH R5, A | |||
; двоично-десятичное удвоение суммы с учетом переноса | |||
MOV A, R5 | |||
ADDC A, R5 | |||
DA A | |||
MOV R5, A | |||
MOV A, R4 | |||
ADDC A, R4 | |||
DA A | |||
MOV R4, A | |||
MOV A, R7 | |||
ADDC A, R7 | |||
DA A | |||
MOV R7, A | |||
; проверка конца цикла | |||
DJNZ R0, CYCLE | |||
MOV A, R7 | |||
MOV R3, A | |||
RET | |||
; Подпрограмма перекодировки из двоичного в семисегментный код | |||
CROSSCOD: | ADD A, #40H | ; (А) ← (А) +40Н | |
MOV R1, A | |||
MOV A, @R1 | |||
MOV R1, A | |||
RET | |||
; Подпрограмма задержки на 1 минуту | |||
DELAY1: | MOV R7, #00H | ; обнулить счетчик переполнения | |
MOV R6, #00H | ; обнулить счетчик переполнения | ||
SETB EA | ; общее разрешение прерывания | ||
SETB ET0 | ; разрешение прерывания от Т/С0 | ||
MOV TMOD, #01H | ; режим 1 Т/С0 | ||
MOV TL0, #0B0H | |||
MOV TH0, #3CH | ; загрузка числа | ||
SETB TR0 | ; запуск Т/С0 | ||
LOOP: | CJNE R6, #60, LOOP | ; переход при (R6) ≠60 | |
RETI | |||
ORG 000BH | ; вектор прерывания | ||
CLR TR0 | ; остановить Т/С0 | ||
CLR TF0 | ; сбросить TF0 | ||
INC R7 | ; инкремент | ||
JMP MET | |||
ORG 0030Н | |||
MET: | CJNE R7, #20, AGAIN | ; переход при (R7) ≠20 | |
MOV R7, #00H | ; обнуление | ||
INC R6 | ; инкремент | ||
RETI | |||
AGAIN: | MOV TL0, #0B0H | ||
MOV TH0, #3CH | ; загрузка числа | ||
MOV TR0 | ; запуск Т/С0 | ||
Продолжение приложения 2 | |||
RETI | |||
; Подпрограмма обработки прерывания по входу INT0 | |||
ORG 0003H | ; вектор прерывания | ||
INT: | CLR ES | ; запрет прерываний от УАПП | |
MOV SCON, #42H | ; режим УАПП | ||
CLR TR1 | ; останов Т/С1 | ||
MOV R0, #50H | ; адрес пересылаемых данных | ||
ACALL USTAN | ; вызов п/п | ||
RET | |||
USTAN: | MOV TMOD, #20H | ; режим 2 Т/С1 | |
MOV TH1, #0FAH | ; загрузка числа | ||
SETB TR1 | ; запуск Т/С1 | ||
PROV: | MOV A, @R0 | ||
SPOUT: | JNB TI, SPOUT | ; ожидание готовности передатчика | |
CLR TI | ; сброс TI | ||
INC R0 | ; инкремент | ||
MOV SBUF, A | ; пересылка символа | ||
CJNE R0, #5CH, PROV | ; все переслали? | ||
RET | |||
; Подпрограмма обработки прерывания по входу INT1 | |||
ORG 0013H | ; вектор прерывания | ||
MOV A, 40H | ; команда чтения FIFO | ||
MOV P0, A | |||
SETB P1.4 | ; выбор ККД | ||
CLR P1.3 | ; регистр DAN ККД | ||
MOV A, P0 | ; в (А) код нажатой клавиши | ||
RRC A | ; сдвиг | ||
JB C, UR | ; переход, если перенос | ||
RRC | ; сдвиг | ||
JB C, EMK | ; переход, если перенос | ||
RRC | ; сдвиг | ||
JB C, WR | ; переход, если перенос | ||
UR: | ACALL UROVEN | ; вызов п/п | |
RET | |||
EMK: | ACALL EMKOST | ; вызов п/п | |
RET | |||
WR: | ACALL VREMY | ; вызов п/п | |
RET | |||
Продолжение приложения 2 | |||
; Подпрограмма вывода на дисплей значения уровня жидкости | |||
UROVEN: | MOV R0, #50H | ; (R0) ←50Н | |
CJNE R0, #52H, PRY | |||
MOV A, @R0 | |||
ACALL CROSSCOD | ; вызов п/п перекодировки | ||
MOV A, R1 | |||
ADD A, #10000000B | |||
MOV R1, A | |||
JMP DAL | |||
PRY: | MOV A, @R0 | ||
ACALL CROSSCOD | |||
DAL: | MOV A, #80H | ; команда запись в ОЗУ дисплея | |
MOV P0, A | |||
SETB P1.3 | ; РУС ККД | ||
MOV A, R1 | |||
MOV P0, A | |||
CLR P1.3 | ; вывод на дисплей | ||
INC R0 | ; инкремент | ||
CJNE R0, #55H, PRY | ; все выведено? | ||
RET | |||
; Подпрограмма вывода на дисплей значения емкости | |||
EMKOST: | MOV R0, #55H | ; (R0) ←55Н | |
CJNE R0, #56H, PRY1 | |||
MOV A, @R0 | |||
ACALL CROSSCOD | ; вызов п/п перекодировки | ||
MOV A, R1 | |||
ADD A, #10000000B | |||
MOV R1, A | |||
JMP DAL1 | |||
PRY1: | MOV A, @R0 | ||
ACALL CROSSCOD | |||
DAL1: | MOV A, #80H | ; команда запись в ОЗУ дисплея | |
MOV P0, A | |||
SETB P1.3 | ; РУС ККД | ||
MOV A, R1 | |||
MOV P0, A | |||
CLR P1.3 | ; вывод на дисплей | ||
INC R0 | ; инкремент | ||
CJNE R0, #5AH, PRY1 | ; все выведено? | ||
RET | |||
Продолжение приложения 2 | |||
; Подпрограмма вывода на дисплей значения времени | |||
VREMY: | MOV R0, #5AH | ; (R0) ←5АН | |
PRY2: | MOV A, @R0 | ||
ACALL CROSSCOD | ; вызов п/п перекодировки | ||
MOV A, #80H | ; команда запись в ОЗУ дисплея | ||
MOV P0, A | |||
SETB P1.3 | ; РУС ККД | ||
MOV A, R1 | |||
MOV P0, A | |||
CLR P1.3 | ; вывод на дисплей | ||
INC R0 | ; инкремент | ||
CJNE R0, #5CH, PRY2 | ; все выведено? | ||
RET | |||
Другие статьи по теме
Диспетчерский контроль движения поездов Диспетчерский контроль движения поездов позволяет диспетчеру видеть на световом табло участка в каждый момент времени местонахождение всех поездов и состояние входных, выходных светофоро ...
Генератор линейно-изменяющихся напряжений Генераторы синусоидального напряжения отличаются тем, что у них цепь обратной связи имеет резонансные свойства. Поэтому условия возникновения колебаний выполняются только на одной частот ...
Цифровые измерительные приборы Одно из преимуществ цифровых схем по сравнению с аналоговыми заключается в том, что у первых сигналы могут быть переданы без искажений. Например, непрерывный звуковой сигнал, передающийс ...