Помощь в написании студенческих работ
Антистрессовый сервис

Микропроцессорные системы

КурсоваяПомощь в написанииУзнать стоимостьмоей работы

Рисунок 1. Структурная схема МКС МКС принимает множество информационных сигналов об объекте управления: цифровых {X} и аналоговых {U} от соответственно цифровых (ДД) и аналоговых датчиков {АД}, вырабатывает множество управляющих сигналов {Y} в соответствии с законом управления и выводит их в исполнительные механизмы (ИМ). Закон управления реализуется микроконтроллером на основе сигналов {X} и {U… Читать ещё >

Микропроцессорные системы (реферат, курсовая, диплом, контрольная)

МИНОБР НАУКИ РОССИИ ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ Отчет по курсовой работе по дисциплине

«Микропроцессорные системы»

Вариант 15

Выполнил: студент гр. 9306

Шемякин А.В.

Проверил:Петров Г. А.

1. Структурная схема микроконтроллерной системы управления

2. Схема подключения МК

3. Оценки характеристик разработанной МКС

4. Обработка информации, поступающей с дискретных датчиков

4.1 Реализация с использованием команд условных переходов

4.2 Реализация с использованием команд битовых операций

4.3 Реализация табличным способом

4.4 Результаты оценки времени

5. Обработка информации, поступающей с аналоговых датчиков

6. Управление пуском — остановом электродвигателя

7. Управление технологическим параметром в заданных пределах

8. Обработка запроса прерываний

9. Алгоритм гибкого управления объектом

10. Таблица портов и адресов

11. Временная оценка

12. Исходный текст программы

1. Структурная схема микроконтроллерной системы управления

Рисунок 1. Структурная схема МКС МКС принимает множество информационных сигналов об объекте управления: цифровых {X} и аналоговых {U} от соответственно цифровых (ДД) и аналоговых датчиков {АД}, вырабатывает множество управляющих сигналов {Y} в соответствии с законом управления и выводит их в исполнительные механизмы (ИМ). Закон управления реализуется микроконтроллером на основе сигналов {X} и {U} от ОУ и информации с пульта управления (ПУ). МК содержит основные модули, обеспечивающие выполнение программ управления объектом, хранение данных, а также периферийные модули для подключения датчиков и исполнительных механизмов.

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

С помощью последовательного канала связи (ПсК) МК может передавать обработанную информацию персональному компьютеру (ПК) более высокого уровня по запросу от него.

2. Схема подключения МК

Рисунок 2. Схема подключения МК

L1, L2 — датчики уровня воды.

Дн — датчик напряжения ДД:

X1, X2, X3, X4 — входы с дискретных датчиков.

АД: информация дискретная алгоритм

U1, U2, — входы с аналоговых датчиков.

T1, T2, T3 — входы с датчиков температуры ПУ включает в себя:

1. Матрицу кнопок, включающую: числовую шестнадцатеричную панель для ввода К, кнопку Ввод для занесения введенного K в память, кнопки Пуска и Остановки электродвигателя, тумблер Останова.

Схема расположения кнопок:

Рисунок 3. Схема кнопок В не нажатом состоянии кнопки подтянуты к питанию.

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

При нажатии на «Пуск двиг», осуществляется запуск электродвигателя, при нажатии на «Ост. двиг» — его остановка.

При переключения тумблера в состояние «Ост.» осуществляется приостановка работы МК. В режиме остановки МК перестает обрабатывать информацию с датчиков, при этом сохраняется возможность ввода К с ПУ, и возможность работы с терминалом. Обратное переключение возвращает систему в нормальный режим работы.

2. Кнопку «Сброса», заведенную на вход Reset МК. При нажатии

на вход Reset подается логическая единица.

3. Зуммер.

Внешний сдвиговый регистр:

Используется для вывода необходимого количества управляющих сигналов в условиях нехватки выводов МК.

Вход D регистра используется для передачи бит.

По положительному фронту входа Sh осуществляется сдвиг регистра на один разряд и занесение в младший логического состояния на входе D.

По положительному фронту на входе St состояние разрядов внутри регистра передается на внешние выводы.

Т.к. вывод на сдвиговый регистр занимает довольно длительное время (~50 мкс) к его выходам не заведены сигналы требующие малого времени переключения (так Y2, Y6 подключены к выводам МК, т.к. на них необходимо выдавать импульсы длительностью 20 мкс и 30 мкс соответственно). Состояние регистра отображается в памяти МК, и при изменении состояние сначала изменяется значение в памяти, а затем осуществляется вывод в регистр.

Терминал:

Через терминал можно осуществляться вывод информации о состоянии системы (K; Q; Tmin, Tmax, Tsr; x1, x2, x3, x4; L1, L2), а также ввод новых значений констант (K; Q; Tmin, Tmax).

3. Оценки характеристик разработанной МКС а) максимального времени реализации одного цикла управления (от пуска системы до окончания однократной реализации заданного алгоритма). Время реализации определяется симулятором микроконтроллера автоматически при выполнении программы.

