Файл: Микропроцессорное устройство управления регулятором температуры по заданному закону.doc
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 17.10.2024
Просмотров: 20
Скачиваний: 0
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
mov tcon, #00000101b ; реакция на прерывания – по фронтам
mov ie, #10000111b ; разрешаем прерывания: АЦП, таймер, «ПУСК»
; основной цикл
begin:
acall indic ; сканируем индикатор
djnz frequency_devider, sleep ; если интервал не кончился – ложимся спать
mov a, #0 ; инициализируем аккумулятор, попутно –
; настраиваемся на 1-й интервал
; далее – четыре куска – настройка делителя частоты
clr c ; сбрасываем флаг C
subb a, interval_number ; выясняем, в первом ли мы участке должны быть
jс acc.7, second_interval_frequency_devider ; если не в первом – уходим на второй
mov frequency_devider, #75 ; если в первом – настраиваемся на 1,5 секунды
clr p3.0 ; включаем АЦП
ajmp sleep ; ложимся спать
; второйинтервал
second_interval_frequency_devider:
mov a, #1 ; задаемся вторым номером интервала
clr c ; сбрасываем флаг
subb a, interval_number ; выясняем, во втором ли интервале нам надо быть
jс acc.7, third_interval_frequency_devider ; если нет, то уходим в третий
mov frequency_devider, #100 ; а если да – настраиваемся на 2 секунды
clr p3.0 ; включаем АЦП
ajmp sleep ; ложимся спать
; третийинтервал
third_interval_frequency_devider:
mov a, #2 ; задаёмся третьим номером интервала
clr c ; сбрасываем флаг С
subb a, interval_number ; выясняем, должны ли мы здесь быть
jс acc.7, fourth_interval_frequency_devider ; еслинет – уходимв 4-йинтервал
mov frequency_devider, #150 ; а если да – настраиваемся на 3 секунды
clr p3.0 ; включаем АЦП
ajmp sleep ; спать
; четвёртый интервал
fourth_interval_frequency_devider:
mov frequency_devider, #50 ; настраиваемся на 1 секунду
clr p3.0 ; включаем АЦП
ajmp sleep ; спать
; крепкий и здоровый сон контроллера
sleep:
orl pcon, #01h ; засыпаем
ajmp begin ; зацикливаемся на основной секции
; подпрограмма обработки прерывания от АЦП
DAC_interrupt_interpretator:
clr p3.1 ; открываем шинник
movx a, @dptr ; читаем данные с АЦП в аккумулятор
setb p3.0 ; выключаем АЦП
setb p3.1 ; закрываем шинник
; регулировщик первого интервала
mov DAC_result, a ; кладём данные из аккумулятора в спец.ячейку
acall temp ; вычисляем температуру
djnz first_number_of_iterations, exit ; если регулирование ещё не закончено - выходим
;регулировщик второго интервала
mov a, second_number_of_iterations ; если закончено – настраиваемся на второй участок
jz third_interval_regulation ; если в аккумуляторе 0 – переходим на 3-й участок
xch a, first_number_of_iterations ; меняем аккумулятор с числом первых итераций
mov interval_number, #1d ; принимаем, что мы во втором интервале
ajmp exit ; выходим
; регулировщик третьего интервала
third_interval_regulation:
mov a, third_number_of_iterations ; кладём количество третьих итераций в аккумулятор
jz fourth_interval_regulation ; если а = 0, переходим на 4-й интервал
xch a, first_number_of_iterations ; меняем аккумулятор с числом первых итераций
mov interval_number, #2d ; принимаем, что мы в третьем интервале
ajmp exit ; выходим
; регулировщикчетвёртогоинтервала
fourth_interval_regulation:
mov a, fourth_number_of_iterations ; в аккумуляторе – количество итераций 4-го периода
jz init ; если регулирование кончилось – инициализируемся
xch a, first_number_of_iterations ; иначе:
mov interval_number, #3d ; принимаем, что мы в четвёртом интервале
exit: reti ; возвращаемся из прерывания
;подпрограмма сканирования индикатора
indic:
mov a, first_indication_cell ; поместить значение температуры в аккумулятор
anl a, #0Fh ; выбор младшего полубайта аккумулятора
da a ; BCD-коррекция
clr p1.4 ; выключаем первый индикатор
mov p1, a ; выводим первую цифру температуры на индикацию
setb p1.4 ; включаем первый индикатор
clr p1.5 ;выключаем второй индикатор
mov a, second_indication_cell ; поместить значение температуры в аккумулятор
anl a, #0Fh ; выбор младшего полубайта аккумулятора
da a ; BCD-коррекция
mov p1, a ; поместить содержимое аккумулятор в видеобуфер
setb p1.5 ; включаемвторойиндикатор
ret ; возвращаемся в основную программу
; подпрограммавыбораинтервала
temp:
mov a, interval_number ; поместитьваномертекущегоинтервала
jz first_temperature_processing ; еслиа=0, переходнаметку first_temperature_processing
dec a ; если a!=0 вычитаем из аккумулятора 1
jz second_temperature_processing ; еслитеперьа=0, переходнаметку 2-гоинтервала
dec a ; итакдалее
jz third_temperature_processing ; итомуподобное
ajmp fourth_temperature_processing ; если добрались досюда – уходим на 4-й интервал
; фомирование новой эталонной температуры на каждом из участков
first_temperature_processing: ; обработчик первого интервала (температура растёт)
mov interval_number, #0 ; бэкапим номер интервала, чтоб потом сюда вернуться
dec first_number_of_iterations ; декрементируемчислоитераций
inc first_initial_temperature ; реализуемтекущеезначение t0C позакону
mov r1, first_initial_temperature ; запоминаем новое эталонное значение температуры
ajmp ex ; уходим на секцию регулировки
second_temperature_processing: ; обработчик второго интервала (температура падает)
mov interval_number, #1 ; комментарии – см. в обработчике первого интервала
dec first_number_of_iterations
dec second_initial_temperature
mov r1, second_initial_temperature
ajmp ex
third_temperature_processing: ; обработчик 3-го интервала (температура падает)
mov interval_number, #2
dec first_number_of_iterations
dec third_initial_temperature
mov r1, third_initial_temperature
ajmp ex
fourth_temperature_processing: ; обработчик 4-го интервала (температура постоянная)
mov interval_number, #3
dec first_number_of_iterations
mov r1, fourth_initial_temperature
ajmp ex
; подпрограммаобработкитемпературы
temperature_regulation
mov a, DAC_result ; поместимваккумуляторэталоннуютемпературу
mov b, #4d ; в регистр b - 4
mul ab
; перемножим
mov b, #10d ; в b - 10
div ab ; делим
clr c ; чистим флаг переноса
subb a, #61d ; вычитаем из аккумулятора 61
mov decoded_DAC_result, a ; в аккумуляторе – значение с АЦП, пересчитанное в
; градусы Цельсия
mov b, #10 ; теперь в b - 10
div a, b ; делим градусы на 10 получаем 1-й разряд индикатора
mov first_indication_cell, b ; кладём его по нужному адресу
mov second_indication_cell, a ; второй разряд – тоже по своему адресу
mov a, r1 ; в аккумулятор кладём эталонную температуру
mov b, #5d ; в регистр B – кладём погрешность
mul a, b ; умножаем аккумулятор на 5
mov b, #100 ; B = 100%
div ab ; получаем верхнее отклонение температуры
add a, r1 ; добавляем его к эталонному значению температуру
; теперь в аккумуляторе - верхняя граница
; на текущем участке регулирования
subb a, decoded_DAC_result ; вычитаем из эталонной температуры текущую
jc cooler ; если текущая больше – вентилируем
; если не больше – думаем, надо ли греть
mov a, r1 ; аналогично с предыдущим вычисляем нижнюю границу
mov b, #5d
mul ab
mov b, #100d
div ab
mov r2, a
mov a, r1
clr c ;
subb a, r2 ; в аккумуляторе - нижний предел
xch a, decoded_DAC_result ; меняем содержимое аккумулятора и decoded_DAC_result
clr c ; чистим флаг от греха подальше
subb a, decoded_DAC_result ; вычитаем из текущей температуры расчётную
jc heater ; если расчётная больше – надо греть
ajmp regulation_is_over ; а если всё нормально, то и регулировать не надо
; подпрограмма управления вентилятором
cooler:
clr p3.5 ; выключаем нагреватель
setb p3.4 ; включаем вентилятор
ajmp regulation_is_over ;выходим из подпрограммы
; подпрограмма управления нагревателем
heater:
clr p3.4 ; выключаем вентилятор
setb p3.5 ; включаем нагреватель
regulation_is_over: ; метка выхода из подпрограммы
ret ; собственно, выход
end.
Приложение Б.
Схема электрическая принципиальная микропроцессорного устройства управления терморегулятором по заданному закону
Приложение В.
Перечень элементов микропроцессорного устройства управления терморегулятором по заданному закону
Приложение Г.
Схема электрическая принципиальная модуля памяти
Приложение Д.
Перечень элементов модуля памяти
mov ie, #10000111b ; разрешаем прерывания: АЦП, таймер, «ПУСК»
; основной цикл
begin:
acall indic ; сканируем индикатор
djnz frequency_devider, sleep ; если интервал не кончился – ложимся спать
mov a, #0 ; инициализируем аккумулятор, попутно –
; настраиваемся на 1-й интервал
; далее – четыре куска – настройка делителя частоты
clr c ; сбрасываем флаг C
subb a, interval_number ; выясняем, в первом ли мы участке должны быть
jс acc.7, second_interval_frequency_devider ; если не в первом – уходим на второй
mov frequency_devider, #75 ; если в первом – настраиваемся на 1,5 секунды
clr p3.0 ; включаем АЦП
ajmp sleep ; ложимся спать
; второйинтервал
second_interval_frequency_devider:
mov a, #1 ; задаемся вторым номером интервала
clr c ; сбрасываем флаг
subb a, interval_number ; выясняем, во втором ли интервале нам надо быть
jс acc.7, third_interval_frequency_devider ; если нет, то уходим в третий
mov frequency_devider, #100 ; а если да – настраиваемся на 2 секунды
clr p3.0 ; включаем АЦП
ajmp sleep ; ложимся спать
; третийинтервал
third_interval_frequency_devider:
mov a, #2 ; задаёмся третьим номером интервала
clr c ; сбрасываем флаг С
subb a, interval_number ; выясняем, должны ли мы здесь быть
jс acc.7, fourth_interval_frequency_devider ; еслинет – уходимв 4-йинтервал
mov frequency_devider, #150 ; а если да – настраиваемся на 3 секунды
clr p3.0 ; включаем АЦП
ajmp sleep ; спать
; четвёртый интервал
fourth_interval_frequency_devider:
mov frequency_devider, #50 ; настраиваемся на 1 секунду
clr p3.0 ; включаем АЦП
ajmp sleep ; спать
; крепкий и здоровый сон контроллера
sleep:
orl pcon, #01h ; засыпаем
ajmp begin ; зацикливаемся на основной секции
; подпрограмма обработки прерывания от АЦП
DAC_interrupt_interpretator:
clr p3.1 ; открываем шинник
movx a, @dptr ; читаем данные с АЦП в аккумулятор
setb p3.0 ; выключаем АЦП
setb p3.1 ; закрываем шинник
; регулировщик первого интервала
mov DAC_result, a ; кладём данные из аккумулятора в спец.ячейку
acall temp ; вычисляем температуру
djnz first_number_of_iterations, exit ; если регулирование ещё не закончено - выходим
;регулировщик второго интервала
mov a, second_number_of_iterations ; если закончено – настраиваемся на второй участок
jz third_interval_regulation ; если в аккумуляторе 0 – переходим на 3-й участок
xch a, first_number_of_iterations ; меняем аккумулятор с числом первых итераций
mov interval_number, #1d ; принимаем, что мы во втором интервале
ajmp exit ; выходим
; регулировщик третьего интервала
third_interval_regulation:
mov a, third_number_of_iterations ; кладём количество третьих итераций в аккумулятор
jz fourth_interval_regulation ; если а = 0, переходим на 4-й интервал
xch a, first_number_of_iterations ; меняем аккумулятор с числом первых итераций
mov interval_number, #2d ; принимаем, что мы в третьем интервале
ajmp exit ; выходим
; регулировщикчетвёртогоинтервала
fourth_interval_regulation:
mov a, fourth_number_of_iterations ; в аккумуляторе – количество итераций 4-го периода
jz init ; если регулирование кончилось – инициализируемся
xch a, first_number_of_iterations ; иначе:
mov interval_number, #3d ; принимаем, что мы в четвёртом интервале
exit: reti ; возвращаемся из прерывания
;подпрограмма сканирования индикатора
indic:
mov a, first_indication_cell ; поместить значение температуры в аккумулятор
anl a, #0Fh ; выбор младшего полубайта аккумулятора
da a ; BCD-коррекция
clr p1.4 ; выключаем первый индикатор
mov p1, a ; выводим первую цифру температуры на индикацию
setb p1.4 ; включаем первый индикатор
clr p1.5 ;выключаем второй индикатор
mov a, second_indication_cell ; поместить значение температуры в аккумулятор
anl a, #0Fh ; выбор младшего полубайта аккумулятора
da a ; BCD-коррекция
mov p1, a ; поместить содержимое аккумулятор в видеобуфер
setb p1.5 ; включаемвторойиндикатор
ret ; возвращаемся в основную программу
; подпрограммавыбораинтервала
temp:
mov a, interval_number ; поместитьваномертекущегоинтервала
jz first_temperature_processing ; еслиа=0, переходнаметку first_temperature_processing
dec a ; если a!=0 вычитаем из аккумулятора 1
jz second_temperature_processing ; еслитеперьа=0, переходнаметку 2-гоинтервала
dec a ; итакдалее
jz third_temperature_processing ; итомуподобное
ajmp fourth_temperature_processing ; если добрались досюда – уходим на 4-й интервал
; фомирование новой эталонной температуры на каждом из участков
first_temperature_processing: ; обработчик первого интервала (температура растёт)
mov interval_number, #0 ; бэкапим номер интервала, чтоб потом сюда вернуться
dec first_number_of_iterations ; декрементируемчислоитераций
inc first_initial_temperature ; реализуемтекущеезначение t0C позакону
mov r1, first_initial_temperature ; запоминаем новое эталонное значение температуры
ajmp ex ; уходим на секцию регулировки
second_temperature_processing: ; обработчик второго интервала (температура падает)
mov interval_number, #1 ; комментарии – см. в обработчике первого интервала
dec first_number_of_iterations
dec second_initial_temperature
mov r1, second_initial_temperature
ajmp ex
third_temperature_processing: ; обработчик 3-го интервала (температура падает)
mov interval_number, #2
dec first_number_of_iterations
dec third_initial_temperature
mov r1, third_initial_temperature
ajmp ex
fourth_temperature_processing: ; обработчик 4-го интервала (температура постоянная)
mov interval_number, #3
dec first_number_of_iterations
mov r1, fourth_initial_temperature
ajmp ex
; подпрограммаобработкитемпературы
temperature_regulation
mov a, DAC_result ; поместимваккумуляторэталоннуютемпературу
mov b, #4d ; в регистр b - 4
mul ab
; перемножим
mov b, #10d ; в b - 10
div ab ; делим
clr c ; чистим флаг переноса
subb a, #61d ; вычитаем из аккумулятора 61
mov decoded_DAC_result, a ; в аккумуляторе – значение с АЦП, пересчитанное в
; градусы Цельсия
mov b, #10 ; теперь в b - 10
div a, b ; делим градусы на 10 получаем 1-й разряд индикатора
mov first_indication_cell, b ; кладём его по нужному адресу
mov second_indication_cell, a ; второй разряд – тоже по своему адресу
mov a, r1 ; в аккумулятор кладём эталонную температуру
mov b, #5d ; в регистр B – кладём погрешность
mul a, b ; умножаем аккумулятор на 5
mov b, #100 ; B = 100%
div ab ; получаем верхнее отклонение температуры
add a, r1 ; добавляем его к эталонному значению температуру
; теперь в аккумуляторе - верхняя граница
; на текущем участке регулирования
subb a, decoded_DAC_result ; вычитаем из эталонной температуры текущую
jc cooler ; если текущая больше – вентилируем
; если не больше – думаем, надо ли греть
mov a, r1 ; аналогично с предыдущим вычисляем нижнюю границу
mov b, #5d
mul ab
mov b, #100d
div ab
mov r2, a
mov a, r1
clr c ;
subb a, r2 ; в аккумуляторе - нижний предел
xch a, decoded_DAC_result ; меняем содержимое аккумулятора и decoded_DAC_result
clr c ; чистим флаг от греха подальше
subb a, decoded_DAC_result ; вычитаем из текущей температуры расчётную
jc heater ; если расчётная больше – надо греть
ajmp regulation_is_over ; а если всё нормально, то и регулировать не надо
; подпрограмма управления вентилятором
cooler:
clr p3.5 ; выключаем нагреватель
setb p3.4 ; включаем вентилятор
ajmp regulation_is_over ;выходим из подпрограммы
; подпрограмма управления нагревателем
heater:
clr p3.4 ; выключаем вентилятор
setb p3.5 ; включаем нагреватель
regulation_is_over: ; метка выхода из подпрограммы
ret ; собственно, выход
end.
Приложение Б.
Схема электрическая принципиальная микропроцессорного устройства управления терморегулятором по заданному закону
Приложение В.
Перечень элементов микропроцессорного устройства управления терморегулятором по заданному закону
Приложение Г.
Схема электрическая принципиальная модуля памяти
Приложение Д.
Перечень элементов модуля памяти