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