Описание алгоритма работы устройства
При включении питания начинает выполнение основной программы. В начале нее вызывается процедура инициализации контроллера. Установка битов управления и направления передачи данных в портах ввода-вывода, инициализация АЦП и включение семисегментных индикаторов.
Для представления работы программы которая начинается с исполнительного блока, в котором происходит проверка на нажатие клавиши с помощью управляющих переменных, и в соответствии с этими переменными вызываются функции: процедура установления температурного режима, процедура разморозки холодильной камеры через трое суток, процедура быстрой заморозки, процедуры вывода номинальной и установленной температуры на семисегментные индикаторы.
Работа с прерываниями таймера заключается в установке сканируемого столбца семисегментного индикатора. Определение нажатых клавиш и реакции по ним: увеличение установленной температуры, уменьшение установленной температуры, переключение режимов по кругу. Также проверка на отпускание клавиш. Включение периодической разморозки, ежеминутное обновление показаний температуры, увеличиваем счетчик переполнений, сброс флага переполнения. За счет ежеминутного обновления при коррекции температуры на индикаторе некоторое время отображается установленное значение затем по окончании минуты выводиться измеренное в камере холодильника.
Зажигается знак минус на индикаторе температуры морозилки по сигналу на 0-й бит порта P3.
В процедуре инициализации устанавливается 1-й режим работы таймера обнуляются счетчики и pазpешается pабота 0-го Таймеpa. Разpешаются все прерывания и пpеpывания Таймера=0.
В инициализации блока АЦП выполняется настройка режима АЦП. Обнуление значения переменных и флагов определяющих положение клавиш и температурных режимов. Выставление установленных температур при допустимом изменении от -6 до +6. Линии 4-6 на ввод и включаются компрессоры на холод.
В основной части программы реализуется бесконечный цикл. В цикле измеряется температура , по реакциям нажатия клавиши изменяется и проверяется диапазон температур в которых должны находиться компрессоры. Подаются сигналы управляющие компрессорами через транзисторные ключи маломощными реле включения компрессоров. Управляя компрессорами можно устанавливать температуры для морозилки от 0 до -22 для второй камеры от +1 до +10. Выполняются четыре основных режима устанавливаемых клавиатурой: “-”, “+”, быстрая заморозка, разморозка. Переход между режимами осуществляется по кругу.
Листинг программы
/*программа управления холодильником */
start: do;
$include(reg812.dcl)
declare
/* объявление основных переменных и флагов */
(t_1,t_2) word, /*температура в камерах установленная*/
(tr_1,tr_2) word, /* измеряемая температура */
ind(4) byte,
(i,j,nreg) byte, /* переменные для работы */
(flag, fl_razm,fl_moroz) byte, /*флаги определения режима работы */
ok byte, /*номера нажатой и пред клавиш */
adc_H,adc_L byte,
tim_p word,
nind byte, /*номер отображаемого индикатора*/
per_t0 word; /*число циклов переполнения таймера0*/
adc:procedure interrupt 6; /*считываем данные с АЦП*/
adccon2=0;
adc_h=adcdatah;
adc_l=adcdatal;
flag=1;eadc=1;
end adc;
/*____Обработчик прерывания таймера____*/
timer_int: procedure interrupt 1; /* прерывание t0 */
/*установка сканируемого столбца*/
if nind=0 then P2=00010000b or ind(nind);
if nind=1 then P2=00100000b or ind(nind);
if nind=2 then P2=01000000b or ind(nind);
if nind=3 then P2=10000000b or ind(nind);
Nind=nind+1; if nind=4 then nind=0;
/*определение нажатых клавиш и реакции по ним*/
if (p3.4=0b) and (ok<>1) then /*приращение установленной температуры*/
do;ok=1;
if nreg=0 then do;
t_1=t_1-1;if t_10<0 then t_1=0;
ind(0)=t_1/10;ind(1)=t_1 mod 10;
end;
if nreg=1 then do;
t_2=t_2+1;if t_2>10 then t_2=10;
ind(2)=t_2/10;ind(3)=t_2 mod 10;
end;
end;
if (p3.5=0b) and (ok<>2) then /*уменьшение установленной температуры*/
do;ok=2;
if nreg=0 then do;
t_1=t_1+1;if t_1>22 then t_1=22;
ind(0)=t_1/10;ind(1)=t_1 mod 10;
end;
if nreg=1 then do;
t_2=t_2-1;if t_2<3 then t_2=3;
ind(2)=t_2/10;ind(3)=t_2 mod 10;
end;
end;
if (p3.6=0b) and (ok<>3) then/*переключение режимов по кругу */
do; ok=3; nreg=nreg+1;if nreg>=4 then nreg=0;
end;
if (P3 and 01110000b)=70h then ok=0; /*проверка на отпускание клавиш */
if per_t0>960 then do; /*если прошла мин увеличен счетчик*/
per_t0=0;tim_ptim_p+1;
if nreg<2 then do;/*включение периодической разморозки*/
if (fl_razm=0)and(tim_p>4320) then do;fl_razm=1;tim_p=0;end; /*24ч*/
if (fl_razm=1)and(tim_p>180) then do;fl_razm=0; tim_p=0;end; /*2ч*/
end;
if nreg=2 then do;
if (fl_moroz=1)and(tim_p>240) then do;fl_moroz=0;tim_p=0;nreg=0;end; /*3ч*/
end;
do; /*ежеминутное обновление показаний температуры*/
ind(0)=tr_1/10;ind(1)=tr_1 mod 10;
ind(2)=tr_2/10;ind(3)=tr_2 mod 10;
if tr_1<>0 then P3.0=0;/*зажигаем минус на индикаторе температуры морозилки*/
end;
end;
per_t0=per_t0+1; /* увеличиваем счетчик переполнений */
tf0=0; /* сброс флага переполнения */
end timer_int;
init: procedure; /******пpоцедуpа инициализации******/
tmod=00000001b;/*пеpвый pежим для таймеpа */
it0=1;/*пpеpывание по фpонту сигнала пеpеполнения*/
th0,tl0=0;tr0=1; /*обнул счетчики и pазpешаем pаботу 0-го Таймеpa*/
er0=1;/*запускаем таймеp 0 */
et0=1; /*pазpешаем пpеpывания Таймера=0 */
ea=1;/*pазpешаем все пpеpывания*/
/*Инициализация АЦП*/
ADCCON1=60h;/*настраиваем режим AЦП*/
ADCCON2=0h;/*настраиваем канал 0*/
nreg=0;fl_moroz=0;fl_razm=0;ok=0;
/*устаналиваем значения по умолчанию*/
t_1=6;t_2=6;
p3=01111011;/*линии 4-6 на ввод и включаем компрессоры на холод*/
end init;
/*____основнaя программа _____*/
call init;
/******Исполнительный блок программы******/
do while 1; /*основной цикл работы холодильника*/
chan=0; sconv=1; flag=0;
do while flag=0; end;/*измеряем температуру t1*/
tr_1=22-(adc_h*255+adc_l)*50/4096;/* перевод результатов АЦП в температуру*/
chan=1; sconv=1; flag=0;
do while flag=0; end;/*измеряем температуру t2*/
tr_2=((adc_h and 0fh)*255+adc_l)*50/4096;/*перевод результатов АЦП в температуру*/
if nreg=2 then do; fl_moroz=1;time_p=0;end;
if (nreg<2)and(tr_1>t_1+1) THEN p3.1=1;
if (nreg<2)and(tr_2>t_2+1) THEN p3.3=1;
if (nreg<2)and(tr_1<t_1-2) THEN p3.1=0;
if (nreg<2)and(tr_2<t_2-2) THEN p3.3=0;
if (fl_razm=1)and(tr_1>-1) then p3.1=0;
if nreg=3 then do p3.1=0;p3.3=0;end;/*полная разморозка*/
if (nreg=2)and(tr_1<22) THEN p3.1=1;/*быстрая заморозка*/
if (nreg=2)and(tr_1=22) THEN p3.1=0;/*
end;
end start;
Заключение
В данной курсовой работе был изучен микроконтроллер ADuC 812 при разработке холодильной установки. Были получены навыки программирования микропроцессорных систем и построения на их основе устройств управления и сбора информации.