б) емкости памяти данных и памяти программ (в байтах), необходимые для реализации разработанных программ, оценивается студентом самостоятельно.

Для реализации разработанной программы необходимо: 26 байт памяти данных + память для стека, и 1867 байт памяти программ.

4. Обработка информации, поступающей с дискретных датчиков

МКС опрашивает двоичные датчики Х1, …, Хn и вычисляет логическую (булеву) функцию Y1= f (Х1, …, Хn) в соответствии с вариантом задания. При единичном значении функции МКС вырабатывает в исполнительный механизм (ИМ) выходной сигнал Y1 = 1 заданной длительности t1. Это означает, что через t1 после выдачи единичного сигнала Y1 необходимо выработать нулевое значение сигнала Y1. Логическую функцию требуется реализовать тремя вариантами и сделать выбор при оформлении проекта в пользу самого экономичного:

с использованием команд условных переходов;

с использованием команд битовых операций;

табличным способом.

Номер варианта

Функция y1 = f (x1, …, xn)

Время t1, мкс.

/x1/x2x3 x4

Таблица истинности функции:

X4

X3

X2

X1

Y

4.1 Реализация с использованием команд условных переходов Алгоритм реализации:

исунок 4.

Код на ASM:

$mod812

PortX data 20h

PortY data 21h

mov A, PortX

mov TMOD, #01B

mov TL0, #1 100 0100B

mov TH0, #0

rlc A

jc m_set

rlc A

jnc m_clr

rlc A

jc m_clr

rlc A

jc m_clr

m_set:

setb PortY.0

jmp m_next

SETB TCON.4

m_clr:

clr PortY.0

m_next:

end

Рисунок 5.

4.2 Реализация с использованием команд битовых операций Алгоритм реализации:

Рисунок 6.

Код на ASM:

$mod812

PortX data 20h

PortY data 21h

mov TMOD, #01B

mov TL0, #1 100 0100B

mov TH0, #0

mov C, PortX.6

anl C, /PortX.4

anl C, /PortX.5

orl C, PortX.7

jnc m_clr

m_set:

setb PortY.0

SETB TCON.4

jmp m_next

m_clr:

clr PortY.0

m_next:

end

Рисунок 7.

4.3 Реализация табличным способом Алгоритм реализации:

Рисунок 8.

Код на ASM:

$mod812

jmp Start

PortX data 20h

PortY data 21h

Y_Value:

db 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1

mov R0, #30h

mov A, #00h

mov TMOD, #01B

mov TL0, #1 100 0100B

mov TH0, #00B

movA, PortX

swapA

anlA, #0fh

addA, #40h

movR1, A

cjne@R1, #01h, m_clr

m_set:

setb PortY.0

jmp m_next

SETB TCON.4

m_clr:

clr PortY.0

m_next:

end

Рисунок 9.

4.4 Результаты оценки времени Время измерялось от начала запуска программы до Breakpoint установленного на последней команде.

Способ с использованием команд условных переходов: 321 мкс Способ с использованием команд битовых операций: 383 мкс Табличный способ: 334 мкс Таким образом самый экономичный с точки зрении времени выполнения способ с использованием команд условных переходов.

5. Обработка информации, поступающей с аналоговых датчиков

Сигналы с аналоговых датчиков U1 и U2 преобразуются в цифровую форму в АЦП в 8-разрядные коды, представляющие целые числа без знака и поступают на обработку в МП контроллера. Величина K — 8-разрядный код, поступающий в контроллер с клавиатуры пульта управления.

Полученное значение функции Nu = f (Nu1, Nu2, K) сравнивается с константой Q, хранящейся в РПД и в зависимости от результатов сравнения МКС вырабатывает двоичные управляющие воздействия y2 или y3 длительностью t2 или t3 соответственно.

Номер варианта

Функция Nu = f (Nu1, Nu2, K)

Время t2, мкс.

Время t3, мкс.

min (Nu1; Nu2+K)

Алгоритм реализации:

Рисунок 10.

Код на ASM:

$mod812

Start:

movADCCON2, #10h

callAdc_Wait

movNu1, A; Значение с первого датчика

movADCCON2, #11h

callAdc_Wait

