Адрес РУС
|
D7
|
D6
|
D5
|
D4
|
D3
|
D2
|
D1
|
D0
|
01h
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
03h
|
1
|
0
|
1
|
0
|
0
|
0
|
0
|
0
|
04h
|
1
|
0
|
0
|
0
|
0
|
0
|
0
|
0
|
Регистр по адресу 01h отвечает за защитный интервал при нажатии
кнопки, по адресу 03h за настройку выхода как выхода прерывания, по адресу 04h за запуск контроллера и
начала процедуры опроса клавиатуры. Также этот регистр предназначен для
перевода контроллера в энергосберегающий режим.
Для организации самой клавиатурной матрицы используем кнопки DTS -
24N (SWT 9). Для данного типа кнопок коммутируемое напряжение - 12 В, рабочий
ток 0,05 А, сопротивление в нажатом состоянии не более 0,1 Ом. Данные кнопки
полностью удовлетворяют требованиям технической документации на контроллер
клавиатуры.
Произведем расчет резистора R20: на вход AD0 должна быть подана
логическая единица, минимальное UIH для MAX7347 равно 2,2В, входной
ток IIH равен 1мкА, следовательно Ом, выберем резистор C1-4 2,4 МОм 0.25Вт ± 5%
Расчет подтягивающих резисторов R2 и R3 был произведен при
рассмотрении аналого-цифрового преобразователя.
В модуль клавиатуры также входит схема сброса микроконтроллера.
Схема состоит из микросхемы MAX6317H фирмы MAXIM. Эта микросхема представляет собой
формирователь импульса сброса нужной длительности при включении питания и имеет
встроенный сторожевой таймер. Подробнее см. описание микросхемы в приложении М.
Для организации сброса микроконтроллера необходимо на вход RST подать сигнал
высокого уровня на время, превышающее два машинных цикла. Период тактовой
частоты генератора равен Т = 83 нс. Тогда длительность одного машинного цикла
равна Тм = 12·83 = 1000 нс = 1 мкс, где 12 - это число периодов
сигнала тактового генератора в машинном цикле. Таким образом, напряжение
высокого уровня на входе RST для сброса микроконтроллера необходимо удерживать
не менее 2 мкс, т.е. tСБР = 2 мкс. Уровень логической единицы при
сбросе UIH RST = 0,7·UCC MIN = 3,675 В. Параметры
импульса сброса микросхемы MAX6317H полностью удовлетворяют требованиям
документации на микроконтроллер.
Так как по требованиям технического задания необходимо реализовать
функцию аппаратной защиты от программных сбоев и микроконтроллер AT89C52 не
имеет встроенной защиты, то используем микросхему MAX6317H как сторожевой
таймер. По требованиям технической документации на выход микросхемы необходимо подключить резистор
номиналом 100 кОм. Выберем резистор R21: C1-4 100 кОм 0.25Вт ± 5%.
1.9
Разработка модуля индикации и аварий сигнализации
Схема электрическая принципиальная модуля индикации и
аварийной сигнализации (IND) приведена на рис.9.
Модуль состоит из 4 - х семисегментных светодиодных
индикаторов с десятичной точкой для индикации значения Q4, драйвера дисплея
ICM7212 фирмы MAXIM для управления индикаторами, динамической головки BA1 для
выдачи звуковой сигнализации и светодиодов VD1 - VD4 для индикации
сигналов X1 - X4. Описание использованных микросхем и
элементов приведено в приложении Н и И.
Так как значение Q4 вычисляется по формуле Q4=500 + N7/4, где
N7 это преобразованное в цифровую форму напряжение X7, следовательно Q4 не
может превышать значения Q4=500 + 4096/4=1524, следовательно 4 - х
семисегментных индикаторов с десятичной точкой достаточно для отображения Q4.
Выберем семисегментные индикаторы c десятичной точкой SA56 -
11SRWA фирмы KingBright, имеющие параметры: IПР = 10 мА, UПР
TYP = 1,85 UПР MAX = 2,5 В. Подключим индикаторы согласно
типовой схеме включения микросхемы и рассчитаем сопряжение: при всех 28 горящих
сегментах и токе IПР = 10 мА, рассеиваемая мощность микросхемы
ICM7212 будет равна: В Вт, что превышает
допустимые параметры эксплуатации микросхемы. Следовательно, данные
индикаторы нельзя напрямую подключать к ICM7212. Для соблюдения параметров
эксплуатации драйвера снизим питающее напряжение индикаторов до U = 3 В. Для
этого используем регулятор напряжения LM317 фирмы ON Semiconductor. Для задания
выходного напряжения в этой микросхеме используется внешний делитель.
Рассчитаем значение сопротивления R8 согласно документации на микросхему, где
R9=240 Ом: , но так как ток мкА, то можно воспользоваться упрощенной
формулой:
Рис.9. Модуль индикации и аварийной сигнализации. Схема
электрическая принципиальная
, так как для управления индикатором высокая точность выходного
напряжения не важна. Расчет R8: , откуда Ом. Выберем R8=330 Ом, В. Проверим параметры ICM7212: В, Вт, что удовлетворяет параметрам эксплуатации ICM7212. Выберем
R9: C1-4 240 Ом 0.25Вт ± 5%, R8: C1-4 330 Ом 0.25Вт ± 5%. Также, согласно
типовой схеме включения микросхемы LM317 в цепь выходного напряжения включим
конденсатор C17 = 1 мкФ. Выберем C17 Z5V 1 мкФ +80% - 20%.
Также, для отображения одной десятичной точки на индикаторе
подключим его вывод к земле через резистор R10. Значение R10: Необходимо
обеспечить напряжение на светодиоде не менее 2 В, следовательно В, Ом. Выберем R10: C1-4 100 Ом 0.25Вт ± 5%. при этом падение
напряжения на R10 будет равно В, следовательно напряжение на диоде будет не менее 2 В, что
удовлетворяет условиям сопряжения.
Выберем для индикации сигналов X1 - X4 светодиоды АЛ102А, имеющие
параметры: Iпр. =5 мА; Iпр. макс. =10 мА; Uпр. макс.
=2.8 В. "Зажигание" светодиодов производится током низкого
уровня буферных элементов КР1533ЛН2. Диоды загораются при подаче на буферные
элементы логической "1" и в элементы втекает ток IILКР1533лн1
= 24 мА. Для ограничения этого тока поставим резисторы R12 - R15.
Рассчитаем их, исходя из условий:
При Iсвеч = Iсвечmax = 10мА
падение напряжения на диоде UVD1 не более 1.8В. Тогда R12min=
(UCCmax-UOLЛН1min-UVD1) /Iсвечmax=295
Ом.
При Iсвеч = Iсвечmin = 5мА падение
напряжения на диоде UVD1 не более 2.4В. Тогда R12max= (UCCmin-UOLЛН1max-UVD1)
/Iсвечmin=490 Ом. Пусть R12-360 Ом, выделяемая мощность
38мВт. Выберем в качестве R12 - R14 резисторы С1-4 360 0.25Вт ± 5%.
В качестве динамической головки для выдачи звуковой сигнализации
применим головку 0.25ГДШ2, которая имеет следующие параметры: номинальная
мощность 0.1 Вт (макс.0.25 Вт), номинальное сопротивление 50 Ом, номинальный
диапазон воспроизводимых частот 450 - 3150 Гц.
Рассчитаем значения токов:
= 44,7 мА
= 70,7 мА
Управление динамической головкой производится в порта Р1.7
микроконтроллера через элемент КР1533ЛН2 (DD4.2). Резисторы R17 и R18
необходимы для согласования токов динамика и выхода микросхемы. Резистор R16
служит для ограничения тока через динамическую головку. Для коммутации тока на
головку используем транзистор VT1 КТ501Б. Для него: постоянный ток коллектора Iк
= 300 мА, предельное напряжение Uкэмах = 15 В, предельное напряжение
Uкбмах = 15 В, β = 40 ¸ 120,
падение напряжения Uкэ нас = 0.4 В. Для того, чтобы
обеспечить ток Iном через коллектор транзистора
минимально-необходимый ток базы должен быть IБ min= S ·Iном /
b = 2 · 41/40 = 2.1 мА.
Номиналы резисторов R17 и R18 рассчитываются исходя из следующих
условий:
- ток через элемент КР1533ЛН2 (DD4.2) не
должен превышать предельно допустимого;
- ток через базу транзистора не должен быть
меньше минимально-необходимого.
Тогда получим:
³ (UCCmax - UOLКР1533ЛН2min)
/ IOLКР1533ЛН2min = 425Ом,+ R18 £ (UCCmin - UКБmax)
/ Iбmin.
возьмем равным 430 Ом. В этом случае получаем:
£ (UCCmin - UКБmax) / Iбmin
- R17 = 1429 Ом.
Номинал резистора R18 возьмем равным 1500 Ом, выделяемая
мощность на резисторах R17 и R18 PR17= 0.06 Вт и PR18=0.007
Вт
Выберем в качестве R17 и R18 резисторы C1-4 430 Ом 0.25Вт ±
5% и C1-4 1,5 кОм 0.25Вт ± 5% соответственно.
Резистор R16 необходим для ограничения тока, протекающего
через динамическую головку. Его номинал выбирается таким образом, чтобы ток не
оказывался больше предельно-допустимого тока Imax или меньше
номинального тока Iном.
³ (UCCma x - UКЭнас min) / Ima
x= 27 Ом,£ (UCCmin - UКЭнасmax) / Iном
= 41 Ом.
Выберем номинал резистора равным R16 = 33 Ом, максимальный
ток через резистор:
R17max = (UCCmax - UКЭнас min) /
(R16 + Rном) = 66 мА
Тогда выделяемая мощность:
R16 = I2R16max · R16 = 0.143
Вт.
В качестве резистора R16 будем использовать C1-4 33 Ом 0.25Вт
± 5%.
2. Расчет
электрического сопряжения
2.1 Расчет
сопряжения по цепям данных
К шине данных микропроцессорной системы подключены: регистр
адреса КР1533ИР22, микросхема постоянного запоминающего устройства К573РФ6А,
микросхема энергонезависимой памяти DS1225AB, регистр для приема сигналов X1 -
X4 КР1533ИР22, цифро-аналоговый преобразователь AD5341, регистр для вывода
сигналов X1 - X4 КР1533ИР22, контроллер дисплея ICM7212, программируемый таймер
КР580ВИ53.
Постоянно подключенными к шине данных являются устройства:
таймер КР580ВИ53 и регистры адреса и выдачи сигналов X1 - X4 КР1533ИР22.
Рассмотрим возможные варианты подключения устройств:
Если работаем с регистром ввода X1 - X4, то:
Для токов высокого уровня:
OH (P0) ≥ IIHКР1533ИР22+ ILIК573РФ6А+
ILIDS1225AB+ ILIAD5341+ ILIICM7212+ IIHКР1533ИР22+
IIHКР1533ИР22+ IIHКР580ВИ53
мкА ≥ 20 мкА + 10 мкА + 1 мкА + 1 мкА + 1 мкА + 20 мкА
+ 20 мкА + 20 мкА
мкА ≥ 53 мкА - условие выполнено
Для токов низкого уровня:
OL (P0) ≥ IILКР1533ИР22+ ILIК573РФ6А+
ILIDS1225AB+ ILIAD5341+ ILIICM7212+ IILКР1533ИР22+
IILКР1533ИР22+ IILКР580ВИ53
мА ≥ 0,1 мА + 10 мкА + 1 мкА + 1 мкА + 1 мкА + 0,1 мА +
0,1 мА + 0,1 мА
мА ≥ 0,413 мА - условие выполнено
Если работаем с ПЗУ, то:
Для токов высокого уровня:
OH (P0) ≥ IIHК573РФ6А+ ILIКР1533ИР22+
ILIDS1225AB+ ILIAD5341+ ILIICM7212+ IIHКР1533ИР22+
IIHКР1533ИР22+ IIHКР580ВИ53
мкА ≥ 100 мкА + 20 мкА + 1 мкА + 1 мкА + 1 мкА + 20 мкА
+ 20 мкА + 20 мкА
мкА ≥ 203 мкА - условие выполнено
Для токов низкого уровня:
OL (P0) ≥ IILК573РФ6А+ ILIКР1533ИР22+
ILIDS1225AB+ ILIAD5341+ ILIICM7212+ IILКР1533ИР22+
IILКР1533ИР22+ IILКР580ВИ53
мА ≥ 1,6 мА + 20 мкА + 1 мкА + 1 мкА + 1 мкА + 0,1 мА +
0,1 мА + 0,1 мА
мА ≥ 1,933 мА - условие выполнено.
Если работаем с ОЗУ, то:
Для токов высокого уровня:
OH (P0) ≥ IIHDS1225AB+ ILIК573РФ6А+
ILIКР1533ИР22+ ILIAD5341+ ILIICM7212+ IIHКР1533ИР22+
IIHКР1533ИР22+ IIHКР580ВИ53
мкА ≥ 1 мкА + 10 мкА + 20 мкА + 1 мкА + 1 мкА + 20 мкА
+ 20 мкА + 20 мкА
мкА ≥ 93 мкА - условие выполнено
Для токов низкого уровня:
OL (P0) ≥ IILDS1225AB+ ILIК573РФ6А+
ILIКР1533ИР22+ ILIAD5341+ ILIICM7212+ IILКР1533ИР22+
IILКР1533ИР22+ IILКР580ВИ53
мА ≥ 1 мкА + 10 мкА + 20 мкА + 1 мкА + 1 мкА + 0,1 мА +
0,1 мА + 0,1 мА
мА ≥ 0,033 мА - условие выполнено
Если работаем с цифро-аналоговым преобразователем:
Для токов высокого уровня:
OH (P0) ≥ IIHAD5341+ ILIDS1225AB+
ILIК573РФ6А+ ILIКР1533ИР22+ ILIICM7212+ IIHКР1533ИР22+
IIHКР1533ИР22+ IIHКР580ВИ53
мкА ≥ 1 мкА + 1 мкА + 10 мкА + 20 мкА + 1 мкА + 20 мкА
+ 20 мкА + 20 мкА
мкА ≥ 93 мкА - условие выполнено
Для токов низкого уровня:
OL (P0) ≥ IILAD5341+ ILIDS1225AB+
ILIК573РФ6А+ ILIКР1533ИР22+ ILIICM7212+ IILКР1533ИР22+
IILКР1533ИР22+ IILКР580ВИ53
мА ≥ 1 мкА + 1 мкА + 10 мкА + 20 мкА + 1 мкА + 0,1 мА +
0,1 мА + 0,1 мА
мА ≥ 0,033 мА - условие выполнено
Если работаем с контроллером дисплея:
Для токов высокого уровня:
OH (P0) ≥ IIHICM7212 + ILIDS1225AB+
ILIК573РФ6А+ ILIКР1533ИР22+ ILIAD5341+ IIHКР1533ИР22+
IIHКР1533ИР22+ IIHКР580ВИ53
мкА ≥ 1 мкА + 1 мкА + 10 мкА + 20 мкА + 1 мкА + 20 мкА
+ 20 мкА + 20 мкА
мкА ≥ 93 мкА - условие выполнено
Для токов низкого уровня:
OL (P0) ≥ IILICM7212 + ILIDS1225AB+
ILIК573РФ6А+ ILIКР1533ИР22+ ILIAD5341+ IILКР1533ИР22+
IILКР1533ИР22+ IILКР580ВИ53
мА ≥ 1 мкА + 1 мкА + 10 мкА + 20 мкА + 1 мкА + 0,1 мА +
0,1 мА + 0,1 мА
мА ≥ 0,033 мА - условие выполнено
Если работаем с постоянно подключенными устройствами:
Для токов высокого уровня:
OH (P0) ≥ ILIHКР1533ИР22+ ILIК573РФ6А+
ILIDS1225AB+ ILIAD5341+ ILIICM7212+ IIHКР1533ИР22+
IIHКР1533ИР22+ IIHКР580ВИ53
мкА ≥ 20 мкА + 10 мкА + 1 мкА + 1 мкА + 1 мкА + 20 мкА
+ 20 мкА + 20 мкА
мкА ≥ 53 мкА - условие выполнено
Для токов низкого уровня:
OL (P0) ≥ ILIКР1533ИР22+ ILIК573РФ6А+
ILIDS1225AB+ ILIAD5341+ ILIICM7212+ IILКР1533ИР22+
IILКР1533ИР22+ IILКР580ВИ53
мА ≥ 20 мкА + 10 мкА + 1 мкА + 1 мкА + 1 мкА + 0,1 мА +
0,1 мА + 0,1 мА
мА ≥ 0,433 мА - условие выполнено
Рассчитаем сопряжение для емкостной нагрузки:
СLIM (P0) ≥ СINКР1533ИР22 + СINК573РФ6А
+ СINDS1225AB + СINAD5341 + СINICM7212 +
СINКР1533ИР22 + СINКР1533ИР22 +СINКР580ВИ53 +
СМ
100 пФ ≥ 10 пФ + 8 пФ + 10 пФ + 3 пФ + 5 пФ + 10 пФ +10
пФ +10 пФ + 10 пФ.
пФ ≥ 76 пФ - условие выполнено.
3. Расчет
аппаратных затрат
За единицу сложности аппаратных затрат принимается один
16-выводной корпус. Если корпус имеет большее число внешних выводов: 24, 28, 40
или 48, то его сложность оценивается с помощью коэффициента пересчёта, значение
которого равно соответственно 2, 3, 5 или 6. В таблице 8 представлены данные об
используемых в МПС микросхемах с точки зрения аппаратных затрат.
Таблица 8
Данные о выводах микросхем
Микросхема
|
Число выводов
|
Количество
микросхем
|
Коэффициент
пересчета
|
Условные
корпуса
|
AT89C52
|
40
|
1
|
5
|
5
|
КР1533ИД7
|
16
|
1
|
2
|
2
|
КР1533ИР22
|
20
|
3
|
2
|
6
|
DG409
|
8
|
1
|
1
|
1
|
КР580ВИ53
|
24
|
1
|
2
|
2
|
К1810ГФ84
|
18
|
1
|
2
|
2
|
MAX7347
|
16
|
1
|
1
|
1
|
ICM7212
|
40
|
1
|
5
|
5
|
КР1533ЛН2
|
14
|
2
|
1
|
2
|
КР1533ЛЛ1
|
14
|
1
|
1
|
1
|
КР1533ЛЕ1
|
14
|
1
|
1
|
1
|
КР1533ЛИ1
|
14
|
1
|
1
|
1
|
MAX6317H
|
6
|
1
|
1
|
1
|
LM317
|
3
|
1
|
1
|
1
|
ADR540B
|
3
|
1
|
1
|
1
|
DS1225AB
|
28
|
1
|
3
|
3
|
AD7992
|
10
|
1
|
1
|
1
|
AD5341
|
20
|
1
|
2
|
2
|
Аппаратные затраты составляют 21 микросхему или 39 условных
корпусов.
4. Расчет
потребляемой мощности
Список элементов, их потребляемая мощность (при UCCMAX
= 5,25В и IССMAX) и количество приведены в таблице 9.
Таблица 9
Потребляемая мощность
Микросхема
|
Количество
|
Максимальный
ток потребления, мА
|
Максимальная
мощность, мВт
|
AT89C52
|
1
|
20
|
105
|
КР1533ИД7
|
1
|
10
|
52,5
|
КР1533ИР22
|
3
|
25
|
131,25
|
DG409
|
1
|
12
|
63
|
КР580ВИ53
|
1
|
115
|
603,75
|
К1810ГФ84
|
1
|
50
|
262,5
|
MAX7347
|
1
|
0,1
|
0,33
|
ICM7212
|
1
|
115
|
603,75
|
КР1533ЛН2
|
2
|
40
|
420
|
КР1533ЛЛ1
|
1
|
30
|
157,5
|
КР1533ЛЕ1
|
1
|
30
|
157,5
|
КР1533ЛИ1
|
1
|
30
|
157,5
|
MAX6317H
|
1
|
0,02
|
0,105
|
LM317
|
1
|
50
|
262,5
|
ADR540B
|
1
|
15
|
78,75
|
DS1225AB
|
1
|
75
|
393,75
|
AD7992
|
1
|
0,25
|
1,3
|
AD5341
|
1
|
0,35
|
1,8
|
Резисторы
R1-R21
|
21
|
-
|
0.87
|
Светодиоды
VD1-VD4
|
4
|
40
|
210
|
Светодиодные
индикаторы HG1-HG4
|
4
|
280
|
1470
|
Пьезоголовка
BA1
|
1
|
|
250
|
Итого:
|
|
|
5338,37
|
В итоге потребляемая мощность МПС составила 5,338 Вт.
5. Выбор
фильтров питания
Для защиты интегральных микросхем от помех в цепь питания
микросхем включаются конденсаторы:
- для защиты от низкочастотных помех
конденсатор большой ёмкости (20 мкФ)
- для защиты от высокочастотных помех
необходимы конденсаторы меньшей ёмкости (0.01 - 0.1мкФ)
Конденсаторы от ВЧ помех ставятся по всей плате равномерно.
Конденсаторы от НЧ помех ставятся в непосредственной близости
от микросхем ближе к выводам питания и земли микросхем памяти.
Поскольку для микросхем ЦАП AD5341, АЦП AD7992,
мультиплексора DG409 и источника опорного напряжения помехозащищающие
конденсаторы уже выбраны в соответствии с документацией, то на оставшиеся 19
корпусов установим 3 конденсатора (C10, С11, С12) по 0.1 мкФ для защиты от
помех ВЧ. А также произведем аналогичную защиту цепи питания +3В, используя
конденсаторы С14, С15.
Будут использованы конденсаторы Z5V - 0,1 мкФ +80% - 20%.
В качестве конденсатора для защиты от помех низкой частоты
используем 1 конденсатор К53 - 18 - 16В - 20мкФ +50% - 20% (С9) и такой же
конденсатор на цепь питания в +3,3В.
6. Построение
временной диаграммы работы МПС
В соответствии с техническим заданием необходимо построить
временную диаграмму работы микропроцессорной системы в режиме записи в
оперативно-запоминающее устройство. Приведем в таблице 10 необходимые для
построения временные параметры микроконтроллера AT89C52 для тактовой частоты 12
МГц. Временная диаграмма приведена на рисунке 10.
Таблица 10
Временные параметры микропроцессорной системы
Символ
|
Параметр
|
Min (нс)
|
Max (нс)
|
Длина импульса
ALE
|
127
|
|
tAVLL
|
Время
предустановки адреса до сигнала ALE
|
43
|
|
tLLAX
|
Время удержания
адреса после сигнала ALE
|
48
|
|
tWLWH
|
Длина импульса 400
|
|
|
tLLWL
|
Задержка от ALE
до 200300
|
|
|
tAVWL
|
Время удержания
адреса до сигнала 203
|
|
|
tQVWX
|
Время
предустановки данных до 23
|
|
|
tQVWH
|
Действительные
данные
|
433
|
|
tWHQX
|
Удержание данных
после сигнала 33
|
|
|
Рис.10. Временная диаграмма работы микропроцессорной системы
в режиме записи в ОЗУ
7. Разработка
програмного обеспечения
Программное обеспечение реализовывалось по следующим
алгоритмам:
и алгоритм формирования Y3 и Y2:
Листинг программы:; объявляем сегмент с побитовым доступом для
флагов I2C и других: dbit 1: dbit 1CBusy: dbit 1: dbit 1: dbit 1: dbit 1: dbit
1at 30h: ds 3: ds 20: ds 20: ds 2: ds 3: ds 2: ds 2: ds 1: ds 2: ds 1: ds 1;
Счетчик битов для I2C: ds 1; Счетчик байтов для I2C: ds 1; Адрес ведомого: ds
3; таймаут: ds 8; Буфер передачи I2C, 8 байт: ds 8; Буфер приема I2C, 8 байтequ
10_ADDR equ 01110100b_ADDR equ
01000010bstart3hint1_alarm13hint2_power23hint3_keyb40h: dw 7FFh; константа Q0:
db 24; K: dw 1F4h; A0: db 4; A1equ 0C8h; глубина стека от 200 до 255 байт - 55
байтbit P1.0; сигнал запуска АЦПbit P1.2; разрешение загрузки старшего байта в
ЦАПbit P1.3; обновление регистров ЦАПbit P1.4; управляющий сигналbit P1.5;
управление контроллером дисплеяbit P1.6; управление таймером КР580ВИ53bit P1.7;
аварийная сигнализацияbit P3.0; синхронизация I2Cbit P3.1; данные I2Cbit P3.4; управление
таймером КР580ВИ53bit P3.5; управление сторожевым таймером:SP,#stack-1IE,#7Fh;
запретим прерыванияP1,#10011100bP3,#11000011bWDI; сбросим watchdogWDI
; // // // // // // // // // // // // // // //
; инициализация Т2 как источника внешнего прерывания0C9h,#00000000B;
перезапускаемый режим (0C9h - адрес T2MOD)0C8h,#01001000B; Режим таймера Т2.
Счетчик, счет от внешнего входа (0C8h - адрес T2CON)0CDh,#0FFH; Запись значения
в таймер Т2 (0CDh - адрес TH2)0CCh,#0FFH; Запись значения для 16 разрядного счета
(0CCh - адрес TH2)
; // // // // // // // // // // // // // // //
; инициализируем АЦПXmtDat,#00000010b; адрес
РУСXmtDat+1,#01010000b; управляющее словоSlvAdr,#ADC_ADDR; загрузим адрес с
запросом записи - последний бит "0"R0,#XmtDat;ByteCnt,#2;SendData;
; теперь необходимо вернуть указатель на регистр
результатаXmtDat,#00000000b; адрес регистра результатаSlvAdr,#01000010b;
загрузим адрес с запросом записи - последний бит
"0"R0,#XmtDat;ByteCnt,#1;SendData;
; // // // // // // // // // // // // // // /
; инициализируем контроллер клавиатурыXmtDat,#00000001b; адрес
РУСXmtDat+1,#00000000b; управляющее слово для 0х01XmtDat+2,#00000000b;
управляющее слово для 0х02 - автоувеличение адресаXmtDat+3,#10100000b;
управляющее слово для 0х03 - автоувеличение адресаXmtDat+4,#10000000b;
управляющее слово для 0х04 - автоувеличение адресаSlvAdr,#KEYB_ADDR; загрузим
адрес с запросом записи - последний бит
"0"R0,#XmtDat;ByteCnt,#5;SendData;
; теперь необходимо вернуть указатель на регистр
FIFOXmtDat,#00000000b; адрес регистра FIFOSlvAdr,#01110100b; загрузим адрес с
запросом записи - последний бит "0"R0,#XmtDat;ByteCnt,#1;SendData;
; // // // // // // // // // // // // // // // // // /
; загрузим константыDPTR,#constQ0; константа Q0A,#00h; старший
байтA,@A+DPTR;Q0,A; старший байтA,#01h; младший байтA,@A+DPTRQ0+1,A; младший
байтDPTR,#constK; уставка KA,#00h;A,@A+DPTR;K,A;DPTR,#constA0; константа
A0A,#00h; старший байтA,@A+DPTR;A0,A; старший байтA,#01h; младший
байтA,@A+DPTRA0+1,A; младший байтDPTR,#constA1; константа A1A,#00h;A,@A+DPTR;A1,A
; // // // // // // // // // // // // // // // // // // IE,#0BFh;
разрешим прерывания_CYCLE:DPTR,#0C000hA,@DPTR; введем X1 -
X4DPTR,#0D000h@DPTR,A; выведем X1 - X4CALC_Q1; посчитаем Y1no_Y1; проверяем,
надо ли выводить Y1Y1Y1_DELAY; задержка 90 мсY1_Y1:
; введем Х5, Х6, Х7Y1AINPUTCALC_Q2Y2_OR_Y3CALC_Q4OUTP_Y4IND
; DELAYWDI; сбросим watchdogWDIR7,#6_DELAY1:TMOD,#00000001b; режим
таймера 0 - счетчикTH0,#HIGH (65536-536)TL0,#LOW (65536-536)TR0; запустим
таймер_DELAY: jnb TF0,MAIN_DELAY; подождали 65 мсTF0TR0R7,
MAIN_DELAY1MAIN_CYCLE
; // // // // // // // // // // // // // // // //
; рассчет Q1_Q1:A; введем значение X1X1,CA; выдвинем второй бит
иC,X1; сделаем OR с первымX1,C; сохраним результатA; выдвинем третий бит иC,X1;
сделаем OR с предыдущимX1,C; сохраним результатA; выдвинем четвертый бит иC,X1;
сделаем OR с предыдущим
; конец, результат 0 или 1 образовался во флаге С
; // // // // // // // // // // // // // // // //
; задержка для Y1_DELAY:TMOD,#00000001b; режим таймера 0 - счетчикTH0,#HIGH
(65536-60000)TL0,#LOW (65536-60000)TR0; запустим
таймер_DELAY_M1:TF0,Y1_DELAY_M1; подождали 60 мс, надо еще 30TF0TR0TH0,#HIGH
(65536-30000)TL0,#LOW (65536-30000)TR0; запустим
таймер_DELAY_M2:TF0,Y1_DELAY_M2; подождали еще 30 мсTF0TR0
; // // // // // // // // // // // // // // // // /:DPTR,#8000h;
выбор канала мультиплексораA,#00h@DPTR,A; выставим номер канала;
подождемR1,#N5; адрес первого байто массива N5R7,#N; в массиве 10
элементов_CYCLE_N5:CONVST; включение АЦП; ожидание перехода АЦП из спящего в
нормальный режимCONVST; захват сигнала и запуск конвертации на
АЦПSlvAdr,#ADC_ADDR; загрузим адрес с запросом записи - последний бит
"0"R0,#RcvDat;ByteCnt,#2;RcvData; так как процедура чтения сама
увеличивает адрес на 1, то сама сформирует адрес с запросом на
чтениеR0A,#01hA,@R0; уберем из старшего байта старшие 4 бита@R1,A; запишем
старший байт элемента массива N5R0; адрес младшего байта из АЦПR1; адрес
следующего байта массива N5A,@R0; младший байт из АЦП@R1,A; младший байт
элемента массива N5R1; адрес следующего элемента массива
N5R7,AINPUT_CYCLE_N5R1,#N6R7,#NDPTR,#8001h; выбор канала
мультиплексораA,#00h@DPTR,A; выставим номер канала; подождем_CYCLE_N6:CONVST;
включение АЦП; ожидание перехода АЦП из спящего в нормальный режимCONVST;
захват сигнала и запуск конвертации на АЦПSlvAdr,#ADC_ADDR; загрузим адрес с
запросом записи - последний бит "0"R0,#RcvDat;ByteCnt,#2;RcvData; так
как процедура чтения сама увеличивает адрес на 1, то сама сформирует адрес с
запросом на чтениеR0A,#01hA,@R0; уберем из старшего байта старшие 4 бита@R1,A;
запишем старший байт элемента массива N5R0; адрес младшего байта из АЦПR1;
адрес следующего байта массива N5A,@R0; младший байт из АЦП@R1,A; младший байт
элемента массива N5R1; адрес следующего элемента массива N5R7,AINPUT_CYCLE_N6DPTR,#8002h;
выбор канала мультиплексораA,#00h@DPTR,A; выставим номер канала;
подождемCONVST; включение АЦП; ожидание перехода АЦП из спящего в нормальный
режимCONVST; захват сигнала и запуск конвертации на АЦПSlvAdr,#ADC_ADDR;
загрузим адрес с запросом записи - последний бит
"0"R0,#RcvDat;ByteCnt,#2;RcvData; так как процедура чтения сама
увеличивает адрес на 1, то сама сформирует адрес с запросом на
чтениеR0A,#01hA,@R0; уберем из старшего байта старшие 4 битаR1,#N7; адрес
N7@R1,A; запишем старший байт N7R0R1A,@R0; младший байт из АЦП@R1,A; запишем
младший байт N7
; // // // // // // // // // // // // // // // // // // //
_Q2:R7,#N; записываем счетчик элементов в массиве Q2R0,#N5; начальный адрес
массива N5R1,#N6; начальный адрес массива N6sum+2,#00h; обнуляем старший байт
суммы QiQ2+2,#00h; обнуляем старший байт суммы массива Q2_Q2_cycle:sum,#00h;
обнуление буфера промежуточных суммsum+1,#00h;sum+2,#00h;A,@R0; получение
старшего байтаA; сдвиг вправо старшего байта элемента массива N5R5,A; запись
старшего байта элемента массива N5 в R1R0; увеличение адреса для доступа к
младшему байту массива N5A,@R0; получение младшего байта элемента массива N5A;
сдвиг вправо младшего байта массива N5, в результате имеемR4,A; поделенный на 2
элемент массива N5C;R0; увеличение индекса для доступа к след. элементам
массиваA,@R1; получение старшего байта элемента массива N6R3,A; запись старшего
байта элемента массива N6 в R3R1; увеличение адреса для доступа к младшему
байту массива N6A,@R1; получение младшего байта элемента массива N6R2,A; запись
младшего байта элемента массива N6 в R2R1; увеличение индекса для доступа к
след. элементам массива
; подсуммирование КA,R4; младший байт N5/2A,#K; подсуммирование
КR4,A;A,R5; старший байт N5/2A,#0; учет переполненияR5,A;A,R4; младший байт
N5/2A,R2; сложение с младшим байтом N6sum,A; запись младшего байта
промежуточной суммыA,R5; старший байт N5/2A,R3; сложение со старшим байтом
N6sum+1,A; запись среднего байта промежуточной суммыCALC_Q2_m11;sum+2; учет
переполнения_Q2_m11:;A,R0ACCA,R1ACC
; сложение Q и текущей суммы элементовR0,#Q2; адрес Q2R1,#sum;
адрес sumR3,#3; количество байтов Q2C;_Q2_addm:;A,@R0; запись байта Q2A,@R1;
сложение с байтом sum@R0,A; запоминание байто суммыR0; адрес следующего байта
Q2R1; адрес следующего байта sumR3,CALC_Q2_addm; счет количества
байтовACCR1,ACCACCR0,ACCR7,CALC_Q2_cycle; счет количества элементов массива
; деление суммы Q2 на NR4,Q2+2; старший байт суммы Q2R3,Q2+1;
средний байт суммы Q2R2,Q2; младший байт суммы Q2R0,#N; делительA,R4; старший
байт суммы Q2B,R0; делительAB;R4,A; получение старшего байта частногоR5,B;
текущий остаток
;B,R0; делительR1,#16; количетво разрядов
делимого_Q2_dwb3:;C;A,R2;A; сдвиг влево младших разрядов частногоR2,A;A,R3;A;
сдвиг влево старших разрядов частногоR3,A;A,R5;A; сдвиг влево текущего
остаткаA,B,CALC_Q2_dwb1; сравнение текущего остатка с
делителем_Q2_dwb1:;CALC_Q2_dwb2; переход, если остаток меньше делителяA,B;
вычитание делителя из текущего остаткаR2; запись 1 в очередной разряд
частного_Q2_dwb2:;R5,A; сохранение остаткаR1,CALC_Q2_dwb3; повторить 16
разQ2+2,R2; запишем младший байт суммы Q2Q2+1,R3; запишем средний байт суммы
Q2Q2,R4; запишем старший байт суммы Q2
; // // // // // // // // // // // // // // // /_OR_Y3:
; сравним вычитанием Q2-Q0C; Вычитание осуществляем с
заемом.A,Q2+2; младший байт Q2A,Q0+1; вычитаем младший байт Q0A,Q2+1; средний
байт Q2A,Q0; вычитаем старший байт Q0A,Q2; старший байт Q2A,0; проверка, был ли
заемC,ACC.7; по результам вычитания анализируем получившееся значение на
знак.CREATE_Y2; если C=1 (Q2<Q0), переход на метку_Y3:; если Q2>Q0,
формируем Y3DPTR,#0A003h; запись управляющего слова в РУС канала 2A,#10110110b;
канал 2, тип - двоичный счетчик, режим 3 (делитель частоты), режим загрузки
младший, затем старший@DPTR,A; выведем словоDPTR,#0A002h; загрузим канал
2A,#0F4h; данные для загрузки - младший байт (для периода 1 мс при периоде CLК
2 мкс загрузим 500 или 1F4h)@DPTR,A; выведем данныеA,#01h; старший байт@DPTR,A;
выведем данныеDPTR,#0A003h; запись управляющего слова в РУС канала 1A,#01110010b;
канал 1, тип - двоичный счетчик, режим 1 (ждущий мультивибратор), режим
загрузки младший, затем старший@DPTR,A; выведем данныеDPTR,#0A001h; загрузим
канал 1A,#30h; данные для загрузки - младший байт (для формирования импульса
разрешения счета каналу 2 на 60 мс, при периоде CLK 2 мкс загрузим 30000 или
7530h)@DPTR,A; выведем данныеA,#75h; старший байт@DPTR,A; выведем данныеCE1;
разрешим счет каналу 1CE1_Y2:DPTR,#0A003h; запись управляющего слова в РУС
канала 0A,#00110010B; канал 0, тип - двоичный счетчик, режим 1 (ждущий
мультивибратор), режим загрузки младший, затем старший@DPTR,A; выведем слово;
подождемDPTR,#0A000h; загрузка канала 0A,#98h; данные для загрузки - младший
байт (для 30 мс при периоде 2 мкс загрузим 15000 или 3А98h)@DPTR,A; выведем
данныеA,#0H; старший байт@DPTR,A; выведем данныеCE0CE0
; // // // // // // // // // // // // // // // /_Q4:A,Q4CA,N7;
получение старшего байта N7A; сдвиг вправо старшего байта N7R3,A; запись
старшего байта N7 в R3A,N7+1; получение младшего байта N7A; сдвиг вправо
младшего байта массива N5, в результате имеемR2,A; поделенный на 2 элемент
N7CA,R3; получение старшего байта N7A; сдвиг вправо старшего байта N7R3,A;
запись старшего байта N7 в R3A,R2; получение младшего байта N7A; сдвиг вправо
младшего байта массива N5, в результате имеемR2,A; поделенный на 2 элемент N7
; поделили, теперь прибавим А0CA,R2; младший байт N7A,A0;
подсуммирование КR2,A;A,R3; старший байт N7A,A0+1;R3,A;Q4+1,R2; запишем Q4Q4,R3
; // // // // // // // // // // // // // // // /_Y4:DPTR,#9000h; адрес
ЦАПA,Q4+1; младший байт Q4@DPTR,A; выведем; подожемHBEN; разрешение загрузки
старшего байтаA,Q4; старший байт@DPTR,A; выводHBEN; сбросим HBENLDAC; обновим
регистр ЦАПLDAC; сбросим LDAC
; // // // // // // // // // // // // // // // /:R3,Q4; старший байт
4R2,Q4+1; младший байтR0,#10; делительR7,#4; 4 знакоместаDPTR,#0B000h; выберем
первое знакоместо_CYCLE:DIV_LED@DPTR,A; выведем очередной разряд Q4CS1; запишем
в контроллерCS1DPTRR7, IND_CYCLE
; // // // // // // // // // // // // // // // /_LED:; в R3, R2
делимое и результат, в R0 делитель, в А - остаток.A,R3; старший байт
делимогоB,R0; делительABR3,A; старший байт частногоA,B; текущий остатокB,R0;
делительR1,#8; количество разрядов остатка_LED_dwb3:C; очистим СA,R2A; сдвиг
младших частногоA,R2A; сдвиг остаткаA,B,DIV_LED_dwb1; сравнение остатка с
делителем_LED_dwb1:DIV_LED_dwb2; переход, если остаток меньше делителяA,B;
вычитание делителя из текущего остаткаR2; запись 1 в очередной разряд
частного_LED_dwb2:R1,DIV_LED_dwb3; повторить 8 раз
; // // // // // // // // // // // // // // // // // // // // //
_DELAY:R7,#0C7h; задержка примерно на 1 мс_DELAY1:R7,ALM_DELAY1
; // // // // // // // /прерывания // // // // // // // // //
/_alarm:DPTR,#0C000hA,@DPTR; введем X1 - X4DPTR,#0D000h@DPTR,A; выведем X1 -
X4IND_LOOP:ALM; звуковая сигнализация 500 ГцALM_DELAY;ALMALM_DELAYINT1_LOOP
; // // // // // // // // // // // // // // // // //
/_power:DPTR,#1000hA,#0FFh@DPTR,AR0, #0FFh_LOOP:DPTRA,@R0@DPTR,AR0, INT2_LOOP
; // // // // // // // // // // // // // // // // // // // // //
/_keyb:
; не реализовано, т.к. не указано в задании
; // // // // // /прерывания закончились // // // // // // // //
// //
; Процедуры для работы с I2С:; задержка на 5 мкс (2 на call, 2 на
ret, 1 на nop)
; // // // // // // // // // // // // // // // // /:; установка
SCL в 1SCLPin; установитьSCLPin,$; подождать, пока не установится в 1
; // // // // // // // // // // // // // // // // // /:; посылка
stop условия и освобождение шиныSDAPin; установка SDA в 0SCLHigh; установка SCL
в 1BitDly; задержкаSDAPin; посылка stop условияBitDly; задержкаI2CBusy; шина
свободна
; // // // // // // // // // // // // // // // // // :; процедура
посылки байта, байт для посылки в АссBitCnt,#8; Set bit count.:A; выдвинем 1
бит в СSDAPin,C; выставим бит на шинеSCLHigh; импульс синхронизацииBitDly;
задержкаSCLPin; конец импульсаBitDlyBitCnt,SBloop; повторить для 8 битSDAPin;
освободим линию для приема подтверженияSCLHigh; SCL для
подтвержденияBitDlySDAPin,SBEX; получено ли подтверждениеNoAck; если не
получено, фиксируем:SCLPin; завершение приема подтвержденияBitDly
; // // // // // // // // // // // // // // // // // // // :;
процедура посылки старт-условия и адреса ведомого I2C устройства
; адрес ведомого в переменной SlvAdrI2CBusy; займем шинуNoAck;
очистим флаг подтвержденияBusFault; и флаг ошибкиSCLPin,Fault; проверка,
свободна ли шинаSDAPin,FaultSDAPin; начало посылки старт-условия (SCL в 1, SDA
1->0)BitDly; задержкаSCLPin; сброс SCLBitDly; завершение старт
процедурыA,SlvAdr; получим адрес ведомого иSendByte; пошлем его в
шину:BusFault; если ошибка, то установить флаг; и выйти
; // // // // // // // // // // // // // // // // // // // // /:;
процедура посылки данных (мах 8 байт) в I2C устройство
; в переменной ByteCnt сколько байт послать
; в переменной SlvAdr адрес ведомого
; в регистре R0 адрес буфера с даннымиGoMaster; занимаем шину и
посылаем адресNoAck,SDEX; если ведомый не отвечает, то ошибка:A,@R0; получим
очередной байт из буфераSendByte; пошлем его в шинуR0; перейдем к следующему
байтуNoAck,SDEX; если была ошибка, выходимByteCnt,SDLoop; повторить до конца
буфера:SendStop; передача закончена, посылка стоп-условия и освобождение шины
; // // // // // // // // // // // // // // // // // :; прием
байта от I2C устройства
; в Асс принятый байтBitCnt,#8; счетчик бит:SCLHigh; прочитаем
очередной битBitDlyC,SDAPin; перепишем в СA; перепишем бит в АSCLPin; очистим
SCLBitDlyBitCnt,RBLoop; повторим для 8 битAcc; сохраним
АссA,ByteCnt;A,#1,RBAck; проверим, последний байт или нетSDAPin; на последний
байт подтверждение не выдаемRBAClk; и переходим сразу к выдаче SCL:SDAPin;
выдаем подтверждение на непоследний байт:SCLHigh; CLK для подтвержденияAcc;
восстановим АBitDly; задержкаSCLPinSDAPin; очистим SDABitDly
; // // // // // // // // // // // // // // // // // // // // //
// :; процедура приема байтов (мах 8) от ведомого I2C устройства
; в переменной ByteCnt сколько байт принять
; в переменной SlvAdr адрес ведомого
; в регистре R0 адрес буфера для данныхSlvAdr; формирование адреса
ведомого с запросом на чтениеGoMaster; посылка адресаNoAck,RDEX; проверка,
ответил ли ведомый:RcvByte; принимаем байт@R0,A; сохраняем егоR0; переходим к
следующему адресу буфераByteCnt,RDLoop; повторим для всех байт:SendStop;
послать стоп-условие и освободить шину
; // // // // // // // // // // // // // // // // // // // // //
// .
Заключение
В результате проектирования была создана микропроцессорная
система для управления объектом.
Основные характеристики:
·
Используется
микроконтроллер AT89С52;
·
В МПС
имеется память двух типов: ПЗУ емкостью 8 Кбайт и ОЗУ емкостью 8 Кбайт;
·
Для
ввода используется клавиатура, состоящая из 25 клавиш;
·
Для
вывода используются светодиодные индикаторы, кроме того, имеется световая
аварийная сигнализация;
·
МПС
принимает информацию в виде 3 аналоговых и 6 двоичных сигналов, из которых 2
являются сигналами от датчиков аварийных ситуаций;
·
МПС
выдает информацию в виде 1 аналогового и 3 двоичных сигналов.
Возможно расширение управляющих алгоритмов МПС. Также имеются
возможности по расширению аппаратной конфигурации: в системе остался один
незадействованный аналоговый вход, шесть клавиш, не имеющих функциональной
нагрузки.
Основными результатами проектирования являются принципиальная
электрическая схема МПС и программа, реализующая управляющие алгоритмы МПС.
Приложение.
Спецификация используемых элементов
№
|
обозначение
|
Наименование
|
Кол-во
|
Примечание
|
Микросхемы:
|
1
|
DD1
|
КР1533ЛЛ1
|
1
|
|
2
|
DD2
|
AT89C52
|
1
|
Atmel
|
3
|
DD3
|
КР1533ЛИ1
|
1
|
|
4
|
DD4,DD18
|
КР1533ЛН2
|
2
|
|
5
|
DD5
|
DG409
|
1
|
Analog Devices
|
6
|
DD6
|
AD7992
|
1
|
Analog Devices
|
7
|
DD7, DD8, DD16
|
КР1533ИР22
|
3
|
|
8
|
DD9
|
КР1533ИД7
|
1
|
|
9
|
DD10
|
AD5341
|
1
|
Analog Devices
|
10
|
DD11
|
К573РФ6А
|
1
|
|
11
|
DD12
|
КР580ВИ53
|
1
|
|
12
|
DD13
|
КР1810ГФ84
|
1
|
|
13
|
DD14
|
DS1225AB
|
1
|
Maxim
|
14
|
DD15
|
ICM7212
|
1
|
Maxim
|
15
|
DD17
|
MAX7347
|
1
|
Maxim
|
16
|
DA1
|
ADR540B
|
1
|
Analog Devices
|
17
|
DA2
|
MAX6317H
|
1
|
Maxim
|
18
|
DA3
|
LM317
|
1
|
ON
Semiconductor
|
Резисторы:
|
18
|
R1, R19, R20
|
C1-4-0.25-1 кОм
±5%
|
3
|
|
19
|
R2, R3,R21
|
C1-4-0.25-100
кОм ±5%
|
3
|
|
20
|
R5
|
C1-4-0.25-24
кОм±5%
|
1
|
|
|
|
|
|
|
|
№
|
обозначение
|
Наименование
|
Кол-во
|
Примечание
|
21
|
R8
|
C1-4-0.25-330
Ом±5%
|
1
|
|
22
|
R9
|
C1-4-0.25-240
Ом±5%
|
1
|
|
23
|
R10
|
C1-4-0.25-100
Ом±5%
|
1
|
|
24
|
R12. R15
|
C1-4-0.25-360
Ом±5%
|
4
|
|
25
|
R16
|
C1-4-0.25-33 Ом±5%
|
1
|
|
26
|
R17
|
C1-4-0.25-430
Ом±5%
|
1
|
|
27
|
R18
|
C1-4-0.25-1,5
кОм±5%
|
1
|
|
Конденсаторы:
|
28
|
С1, C2
|
X7R NPO 30 пФ ±
20%
|
2
|
|
29
|
С3, C4, C6, C13
|
K10-17 0.1 мкФ
- 20% +80%
|
4
|
|
30
|
С5,C7
|
К53 - 18 - 16В
- 10мкФ +50% - 20%
|
2
|
|
31
|
С8
|
X7R NPO 20 пФ -
20% +80%
|
1
|
|
32
|
С9, C14
|
К53 - 18 - 16В
- 20мкФ +50% - 20%
|
2
|
|
33
|
C16
|
К10-17 1мкф -
20% +80%
|
1
|
|
34
|
С10, C11, C12,
C15
|
К10-17 0,1 мкФ
- 20% +80%
|
4
|
|
Светодиоды:
|
35
|
VD1. VD4
|
АЛ102А
|
4
|
|
36
|
HG1-HG4
|
SA56 - 11SRWA
|
4
|
KingBright
|
Резонаторы:
|
37
|
ZQ1
|
ZTA - 12 МГц,
кварцевый
|
1
|
|
38
|
ZQ2
|
ZTA - 500 кГц,
керамический
|
1
|
|
Кнопки:
|
39
|
K0. K24
|
DTS-24N,
(SWT-9) кнопка тактовая
|
25
|
|
№
|
обозначение
|
Наименование
|
Кол-во
|
Примечание
|
Пьезоголовки:
|
40
|
ВА1
|
0.25ГДШ2
|
1
|
|
Транзисторы
|
41
|
VT1
|
КТ501Б
|
1
|
|