КП_МПС_Абрамов. Микропроцессорное устройство управления регулятором температуры по заданному закону
Скачать 2.47 Mb.
|
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. Приложение Б. Схема электрическая принципиальная микропроцессорного устройства управления терморегулятором по заданному закону Приложение В. Перечень элементов микропроцессорного устройства управления терморегулятором по заданному закону Приложение Г. Схема электрическая принципиальная модуля памяти Приложение Д. Перечень элементов модуля памяти |