movNu2, A; Значение со второго датчика

; Реализация функции min (Nu1, Nu2 + K)

clrC

addA, K

movR0, A

subbA, Nu1

jca_Nu1

movA, R0; Nu2 + K < Nu1

jmpa_Next

a_Nu1:

clr C

mov A, Nu1; Nu1 < Nu2 + K

a_Next:

; Сравнение min значения с Q

subbA, Q

jca_Q

; Q < min

setbY3

; Запуск таймера

movTH0, #1 110 1100b

movTL0, #111 0100b

setbTCON.4

jmpa_Exit

a_Q:

; Q > min

setb Y2

call wait_20us

clrY2

wait_20us:

nop

nop

nop

nop

nop

nop

nop

nop

nop

nop

nop

nop

nop

nop

nop

nop

jmp Start

a_Exit:

end

Временная оценка: 182мкс Рисунок 11.

6. Управление пуском — остановом электродвигателя

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

Рисунок 12. Схема управления функцией пускателя электропривода Алгоритм реализации:

Рисунок 13.

Код на ASM:

$mod812

jnbM_usensor, m_Stop; Нет питания-> остановка

jnbM_stop_key_press, m_Stop; Нажата кнопка остановки-> остановка

jbM_start_key_press, m_Exit; Кнопка пуска отпущена -> состояние

не изменяется

; Запуск двигателя

setbM_control

jmpm_Exit

m_Stop:

; Остановка двигателя

clrM_control

end

Рисунок 14.

Временная оценка: 56мкс

7. Управление технологическим параметром в заданных пределах Необходимо обеспечить поддержание значения параметра, температуры среды в заданных пределах (Тmin — Тmax).

Обработка данных заключается в следующем. Введенные с m датчиков значения параметров (m=3) запоминаются в виде массива в ячейках области ввода памяти данных контроллера. Далее требуется вычислить среднее значение температуры: Tср = ?Ti/m, где m — количество параметров температур Ti. После определения Tср необходимо ее сравнить с Tmin и Tmax и сформировать на линиях выбранного выходного порта контроллера соответствующие УС, например Y4 и Y5, поступающие в ИМ «Охладитель среды» и «Нагреватель среды» соответственно, подключенные к данным линиям выходного порта.

Алгоритм реализации:

Рисунок 15.

Код на ASM:

$mod812

movADCCON2, #12h

callAdc_Wait

mov (Tm+0), A; Значение температуры с первого датчика

movADCCON2, #13h

callAdc_Wait

mov (Tm+1), A; Значение температуры со второго датчика

movADCCON2, #14h

callAdc_Wait

mov (Tm+2), A; Значение температуры с третьего датчика

; Инициализация регистров используемых в цикле

movR0, #03h

movR1, #Tm

movR2, #00h

; Цикл обработки массива из 3 элементов (нахождение среднего арифметического)

t_Loop:

movA, @R1

movB, #03h

divAB

addA, R2

movR2, A

incR1

djnzR0, t_Loop

movTsr, A; Занесение полученного значения в память

; Сравнение средней температуры с граничными значениями

clrC

subbA, Tmin

jct_Low; Температура ниже нормы

clrC

movA, Tsr

subbA, Tmax

jnct_Hi; Температура выше нормы

clrY4; Выключили охладитель

clrY5; Выключили нагреватель

jmpt_Exit

t_Low:

clrY4; Выключили охладитель

setbY5; Включили нагреватель

jmpt_Exit

t_Hi:

setbY4; Включили охладитель

clrY5; Выключили нагреватель

t_Exit:

end

Рисунок 16.

Временная оценка: 238мкс

8. Обработка запроса прерываний

МПС обрабатывает запросы прерывания двух приоритетных уровней.

Запрос на прерывание по сигналу отказа источника питания. Прерывания работы МПС при отказе источника питания имеют высший приоритет. МПС при этом вырабатывает выходной сигнал Y6 установки объекта управления в исходное состояние. Сигнал Y6 представляет собой два прямоугольных импульса длительностью 30 мкс, следующие с интервалом в 30 мкс. После выполнения указанных действий требуется контроллер перевести в ждущий режим. Ждущий режим моделируется бесконечным циклом, выход из которого возможен только при нажатии кнопки «Сброс», подключенной ко входу Reset МК.

Запрос на прерывание по сигналу аварийного датчика. Прерывания от сигнала аварийного датчика включают на пульте управления аварийную сигнализацию (звуковая 500 Гц) и обеспечивают выдачу в область связи с ПК сигналов дискретных датчиков x1, …, x4, среднего значения Тср (задача 1.5), значения констант K и Q, значение датчиков L1, L2 (см. 1.7). После выполнения указанных действий требуется контроллер перевести в ждущий режим.

