Обозначение.
|
Наименование.
|
Кол-во.
|
R1
|
Резистор17
Ом
|
1
|
R2
|
Резистор
10КОм
|
1
|
R3
|
Резистор100
Ом
|
1
|
R6,R7
|
Резистор2КОм
|
2
|
R5
|
Резистор
82КОм
|
1
|
R4
|
Резистор
22КОм
|
1
|
R8
|
Резистор180Ом
|
1
|
R9
|
Резистор5.1КОм
|
1
|
Резистор3
КОм
|
3
|
R15
|
Резистор1.1КОм
|
1
|
R16
|
Резистор1.3
КОм
|
1
|
VT3
|
Полевой
транзистор IRF530
|
1
|
DA2
|
Стабилизатор
LM78L05
|
1
|
XS3:1
|
Ввод
щупа
|
1
|
XS3:2
|
Ввод
щупа
|
1
|
VT1,VT2
|
BSS110
|
2
|
VD3,VD4
|
Диод
2n4007
|
2
|
DA2:B,DA3:A
|
Логическое=
= LM393N
|
2
|
K1
|
Ключ
(кнопка)
|
1
|
L1
|
Катушка
индуктивности 10мкГн
|
1
|
C1,C2
|
Конденсатор
33мкФ
|
2
|
C3
|
Конденсатор
1пФ
|
1
|
С4,С8,С9,С10
|
Конденсатор
0,1мкФ
|
4
|
С1,С2
|
Конденсатор
100мкФ
|
2
|
С6,С7
|
Конденсатор
22пФ
|
2
|
ZQ
|
Кварцевый
генератор 18МГц
|
1
|
Attiny2313
|
Микроконтроллер
Attiny2313
|
1
|
VR1
|
Переменный
резистор 10к
|
1
|
LCD1
|
Алфавитно-цифровой
ЖК-модуль WH1602J
|
1
|
4.
Структура программного средства
Структура взаимодействия модулей ПТС (см. Рис.
4)
Рис. 4
Руководство по использованию устройства
Последовательность действий для правильной
работы устройства:
Подключить устройство к батарее.
Залить испытуемое вещество на высоту 2 см в
измерительный сосуд.
Включить кнопку питания(K1).
Получить результат с дисплея.
Вытащить и очистить от остатков жидкости измерительные
щупы.
Выключить питание.
При необходимости повторить процедуру.
Заключение
Поставленная передо мной задача создания и
разработки малогабаритного анализатора качества ГСМ выполнена на уровне пробной
версии устройства. Выполнены все предъявляемые ПТС требования.Для решения этой
задачи были проделаны следующие виды работ:
Изучены отладочная плата Seeeduino и язык
программирования Arduino, C, Assembler.
Найден, изучен и проанализирован имеющийся
аналог устройство измерения ЭПС и ёмкости конденсатора.
Составлено техническое задание.
Составлены требования к ПС и ПТС, функциональные
требования и требования к качеству разрабатываемого устройства.
Разработан алгоритм управляющей части ПТС.
Проведён анализ проделанной работы.
Создаваемое устройство более простое в
использовании, надёжное и относительно недорогое. Аппаратная компонента
разработанного ПТС реализована на микроконтроллере фирмы AtmelAttiny2313 и
графическом ЖК-дисплее. Программная компонента устройства написана на языке
Assembler. Объём программы не более 2КБ.
Данное устройство может быть использовано для
анализа качества ГСМ и любой другой жидкости при предварительной доработке.
В дальнейшем возможна разработка компьютерного
интерфейса.
Благодарю за огромный вклад и помощь своего
научного руководителя: Коняева Сергея Ивановича.
Список
использованных источников
1. Измеритель
емкости и ЭПС конденсаторов / В. Келехсашвили / Журнал «Радио».-2010г,- выпуск
6-7 - стр.19-21.
2. Мактас
М.Я. «8 уроков по P-CAD 2001»М.: СОЛОН-Пресс,2003 - стр.1-110.
. У.
Титце, К. Шенк Полупроводниковая схемотехника: справочное руководство» М.:
МИР,1982 - стр. 56-65.
. Описание
ЖК-дисплея wh1602J-datasheet.-4c.
Приложение
1
Аналог разрабатываемого устройства
спектрометр-анализатор
Известен спектрометр - анализатор веществ фирмы
Brimrose [Бюллетень "AOTFSPECTROSCOPY", - фирма Brimrose, March,
1993]. Схема, которая представлена на рисунке.
Рис. 4
Где:
- источник широкополосного излучения;
- оптическая система доставки широкополосного
излучения;
- акустооптическая ячейка;
- генератор высокой частоты;
- светоделительная пластина;
- опорный канал узкополосного излучения;
- сигнальный канал узкополосного излучения;
- фотоприемник опорного канала узкополосного
излучения;
- фотоприемник сигнального канала узкополосного
излучения;
- анализируемое вещество;
- световод;
- блок обработки и индикации;
- собирающие линзы;
- светоделительная пластина;
- дифференциальный усилитель.
Этот спектрометр-анализатор работает следующим
образом. От источника широкополосного излучения (1) излучение посредством
оптической системы доставки широкополосного излучения (2) поступает в
акустооптическую ячейку (3), которая выделяет из всего спектра названного
излучения узкополосное излучение (излучение в узком спектральном диапазоне).
Названный узкий спектральный диапазон формируется с помощью генератора высокой
частоты (4) и зависит от частоты подаваемого им сигнала на акустооптическую
ячейку (3). Полученное узкополосное оптическое излучение, вышедшее из акустооптической
ячейки далее разделяется посредством светоделительной пластинки (14), на два
пучка, первый из которых (6), направляется по опорному каналу узкополосного
излучения на фотоприемник опорного канала (8), а второй направляется по
сигнальному каналу узкополосного излучения (7), через световод (11), на
анализируемое вещество (10) и далее возвращается через световод (11) и
поступает на фотоприемник сигнального канала узкополосного излучения (9).
Фотоприемники (8) и (9) преобразуют оптические сигналы в электрические, которые
поступают на входы дифференциального усилителя и сравниваются по величине.
Разность этих сигналов интерпретируется как функция поглощения (пропускания)
веществом оптического сигнала с заданной длиной волны, которая в свою очередь,
жестко связана с частотой генератора поступающей на акустооптическую ячейку.
Перестраивая с помощью генератора высокой частоты (4) длину волны выделяемого
акустооптической ячейкой узкополосного излучения, получают соответствующую
спектральную функцию пропускания, или поглощения, т.е. зависимость изменения
амплитуды напряжения на выходе дифференциального усилителя пропорционального
изменению оптического сигнала на входе фотоприемника (9) во всем спектральном
диапазоне длин оптических волн, в котором проводится измерение спектра
поглощения (пропускания) анализируемого вещества.Полученная спектрограмма
обрабатывается в электронном блоке обработки и индикации (12) и сравнивается со
спектрограммой эталонного образца исследуемого вещества, хранящейся в памяти
этого блока.
Приложение
2
Листинг программы
.defsotye = R0;Число сотых долей (1)
.defdesyatye = R1;Число десятых долей (2)
.defedinicy = R2;Число единиц (3)
.defdesyatki = R3;Число десятков (4)
.defsotni = R4;Число сотен тысяч (5)
.deftyshi = R5;Число тысяч (6)
.defdes_tysh= R6;Число десятков тысяч (7)
.defa1 = R7;1-й байт переменной a (младший байт)
.defa2 = R8;2-й байт переменной a
.defa3 = R9;3-й байт переменной a
.defb1 = R10;1-й байт переменной b (младший
байт)
.defb2 = R11;2-й байт переменной b
.defb3 = R12;3-й байт переменной b
.defc1 = R13;1-й байт переменной c (младший
байт)
.defc2 = R14;2-й байт переменной c
.defc3 = R15;3-й байт переменной c
;--------------------------------------------------------
.defc4 = R16;4-й байт переменной c
.deftemp = R17;Определение главного рабочего
регистра
.deftemp2 = R18;Определение второго рабочего
регистра
.deflcd= R19;Определение регистра для обращения
к LCD
.defz1 = R20;1-й байт переменной z (младший
байт)
.defz2 = R21;2-й байт переменной z
.defz3 = R22;3-й байт переменной z
.defk_del= R24;Регистр поправки коеффициента
деления таймера
.deftok_zar= R25;Регистр величины тока заряда
.defautoff= R28;Регистр счётчика автовыключения
(он же YL)
.defautoff2= R29;Регистр предела измерения в
Фарадах (он же YH)
;--------------------------------------------------------
.equconst1b = 8548;Константа перевода результата
в ёмкость для большего тока (32768)
.equconst1m = 9124;Константа перевода результата
в ёмкость для малого тока (524288)
.equconst2 = 2051;Константа 100*U1/Ib
.equconst3 = 3967;Константа 100*U2/Ib
.equconst4 = 129;Константа для задания скорости
USART (9600 бит/с)
.equESRmax=2001;Порог максимального значения ESR
(20,00 Ом)
.equporog1 = 32700;Порог переключения на младший
предел (по U2)
.equporog2 = 15001;Порог переключения на малый
ток (150 мкФ)
.equporog3 = 2001;Порог переключения предела на
малом токе (20 мкФ)
.equd20m = 65535;Значение длительности паузы
(~20мс при 20МГц) (тактов-9)/6
.equd3m = 9999;Значение длительности паузы (~3мс
при 20МГц) (тактов-9)/6
.equd40u = 235;Значение длительности паузы
(~40мкс при 20МГц) (тактов-4)/3
.equd1u=6;Значение длительности паузы (~1мкс при
20МГц) (тактов-4)/3
.equRS = 2;
.equE = 3;
;------------------------Начало программного
кода
.cseg
.org0;установка текущего адреса на ноль
;------------------------Переопределение
векторов прерываний:rjmpinit;Переход на начало программы_U1;Внешнее прерывание
0_U2;Внешнее прерывание 1;Таймер/счётчик 1, захват;Таймер/счётчик 1,
совпадение, канал А;Таймер/счётчик 1, прерывание по переполнению;Таймер/счётчик
0, прерывание по переполнению;Прерывание USART приём завершён;Прерывание USART
регистр данных пуст;Прерывание USART передача завершена;Прерывание по
компаратору;Прерывание по изменению на любом контакте;Таймер/счётчик 1,
совпадение, канал В;Таймер/счётчик 0, совпадение, канал В;Таймер/счётчик 0,
совпадение, канал А;USI готовность к старту;USI переполнение;EEPROM
готовность;Переполнение охранного таймера
;-----------------------Модуль инициализации:
;-----------------------Инициализация стека,
RAMEND;Выбор адреса внешнего стека, temp;Запись его в регистр стека
;-----------------------Инициализация портов
ВВ,0b00000100;PA2 на вывод, PA0, PA1 на ввод,temp;,0b00000100;Устанавливаем
PA2, отключаем резисторы на PA0, PA1,temp;,0b11111101;PB0, PB2...PB7 навывод,
PB1 наввод,temp;,0b00000000;Обнуляем PB1...PB7, устанавливаем PB1
ивключаемрезисторна PB0,temp;,0b00110011;PD0, PD1, PD4...PD5 навывод, PD2, PD3,
PD6 наввод,temp;,0b01111111;Устанавливаем PD0, PD1, PD4...PD5 ивключаемрезисторы
PD2, PD3, PD6,temp;
;-----------------------Инициализация таймера
Т1,0b00000000;Останов таймера, нормальный режимB,temp;
;-----------------------Инициализация
компаратора,0b01110000;Настройка компаратора,temp;
;-----------------------Определение масок прерываний
,0b00000000;Выбор режима вызова внешних прерываний PD2 (U1) и PD3
(U2),temp;,0b00000000;Запрет прерываний по таймеру 1,temp,0b00000000;Запрет
внешних прерываний,temp;
;-----------------------Инициализация LCD
(WH1602J)_init:m;Вызов подпрограммы задержки (~20мс)m;Вызов подпрограммы
задержки (~20мс)m;Вызов подпрограммы задержки (~20мс)
;Команда 0010,E;Строб вверх,0b00101000;Команда
(строб вверх + команда),temp;Запись команды в портu;Вызов подпрограммы задержки
(~1мкс),E;Строб внизu;Вызов подпрограммы задержки (~1мкс),0b00101000;Команды
0010 и 1000_com;Вызов подпрограммы отправки команды на LCD,0b00001000;Команды
0000 и 1000_com;Вызов подпрограммы отправки команды на LCD,0b00000001;Команды
0000 и 0001_com;Вызов подпрограммы отправки команды на LCDm;Вызов подпрограммы
задержки (~3мс),0b00000110;Команды 0000 и 0110_com;Вызов подпрограммы отправки
команды на LCD
;-----------------------Начало основной
программы;Глобально запрещаем прерывания_del;Очистка k_del_zar;Очистка
tok_zar;Очистка autoff;Очистка autoff2,0b00001100;Включение дисплея и выбор
курсора_com;
;-----------------------Выключение
прибора,0b01110000;Разрешение перехода в режим Power-Down,temp;,0;Выключение
питания;Переход в режим Power-Down_check1:;Очистка z1;Очистка z2
lditemp,55;Запись
55 в
temp_check2:
dectemp;Уменьшение temp на 1,ACO;Если на выходе
компаратора 1, то пропуск след.команды, иначе далее
rjmpbat_check3;На
bat_check3;Увеличение
z1 на
1_check4;На bat_check4_check3:
incz2;Увеличение z2 на 1_check4:,0;Сравнение
temp с 0_check2;Если temp<>0, то на bat_check2, иначе далее,z2;Сравнение
z1 с z2_0;Если z1<z2, то на pusk_0, иначе далее,low(Bat*2);Запись в ZL
младшего байта адреса ячейки из таблицы Bat (альтернативная
адресация),high(Bat*2);Запись в ZH старшего байта адреса ячейки из таблицы Bat
(альтернативная адресация)_all;Вызов подпрограммы отображения двух строк на LCD
по данным из таблиц;Увеличение autoff2 на 1
;-----------------------Измерение на большом
токе заряда_tok:,0b00000001;Пуск таймера (clk/1),k_del;с коррекцией
коеффициента деления таймера,0;Включение заряда конденсатораB,temp;;На cikl
;-----------------------Измерение на малом токе
заряда_tok:,0b00000001;Пуск таймера (clk/1),k_del;с коррекцией коеффициента
деления таймера,4;Включение заряда конденсатораB,temp;:;Зацикливаем
;-----------------------Умножение
(c3+c2+c1)*(XH+XL)=(c4+c3+c2+c1) или (n2-n1)*const1b,low(const1m);Запись
младшего байта const1m в XL,high(const1m);Запись старшего байта const1m в XH
rjmpstep6_2;На
step6_2_1:,low(const1b);Записьмладшегобайта
const1b в
XL,high(const1b);Записьстаршегобайта
const1b в
XH
step6_2:mul16x16;Вызов подпрограммы перемножения
16-ти битных чисел
;-----------------------Отображение первой
строки LCD_1str;Вызов подпрограммы отображения первой строки LCD;Очистка autoff
;-----------------------Умножение
(c3+c2+c1)*(XH+XL)=(c4+c3+c2+c1) или (U2/I)*n1,low(const3);Запись младшего
байта const3 в XL,high(const3);Запись старшего байта const3 в XHmul16x16;Вызов
подпрограммы перемножения 16-ти битных чисел,c1;Копирование результата
умножения из c1 в z1,c2;Копирование результата умножения из c2 в
z2,c3;Копирование результата умножения из c3 в z3,c4;Копирование результата
умножения из c4 в z4,b1;Копирование 1-го байта n2 из b1 в c1,b2;Копирование
2-го байта n2 из b2 в c2,b3;Копирование 3-го байта n2 из b3 в c3
;-----------------------Умножение
(c3+c2+c1)*(XH+XL)=(c4+c3+c2+c1) или (U1/I)*n2,low(const2);Запись младшего
байта const2 в XL,high(const2);Запись старшего байта const2 в XHmul16x16;Вызов
подпрограммы перемножения 16-ти битных чисел;Извлечение из стека в a3
(извлечение n2-n1);Извлечение из стека в a2;Извлечение из стека в a1
subc1,z1;Вычитание
z1 из
c1 ((U1/I)*n2)-((U2/I)*n1)
sbcc2,z2;Вычитание z2 из c2 с учётом
переноса,z3;Вычитание z3 из c3 с учётом переноса,z4;Вычитание z4 из c4 с учётом
переноса;Если результат положительный, то на step8, иначе
далее,low(ESRmn*2);Запись в ZL младшего байта адреса ячейки из таблицы ESRmn
(альтернативная адресация),high(ESRmn*2);Запись в ZH старшего байта адреса
ячейки из таблицы ESRmn (альтернативная адресация)
;-----------------------Отображение второй
строки LCD:_2str;Вызов подпрограммы отображения второй строки LCD
;-----------------------Подпрограмма отображение
первой строки LCD_1str:
;-----------------------Отображение
ёмкости,0x80;Выбор знакоместа (начало 1й строки)_com;Вызов подпрограммы
отправки команды на LCD
;-----------------------Отображение
"12345" или " 2345";Очистка temp_tysh,temp;Если значение
десятков тысяч не равно нулю, то переход на lcd_1str_4_1str_4;иначе
далее,temp;Если значение тысяч не равно нулю, то переход на
lcd_1str_3_1str_3;иначе далее,temp;Если значение сотен не равно нулю, то
переход на lcd_1str_2_1str_2;иначе далее,temp;Если значение десятков не равно
нулю, то переход на lcd_1str_0_1str_0;иначе далее
;-----------------------Отображение "
5,67" или "45,67",0x20;Отображение " " (ёмкость)_dat;
rjmplcd_1str_1;На
lcd_1str_1_1str_0:_del,4;Сравнение
k_del с
4_1str_0_1;Если
k_del<>4, тона
lcd_1str_0_1,0x30;Отображение
"0" (ёмкость)_dat;,0x2C;Отображение
"," (ёмкость)_dat;
lcd_1str_0_1:,0x30;Определение кода для числа
десятков (ёмкость),desyatki;_dat;Отображение числа десятков
(ёмкость)_1str_1:,0x30;Определение кода для числа единиц
(ёмкость),edinicy;_dat;Отображение числа единиц (ёмкость)_del,4;Сравнение k_del
с 4_1str_1_1;Если k_del<>4, то на lcd_1str_1_1,0x30;Определение кода для
числа десятых долей (ёмкость),desyatye;_dat;Отображение числа десятых долей
(ёмкость),0x30;Определение кода для числа сотых долей
(ёмкость),sotye;_dat;Отображение числа сотых долей (ёмкость),0x20;Отображение
" " (ёмкость)_dat; _lcd;На F_lcd_1str_1_1:,0x2C;Отображение
"," (ёмкость)_dat; ,0x30;Определение кода для числа десятых долей
(ёмкость),desyatye;_dat;Отображение числа десятых долей
(ёмкость),0x30;Определение кода для числа сотых долей (ёмкость),sotye;_dat;Отображение
числа сотых долей (ёмкость)_lcd;На uF_lcd
;-----------------------Отображение
"345,6"_1str_2:,0x30;Определение кода для числа сотен
(ёмкость),sotni;_dat;Отображение числа сотен (ёмкость),0x30;Определение кода
для числа десятков (ёмкость),desyatki;_dat;Отображение числа десятков
(ёмкость),0x30;Определение кода для числа единиц
(ёмкость),edinicy;_dat;Отображение числа единиц (ёмкость),0x2C;Отображение
"," (ёмкость)_dat; ,0x30;Определение кода для числа десятых долей
(ёмкость),desyatye;_dat;Отображение числа десятых долей (ёмкость)_lcd;На uF_lcd
;-----------------------Отображение "
2345" или "12345"_1str_3:,0x20;Отображение " "
(ёмкость)
rcalllcd_dat; _1str_5;На
lcd_1str_5
lcd_1str_4:,0x30;Определение кода для числа
десятков тысяч (ёмкость),des_tysh;_dat;Отображение числа десятков тысяч
(ёмкость)_1str_5:,0x30;Определение кода для числа тысяч
(ёмкость),tyshi;_dat;Отображение числа тысяч (ёмкость),0x30;Определение кода
для числа сотен (ёмкость),sotni;_dat;Отображение числа сотен
(ёмкость),0x30;Определение кода для числа десятков
(ёмкость),desyatki;_dat;Отображение числа десятков (ёмкость),0x30;Определение
кода для числа единиц (ёмкость),edinicy;_dat;Отображение числа единиц
(ёмкость)_lcd:,0x20;Отображение " " (ёмкость)_dat; ,0x75;Отображение
"u" (ёмкость)_dat; _lcd:,0x46;Отображение "F"
(ёмкость)_dat;;Выход из подпрограммы
;-----------------------Подпрограмма отображение
второй строки LCD_2str:
;-----------------------Отображение
ESR,0xC0;Выбор знакоместа (начало 2й строки)_com;;Очистка temp,temp;Если значение
десятков равно нулю, то переход на lcd_2str_0_2str_0;иначе
далее,0x30;Определение кода для числа десятков (ESR),desyatki;_dat;Отображение
числа десятков (ESR)_2str_1;Переход на lcd_2str_1_2str_0:,0x20;Отображение
" " (ESR)_dat; _2str_1:,0x30;Определение кода для числа единиц
(ESR),edinicy;_dat;Отображение числа единиц (ESR),0x2C;Отображение
"," (ESR)_dat; ,0x30;Определение кода для числа десятых долей
(ESR),desyatye;_dat;Отображение числа десятых долей (ESR),0x30;Определение кода
для числа сотых долей (ESR),sotye;_dat;Отображение числа сотых долей
(ESR),0x20;Отображение " " (ESR)_dat; ,0x4F;Отображение "О"
(ESR)_dat; ,0xBC;Отображение "м" (ESR)_dat; ;Выход из подпрограммы
;-----------------------Подпрограмма отображение
сообщений на LCD_mess:,8;Запись 8 в z4,1;Сравнение temp с 1_mess_2str;Если str
не равен 1, то на lcd_mess_2str, иначе далее_mess_1str:,0x80;Выбор знакоместа
(начало 1й строки)
rcalllcd_com;_mess_0;На
lcd_mess_0
lcd_mess_2str:,0xC0;Выбор знакоместа (начало 2й
строки)_com;_mess_0:,Z+;Запись lcd байта состояния строк из ячейки с адресом из
Z_dat;;Уменьшение z4 на 1,0;Сравнение z4 с 0_mess_0;Если z4<>0, то на
lcd_mess_0, иначе далее;Выход из подпрограммы
;-----------------------Подпрограмма отображения
двух строк подряд на LCD по данным из таблиц _all:,1;Отображение 1-й
строки_mess;Вызов подпрограммы отображения сообщений,2;Отображение 2-й
строки_mess;Вызов подпрограммы отображения сообщений;Выход из подпрограммы
;-----------------------Подпрограмма вычитания
(c3+c2+c1)-(z3+z2+z1)=(c3+c2+c1)
c_minus_z:,z1;
sbcc2,z2;,z3;;Выход из подпрограммы
;-----------------------Подпрограмма сложения
(c3+c2+c1)+(z3+z2+z1)=(c3+c2+c1)
c_plus_z:,z1;
;-----------------------Подпрограмма отправки
команды на LCD_com:,RS;Команда,PORTB,0b00000011;Маска 00000011
дляобнулениялишнего,0b00001000;Логическое сложение temp с 00001000 (строб вверх
+ команда)_out;Вызов подпрограммы lcd_out;Выход из подпрограммы
;-----------------------Подпрограмма отправки
данных на LCD
lcd_dat:,RS;Данные
intemp,PORTB
anditemp,0b00000011;Маска 00000011 для обнуления
лишнего,0b00001100;Логическое сложение temp с 00001100 (строб вверх +
команда)_out;Вызов подпрограммы lcd_out;Выход из подпрограммы
;-----------------------Подпрограмма отправки на
LCD
lcd_out:,E;Строб
вверх
pushlcd;Сохранение lcd в стеке,0b11110000;Маска
11110000 для обнуления младшего полубайта,temp;Логическое сложение lcd с temp
(строб вверх + команда),lcd;Запись команды в порт,E;Строб вниз,E;Строб
вверх;Извлечение lcd из стека;Смена полубайт местами,0b11110000;Маска 11110000
для обнуления младшего полубайта,temp;Логическое сложение lcd с temp (строб
вверх + команда),lcd;Запись команды в портu;Вызов подпрограммы задержки
(~1мкс),E;Строб внизu;Вызов подпрограммы задержки (~40мкс)u;Вызов подпрограммы
задержки (~40мкс);Выход из подпрограммы
;-----------------------Подпрограмма отображения
числовых строк (для отладки):,6;Если PD6=0, то пропуск след.команды_2;На
otlad_2m;Вызов подпрограммы задержки (~3мс),6;Если PD6=0, то пропуск
след.команды_2;На otlad_2lcd_both_str;Вызов подпрограммы отображения двух
числовых строк_1:_off;Вызов подпрограммы ожидания отпускания кнопки;Очистка
стека (поскольку выход не по ret);Очистка стека;На main_2:;Выход из
подпрограммы
;-----------------------Подпрограмма ожидания
отпускания кнопки_off:,6;Если PD6=1, то пропуск след.команды_off;На
knop_offm;Вызов подпрограммы задержки (~3мс),6;Если PD6=1, то пропуск
след.команды_off;На knop_off;Выход из подпрограммы
;-----------------------Подпрограмма передачи с
1-го по 7-й байт через USART_1_7:_ready;Вызов подпрограммы ожидания готовности
буфера передачи,0x10;Запись 0x10 в temp_tysh,temp;Логическое сложение des_tysh
с temp, результат в des_tysh
outUDR,des_tysh;Передачаиз
des_tysh в USART
lditemp,0x20;Запись 0x20 в temp,temp;Логическое
сложение tyshi с temp, результат в tyshi,tyshi;Передача из tyshi в
USART,0x30;Запись 0x30 в temp,temp;Логическое сложение sotni с temp, результат
в sotni,sotni;Передача из sotni в USART,0x40;Запись 0x40 в temp,temp;Логическое
сложение desyatki с temp, результат в desyatki,desyatki;Передача из desyatki в
USART,0x50;Запись 0x50 в temp,temp;Логическое сложение edinicy с temp,
результат в edinicy
outUDR,edinicy;Передачаиз
edinicy в
USART
lditemp,0x60;Запись 0x60 в temp,temp;Логическое
сложение desyatye с temp, результат в desyatye,desyatye;Передача из desyatye в
USART,0x70;Запись 0x70 в temp,temp;Логическое сложение sotye с temp, результат
в sotye,sotye;Передача из sotye в USART;Выход из подпрограммы
;-----------------------Подпрограмма отображения
одной числовой строки
lcd_one_str:,0x4E;Отображение
"N"_dat;,0x3A;Отображение
":"
rcalllcd_dat;,0x30;Определение кода для числа
тысяч,tyshi;_dat;Отображение числа тысяч,0x30;Определение кода для числа
сотен,sotni;_dat;Отображение числа сотен,0x30;Определение кода для числа
десятков,desyatki;_dat;Отображение числа десятков,0x30;Определение кода для
числа единиц,edinicy;_dat;Отображение числа единиц,0x30;Определение кода для
числа десятых долей,desyatye;_dat;Отображение числа десятых
долей,0x30;Определение кода для числа сотых долей,sotye;_dat;Отображение числа
сотых долей;Выход из подпрограммы
;-----------------------Подпрограмма отображения
двух числовых строк по данным_both_str:,a1;Копирование из a1 в
c1,a2;Копирование из a2 в c2,a3;Копирование из a3 в c3
;-----------------------Отображение смещения от
нуля для U1 "1= ",0x80;Выбор знакоместа (начало 1й
строки)_com;_one_str;Вызов подпрограммы отображения одной числовой
строки,b1;Копирование из b1 в c1,b2;Копирование из b2 в c2,b3;Копирование из b3
в c3
;-----------------------Отображение смещения от
нуля для U2 "2= ",0xC0;Выбор знакоместа (начало 2й
строки)_com;_one_str;Вызов подпрограммы отображения одной числовой строки;Выход
из подпрограммы
;-----------------------Подпрограмма обработки
прерывания по переполнению таймера 1
;Поскольку выход не по reti, то глобально
запрещённые прерывания остаются запрещены:;Глобально запрещаем
прерывания,3;Заносим 3 в temp,temp;Сравнение c3 с temp_0;Если с3=3, то на
ovtim1_0, иначе далее;Увеличение c3 на 1;Выход из подпрограммы обработки
прерывания_0:,0;Выключение большого тока заряда конденсатора,4;Выключение
малого тока заряда конденсатора,5;Включение разряда
конденсатора,0b00000000;Останов таймераB,temp;;Очистка стека (поскольку выход
по clk_down, а не по reti);Очистка стека_down;Переход на clk_down
;-----------------------Подпрограмма обработки
внешнего прерывания по U1
;Поскольку выход не по reti, то глобально
запрещённые прерывания остаются запрещены_U1:,TCNT1L;Сохраняем 1-йбайт
n1,TCNT1H;Сохраняем 2-йбайт n1,c3;Копируем из c3 в a3 3-й байт
n1,0b10000000;Разрешение внешнего прерывания только по PD3 (U2),temp;;Выход из
подпрограммы обработки прерывания
;-----------------------Подпрограмма обработки
внешнего прерывания по
U2_U2:,TCNT1L;Сохраняем 1-й байт
n2,TCNT1H;Сохраняем 2-й байт n2;Глобально запрещаем прерывания,0;Выключение
большого тока заряда конденсатора,4;Выключение малого тока заряда
конденсатора,5;Включение разряда конденсатора,0b00000000;Останов
таймераB,temp;;Очистка стека (поскольку выход не по reti);Очистка стека