Алгоритм реализации:

Прерывание по сигналу отказа источника питания:

1. Импульсы длительностью 30 мкс реализуются программным образом.

3. Переход в ждущий режим.

Прерывание по сигналу аварийного датчика:

1. Запускается таймер управляющий звуковой сигнализацией

(прерывания таймера более приоритетные чем прерывание по сигналу аварийного датчика).

2. Осуществляется передача в последовательный канал связи информации о состоянии системы.

3. Переход в ждущий режим.

Код на ASM:

$mod812

int_Ext0:

; Прерывание по сигналу отказа источника питания

setb Y6

mov R7, #14

pause_set0:

djnz R7, pause_set0

clr Y6

mov R7, #14

pause_clr:

djnz R7, pause_clr

setb Y6

mov R7, #14

pause_set1:

djnz R7, pause_set1

clr Y6

jmp Wait_Regim

int_Timer0:

pushAcc

pushPSW

clrTCON.4

callSend_Port_Value

clrFBusyPort

popPSW

popAcc

reti

int_Ext1:

setbET2

setbPT2

setbTR2

movRCAP2H, #0f8h

movRCAP2L, #030h

movTH2,#0f8h

movTL2,#030h

clrDSR

iE1_Wait:

jbDTR, iE1_Wait

callShowe_Info

setbDSR

jmp wait_regim

int_Timer1:

pushAcc

pushPSW

jnbPump1, it1_next0

; 1 насос работает

movA, (PTime1+3)

addA, #01h

mov (PTime1+3), A

jncit1_next0

movA, (PTime1+2)

addA, #01h

mov (PTime1+2), A

jncit1_next0

movA, (PTime1+1)

addA, #01h

mov (PTime1+1), A

jncit1_next0

movA, (PTime1+0)

addA, #01h

mov (PTime1+0), A

it1_next0:

jnbPump2, it1_next1

; 2 насос работает

movA, (PTime2+3)

addA, #01h

mov (PTime2+3), A

jncit1_next1

movA, (PTime2+2)

addA, #01h

mov (PTime2+2), A

jncit1_next1

movA, (PTime2+1)

addA, #01h

mov (PTime2+1), A

jncit1_next1

movA, (PTime2+0)

addA, #01h

mov (PTime2+0), A

it1_next1:

popPSW

popAcc

reti

int_Timer2:

pushAcc

pushPSW

clrTF2

cplBuzzer

movPort, Port_tmp

callSend_Port_Value

popPSW

popAcc

reti

wait_regim:

jmp wait_regim

end

Рисунок 17.

Временная оценка: 129мкс

9. Алгоритм гибкого управления объектом Данный алгоритм должен обеспечить закон гибкого управления по состоянию объекта. Требуется разработать алгоритм и программу управления насосной станцией осушительной системы, состоящей из двух насосных агрегатов Р1 и Р2 и двух датчиков контроля уровня воды. Насосы работают по следующему закону управления объектом:

датчик L1 — при L1=0 насосы не включаются, а при L1=1 включается насос, имеющий меньшее количество наработанных часов;

датчик L2 — данный датчик срабатывает при дальнейшем повышении уровня воды, при L2=1 включается второй насос и начинают работать уже оба насоса. При L2=0, т. е. понижении уровня воды, один из насосов выключается и продолжает работать насос с меньшим количеством наработанных часов, т. е. требуется обеспечить подсчет и сравнение времени работы насосов. Когда уровень воды понизится и L1=0, то последний работающий насос также выключается.

Время работы насосов подсчитывается с помощью таймера. Таймер установлен на максимально длительное время. По прерываниИ для работающего насоса на единицу увеличивается наработанное время.

Алгоритм реализации:

Рисунок 18.

Пример кода на ASM:

$mod812

jbPump1, n_Proverka

jbPump2, n_P2

; Насосы отключены

jnbL2, n_State0

setbPump1

setbPump2

jmpn_Exit

n_State0:

jnbL1, n_Exit

; Выбор насоса для включения

movA, (PTime1+3)

cjneA, (PTime2+3), n_select0

movA, (PTime1+2)

cjneA, (PTime2+2), n_select0

movA, (PTime1+1)

cjneA, (PTime2+1), n_select0

movA, (PTime1+0)

cjneA, (PTime2+0), n_select0

n_select0:

jcn_onP10

setbPump2; 2 насос отработал меньше -> включение

jmpn_Exit

n_onP10:

setbPump1; 1 насос отработал меньше -> включение

jmpn_Exit

n_Proverka:

jnbPump2, n_P1

; Работают оба насоса

jbL1,n_State1

clrPump1

clrPump2

jmpn_Exit

n_State1:

jbL2, n_Exit

; Выбор насоса для отключения

movA, (PTime1+3)

cjneA, (PTime2+3), n_select1

movA, (PTime1+2)

cjneA, (PTime2+2), n_select1

movA, (PTime1+1)

cjneA, (PTime2+1), n_select1

movA, (PTime1+0)

cjneA, (PTime2+0), n_select1

n_select1:

jcn_onP11

clrPump1; 1 насос отработал больше -> выключение

jmpn_Exit

n_onP11:

clrPump2; 2 насос отработал меньше -> выключение

jmpn_Exit

n_P1:

; Работает 1 насос

jbL1, n_State2

clrPump1

jmpn_Exit

n_State2:

jnbL2, n_Exit

setbPump2

jmpn_Exit

n_P2:

; Работает 2 насос

jbL1, n_State3

clrPump2

jmpn_Exit

n_State3:

jnbL2, n_Exit

setbPump1

jmpn_Exit

n_Exit:

end

Рисунок 19.

Временная оценка: 327мкс

10. Таблица портов и адресов

Порт/адрес

Функция

P0.0

key_line1

P0.1

key_line2

P0.2

key_line3

P0.3

key_line4

P0.4

X1

P0.5

X2

P0.6

X3

P0.7

X4

P1.0

U1

P1.1

U2

P1.2

T1

P1.3

T2

P1.4

T3

P1.5

L1

P1.6

L2

P1.7

u_motor_sensor

P2.0

key_column1

P2.1

key_column2

P2.2

key_column3

P2.3

key_column4

P2.4

key_column5

P2.5

Out_data

P2.6

Out_sh

P2.7

Out_st

P3.0

;

P3.1

;

P3.2

INT0

P3.3

INT1

P3.4

DSR

P3.5

DTR

P3.6

Y6

P3.7

Y2

0x20

key_old

0x21

key_old

0x22

key_old

0x23

key_old

0x24

K_tmp

0x25

Port

0x26

Port_tmp

0x27

Flags

0x30

K

0x31

Q

0x32

Tmin

0x33

Tmax

0x34

Tm (массив)

0x35

Tm

0x36

Tm

0x37

Tsr

0x38

Nu1

0x39

Nu2

0x40

PTime1 — 4 байта

0x44

Ptime2 — 4 байта

11. Временная оценка Время выполнения отдельных частей кода

Подпрограмма

Время

Подготовка, инициализация

27 мкс

Чтение клавиатуры

45 мкс

Выполнение символа с клавиатуры

8 мкс

Запуск АЦП

41 мкс

Обработка датчиков ДД

18 мкс

Обработка аналоговых датчиков

33 мкс

Управление двигателем

14 мкс

Обработка значений температуры

39 мкс

Всего

225 мкс

12. Исходный текст программы

$mod812

;============ Распределение портов ============

; P0.0 — key_line1

; P0.1 — key_line2

; P0.2 — key_line3

; P0.3 — key_line4

key_linedataP0

; P0.4 — X1

X1bitP0.4

; P0.5 — X2

X2bitP0.5

; P0.6 — X3

X3bitP0.6

; P0.7 — X4

X4bitP0.7

; P1.0 — U1 (Analog in)

; P1.1 — U2 (Analog in)

; P1.2 — T1 (Analog in)

; P1.3 — T2 (Analog in)

; P1.4 — T3 (Analog in)

; P1.5 — L1

L1bitP1.5

; P1.6 — L2

L2bitP1.6

; P1.7 — u_motor_sensor

M_usensorbitP1.7

; P2.0 — key_column1

; P2.1 — key_column2

; P2.2 — key_column3

; P2.3 — key_column4

; P2.4 — key_column5

key_portdataP2

; P2.5 — Out_data

Out_databitP2.5

; P2.6 — Out_sh

Out_shbitP2.6

; P2.7 — Out_st

Out_stbitP2.7

; P3.0 ;

; P3.1 ;

; P3.2 — INT0

; P3.3 — INT1

; P3.4 — DSR

DSRbitP3.4

; P3.5 — DTR

DTRbitP3.5

; P3.6 — Y6

Y6bitP3.6

; P3.7 — Y2

Y2bitP3.7

;======== Распределение адресов памяти ========

key_olddata20h; Занимает адреса 20h-23h

M_start_key_pressbit22h.3

M_stop_key_pressbit22h.4

stop_key_pressbit23h.4

K_tmpdata24h

Portdata25h

Port_tmpdata26h

Y1bitPort_tmp.0

Y3bitPort_tmp.1

Y4bitPort_tmp.2

Y5bitPort_tmp.3

BuzzerbitPort_tmp.4

Pump1bitPort_tmp.5

Pump2bitPort_tmp.6

M_controlbit Port_tmp.7

Flagsdata27h

FBusyPortbitFlags.0

; Технологические константы и переменные

Kdata30h

Qdata31h

Tmindata32h

Tmaxdata33h

Tmdata34h; Массив из 3-х элементов (адреса 34h-36h)

Tsrdata37h

Nu1data38h

Nu2data39h

PTime1data40h; Занимает 4 байта (40h — 43h)

PTime2data44h; Занимает 4 байта (44h — 47h)

jmp Init

;======== Вектора обработка прерываний ========

org 03h

jmp int_Ext0

org 0bh

jmp int_Timer0

org 13h

jmp int_Ext1

org 1bh

jmp int_Timer1

org 2bh

jmp int_Timer2

org 50h

;========== Начальная инициализация ===========

Init:

; Setup stack pointer

mov SP, #0c0h

; Init Pins

movkey_line, #0ffh; P0

movkey_port, #1fh; P2

movP1, #00h

movP3,#00h

; Enable Interrupt

movIE,#8fh

; Init Ext0, Ext1

setbPX0

movTCON, #05h

; Init ADC

movADCCON1, #44h ;#7ch

; Init Timer

movTMOD, #11h

setbTCON.6

; Init Uart

setbREN

setbDSR

setbDTR

Main:

============Обработка информации с дискретных датчиков==============

mov A, P0

rlc A

jc d_Set

rlc A

jnc d_Clr

rlc A

jc d_Clr

rlc A

jc d_Clr

d_Set:

setb Y1

movPort, Port_tmp

callSend_Port_Value

clrY1

movPort, Port_tmp

; Запуск таймера

movTH0, #1 100 0100B

movTL0, #01B

setbTCON.4

setbFBusyPort

jmp d_Exit

d_Clr:

clrY1

d_Exit:

===============Обработка информации с аналоговых датчиков===============

movADCCON2, #10h

callAdc_Wait

movNu1, A; Значение с первого датчика

movADCCON2, #11h

callAdc_Wait

movNu2, A; Значение со второго датчика

; Реализация функции min (Nu1, Nu2 + K)

clrC

addA, K

movR0, A

subbA, Nu1

jca_Nu1

movA, R0; Nu2 + K < Nu1

jmpa_Next

a_Nu1:

clr C

mov A, Nu1; Nu1 < Nu2 + K

a_Next:

; Сравнение min значения с Q

subbA, Q

jca_Q

; Q < min

setbY3

; Запуск таймера

movTH0, #1 110 1100b

movTL0, #111 0100b

setbTCON.4

jmpa_Exit

a_Q:

; Q > min

setb Y2

call wait_20us

clrY2

wait_20us:

nop

nop

nop

nop

nop

nop

nop

nop

nop

nop

nop

nop

nop

nop

nop

nop

a_Exit:

=======Управление технологическим параметром в заданных пределах==============

movADCCON2, #12h

callAdc_Wait

mov (Tm+0), A; Значение температуры с первого датчика

movADCCON2, #13h

callAdc_Wait

mov (Tm+1), A; Значение температуры со второго датчика

movADCCON2, #14h

callAdc_Wait

mov (Tm+2), A; Значение температуры с третьего датчика

; Инициализация регистров используемых в цикле

movR0, #03h

movR1, #Tm

movR2, #00h

; Цикл обработки массива из 3 элементов (нахождение среднего арифметического)

t_Loop:

movA, @R1

movB, #03h

divAB

addA, R2

movR2, A

incR1

djnzR0, t_Loop

movTsr, A; Занесение полученного значения в память

; Сравнение средней температуры с граничными значениями

clrC

subbA, Tmin

jct_Low; Температура ниже нормы

clrC

movA, Tsr

subbA, Tmax

jnct_Hi; Температура выше нормы

clrY4; Выключили охладитель

clrY5; Выключили нагреватель

jmpt_Exit

t_Low:

clrY4; Выключили охладитель

setbY5; Включили нагреватель

jmpt_Exit

t_Hi:

setbY4; Включили охладитель

clrY5; Выключили нагреватель

t_Exit:

===========Управление пуском — остановом электродвигателя===============

jnbM_usensor, m_Stop; Нет питания-> остановка

jnbM_stop_key_press, m_Stop; Нажата кнопка остановки-> остановка

jbM_start_key_press, m_Exit; Кнопка пуска отпущена -> состояние

не изменяется

; Запуск двигателя

setbM_control

jmpm_Exit

m_Stop:

; Остановка двигателя

clrM_control

m_Exit:

===============Алгоритм гибкого управления объектом====================

jbPump1, n_Proverka

jbPump2, n_P2

; Насосы отключены

jnbL2, n_State0

setbPump1

setbPump2

jmpn_Exit

n_State0:

jnbL1, n_Exit

; Выбор насоса для включения

movA, (PTime1+3)

cjneA, (PTime2+3), n_select0

movA, (PTime1+2)

cjneA, (PTime2+2), n_select0

movA, (PTime1+1)

cjneA, (PTime2+1), n_select0

movA, (PTime1+0)

cjneA, (PTime2+0), n_select0

n_select0:

jcn_onP10

setbPump2; 2 насос отработал меньше -> включение

jmpn_Exit

n_onP10:

setbPump1; 1 насос отработал меньше -> включение

jmpn_Exit

n_Proverka:

jnbPump2, n_P1

; Работают оба насоса

jbL1,n_State1

clrPump1

clrPump2

jmpn_Exit

n_State1:

jbL2, n_Exit

; Выбор насоса для отключения

movA, (PTime1+3)

cjneA, (PTime2+3), n_select1

movA, (PTime1+2)

cjneA, (PTime2+2), n_select1

movA, (PTime1+1)

cjneA, (PTime2+1), n_select1

movA, (PTime1+0)

cjneA, (PTime2+0), n_select1

n_select1:

jcn_onP11

clrPump1; 1 насос отработал больше -> выключение

jmpn_Exit

n_onP11:

clrPump2; 2 насос отработал меньше -> выключение

jmpn_Exit

n_P1:

; Работает 1 насос

jbL1, n_State2

clrPump1

jmpn_Exit

n_State2:

jnbL2, n_Exit

setbPump2

jmpn_Exit

n_P2:

; Работает 2 насос

jbL1, n_State3

clrPump2

jmpn_Exit

n_State3:

jnbL2, n_Exit

setbPump1

jmpn_Exit

n_Exit:

;========================= Отправка порта =========================

movPort, Port_tmp

jbFBusyPort, p_Exit

callSend_Port_Value

p_Exit:

;========================= Цикл остановки =========================

l_wait:

callUart_Process

callKey_Process; Опрос/Обработка клавиатуры

jnb stop_key_press, l_wait

jmp Main

; Ожидание получения значения с АЦП

Adc_Wait:

m_Adc:

movA, ADCCON3

rlc A

jcm_Adc

movA, ADCDATAH

anlA, #0fh

movR0, A

movA, ADCDATAL

anlA, #0f0h

orlA, R0

swapA

ret

; Отсылка значения порта на сдвиговый регистр

Send_Port_Value:

movA, Port

rrcA

movOut_data, C

setbOut_sh

rrcA

clrOut_sh

movOut_data, C

setbOut_sh

rrcA

clrOut_sh

movOut_data, C

setbOut_sh

rrcA

clrOut_sh

movOut_data, C

setbOut_sh

rrcA

clrOut_sh

movOut_data, C

setbOut_sh

rrcA

clrOut_sh

movOut_data, C

setbOut_sh

rrcA

clrOut_sh

movOut_data, C

setbOut_sh

rrcA

clrOut_sh

movOut_data, C

setbOut_sh

clrOut_sh

setbOut_st

nop

clrOut_st

ret

; Режим ожидания

Wait_Regim:

jmp Wait_Regim

===================Обработчики прерываний============================

int_Ext0:

; Прерывание по сигналу отказа источника питания

setb Y6

mov R7, #14

pause_set0:

djnz R7, pause_set0

clr Y6

mov R7, #14

pause_clr:

djnz R7, pause_clr

setb Y6

mov R7, #14

pause_set1:

djnz R7, pause_set1

clr Y6

jmp Wait_Regim

int_Timer0:

pushAcc

pushPSW

clrTCON.4

callSend_Port_Value

clrFBusyPort

popPSW

popAcc

reti

int_Ext1:

setbET2

setbPT2

setbTR2

movRCAP2H, #0f8h

movRCAP2L, #030h

movTH2,#0f8h

movTL2,#030h

clrDSR

iE1_Wait:

jbDTR, iE1_Wait

callShowe_Info

setbDSR

jmp wait_regim

int_Timer1:

pushAcc

pushPSW

jnbPump1, it1_next0

; 1 насос работает

movA, (PTime1+3)

addA, #01h

mov (PTime1+3), A

jncit1_next0

movA, (PTime1+2)

addA, #01h

mov (PTime1+2), A

jncit1_next0

movA, (PTime1+1)

addA, #01h

mov (PTime1+1), A

jncit1_next0

movA, (PTime1+0)

addA, #01h

mov (PTime1+0), A

it1_next0:

jnbPump2, it1_next1

; 2 насос работает

movA, (PTime2+3)

addA, #01h

mov (PTime2+3), A

jncit1_next1

movA, (PTime2+2)

addA, #01h

mov (PTime2+2), A

jncit1_next1

movA, (PTime2+1)

addA, #01h

mov (PTime2+1), A

jncit1_next1

movA, (PTime2+0)

addA, #01h

mov (PTime2+0), A

it1_next1:

popPSW

popAcc

reti

int_Timer2:

pushAcc

pushPSW

clrTF2

cplBuzzer

movPort, Port_tmp

callSend_Port_Value

popPSW

popAcc

reti

=====================Функция опроса/обработки клавиатуры==================

Key_Process:

mov A, K_tmp

; Опрос/Обработка 1 линии

xrlkey_line, #01h

movB, key_port

jbB.0, not_k1

jnb (key_old+0).0, not_k1

; Нажата клавиша 1

swapA

anlA, #0f0h

orlA, #01h

not_k1:

jbB.1, not_k2

jnb (key_old+0).1, not_k2

; Нажата клавиша 2

swapA

anlA, #0f0h

orlA, #02h

not_k2:

jbB.2, not_k3

jnb (key_old+0).2, not_k3

; Нажата клавиша 3

swapA

anlA, #0f0h

orlA, #03h

not_k3:

jbB.3, not_kC

jnb (key_old+0).3, not_kC

; Нажата клавиша C

swapA

anlA, #0f0h

orlA, #0ch

not_kC:

jbB.4, not_kD

jnb (key_old+0).4, not_kD

; Нажата клавиша D

swapA

anlA, #0f0h

orlA, #0dh

not_kD:

movkey_old+0, B

; Опрос/Обработка 2 линии

xrlkey_line, #03h

movB, key_port

jbB.0, not_k4

jnb (key_old+1).0, not_k4

; Нажата клавиша 4

swapA

anlA, #0f0h

orlA, #04h

not_k4:

jbB.1, not_k5

jnb (key_old+1).1, not_k5

; Нажата клавиша 5

swapA

anlA, #0f0h

orlA, #05h

not_k5:

jbB.2, not_k6

jnb (key_old+1).2, not_k6

; Нажата клавиша 6

swapA

anlA, #0f0h

orlA, #06h

not_k6:

jbB.3, not_kE

jnb (key_old+1).3, not_kE

; Нажата клавиша E

swapA

anlA, #0f0h

orlA, #0eh

not_kE:

jbB.4, not_kF

jnb (key_old+1).4, not_kF

; Нажата клавиша F

swapA

anlA, #0f0h

orlA, #0Fh

not_kF:

movkey_old+1, B

; Опрос/Обработка 3 линии

xrlkey_line, #06h

movB, key_port

jbB.0, not_k7

jnb (key_old+2).0, not_k7

; Нажата клавиша 7

swapA

anlA, #0f0h

orlA, #07h

not_k7:

jbB.1, not_k8

jnb (key_old+2).1, not_k8

; Нажата клавиша 8

swapA

anlA, #0f0h

orlA, #08h

not_k8:

jbB.2, not_k9

jnb (key_old+2).2, not_k9

; Нажата клавиша 9

swapA

anlA, #0f0h

orlA, #09h

not_k9:

movkey_old+2, B

; Опрос/Обработка 4 линии

xrlkey_line, #0ch

movB, key_port

jbB.0, not_kA

jnb (key_old+3).0, not_kA

; Нажата клавиша A

swapA

anlA, #0f0h

orlA, #0ah

not_kA:

jbB.1, not_k0

jnb (key_old+3).1, not_k0

; Нажата клавиша 0

swapA

anlA, #0f0h

orlA, #00h

not_k0:

jbB.2, not_kB

jnb (key_old+3).2, not_kB

; Нажата клавиша B

swapA

anlA, #0f0h

orlA, #0bh

not_kB:

jbB.3, not_kI

jnb (key_old+3).3, not_kI

; Нажата клавиша I

movK, A

not_kI:

movkey_old+3, B

xrlkey_line, #08h

mov K_tmp, A

ret

end

Показать весь текст
Заполнить форму текущей работой