|
Описание основных частей программы ⇐ ПредыдущаяСтр 3 из 3
В программе можно выделить следующие блоки: · Блок объявления переменных. В этом блоке описываются основные переменные и флаги. · Блок инициализации программы. В этом блоке осуществляется первоначальная настройка микроконтроллера. Установка битов управления и направления передачи данных в портах ввода-вывода, инициализация АЦП, а так же инициализация и включение ЖКИ - дисплея. · Основной цикл программы. Осуществляет проверку нажатия одной из четырех клавиш. · Обработчик прерывания от таймера по его переполнению. Расчет скорости и количество оборотов за прошедшую секунду, и сравнение полученных значений с критическими значениями. При необходимости установка флагов. · Обработчик прерываний по INT0. Наращивания количества импульсов для подсчета числа оборотов. · Обработчик прерываний по INT1. Наращивание количества импульсов для подсчета скорости. · Процедура записи скорости в буфер. Формирует последовательность импульсов, которая затем будет отображена на LCD дисплее. · Процедура записи температур в буфер. Формирует последовательность импульсов, которая затем будет отображена на LCD дисплее. · Процедура записи в буфер информации, запрашиваемой одним из вариантов отображения. Формирование окончательного варианта буфера, который затем будет выведен на LCD экран. · Процедура вывода буфера на ЖКИ. Непосредственный вывод информации, хранящейся в буфере на LCD дисплей. · Обработчик прерываний от ADC. Запись старшей и младшей частей результата. Описание алгоритма работы основной программы
При включении питания начинает выполнение основной программы. В начале нее вызывается процедура инициализации контроллера. Установка битов управления и направления передачи данных в портах ввода-вывода, инициализация АЦП, а так же инициализация и включение ЖКИ - дисплея. Далее происходит зацикливание с помощью бесконечного цикла do while 1, в теле которого происходит проверка на нажатие клавиши с помощью управляющих переменных, и в соответствии с этими переменными вызываются соответствующие действия: выбор режима отображения (из четырех возможных); увеличение критического значения; уменьшение критического значения; выбор программируемой величины; После чего происходит преобразование данных которые были установлены с помощью LCD дисплея и клавиш клавиатуры и последующее их сравнение с критическими значениями. При необходимости устанавливаются флаги превышения критических значений.
Заключение
При выполнении данного курсового проекта была изучена архитектура микроконтроллера AduC812 и построен на его основе бортовой компьютер автомобиля. При этом также был изучен текстовый жидкокристаллический дисплей. Приобретены навыки программирования микропроцессорных систем и построения на их основе устройств сбора и обработки информации. компьютер бортовой микроконтроллер программа Приложение А
Листинг программы. /* программа для автомобильного компьютера/ start: do; $include (reg812.dcl) /* объявление основных переменных и флагов */ (skor, skor1, skorp) word, /*выводимая на ЖКИ скорость */ (obor, obor1, oborp) word, /*выводимые на ЖКИ обороты */ (put, put1) word, /*пройденный путь*/ (time, tim1) word, /* время в пути*/ (td, tk, t1, t2, tp) word, /* измеряемые температуры */ (td_max, tk_max, t2_max, t1_max, pMasl_min, ub_max, ub_min), bit, ub word, /*напряжение бортовой сети */ pMasl word, /*давление масла */ LCD_Ini (*) byte constant (08h, 02h, 0fh, 01h), /*команды ЖКИ*/ Ind(56) bute, /* содержимое индикатора */ (i, j, n, k, s, t) byte, /* переменные для работы */ (fl_reg, fl_s, flag, fl_p) byte, /*флаги определ режима работы */_key byte, /*номер нажатой клавиши */ (k1_old) byte, /*номер последней нажатой клавиши */ chan byte /* номер оцифровываемого канала */ adc_H, adc_L byte, per_t0 word; /*число циклов переполнения таймера0*/ /*пеpеименование pазpядов поpта */ declare rs literally ‘P2.6’,/*линия связи с LCD*/ rw literally ‘P2.7’,/*линия связи с LCD*/literally ‘P2.5’; /* - Обработчики прерываний -*/ /* - Обработчик прерывания int0-*/ int_obor: procedure interrupt 0;/*обработчик прерывания подсчит число оборотов*/ oborp=oborp+1; end int_obor; /* - Обработчик прерывания int1-*/_obor: procedure interrupt 2;/*обработ прерыван подсчит скорость*/=skorp+1; end int_obor; /* - Обработчик прерывания таймера-*/_int: procedure interrupt 1; /* прерывание t0 */ /* проверка нажатия клавиш*/(p3.0=0b) and (kl_old<>1) then do; n_key=1; kl_old=1; end;(p3.1=0b) and (kl_old<>2) then do; n_key=2; kl_old=2; end;(p3.2=0b) and (kl_old<>3) then do; n_key=3; kl_old=3; end;(p3.3=0b) and (kl_old<>4) then do; n_key=4; kl_old=4; end;(p3 =0fb) then do; n_key=0; kl_old=0; end; /* фиксируем текущую скорость и обороты и устанавл флаг*/ if (per_t0>15) then /*если прошла секунда */ dofl_s=1 then do signal=not(signal); P2.4=signal; end;=oborp*60*2;/*подсчитываем число оборотов в минуту*/ skor=skorp*3600/(1000*2);/*переводим скор и м\сек в км\ч*/ skorp=0; oborp=0;/*сбрасываем счетчики*/ /*проверяем превышение скор и оборотов*/ if skor>120 then do fl_s=1; fl_reg=0; fl_p=0; end;obor>5000 then do fl_s=1; fl_reg=0; fl_p=0; end; end;_t0=per_t0+1; /* увеличиваем счетчик переполнений */ tf0=0; /* sbros flaga perepolneniya */ end timer_int;_INT: procedure interrupt 6; /* обработчик прерывания A D C */ adccon2=chan;_H=ADCDATAH;_L=ADCDATAL;=1; edac=1; end ADC_INT;:procedure; /* вывод текущей скорости*/ ind(0)=43h; ind(1)=4Bh; ind(3)=2dh; ind(2)=20h;(3)=(skor/100)+30h; ind(5)=(skor mod 100)/10+30h;(6)=((skor mod 100) mod 10)+30h; ind(7)=20h; skor;_tk:procedure; /* вывод температуры */ ind(41)=74h; ind(42)=064h; ind(43)=2d;/* вывод темп двигателя*/ ind(44)=(td/100)+30h; ind(45)=(td mod 100)/10+30h;(46)=((td mod 100) mod 10)+30h; ind(47)=20h;(48)=74h; ind(49)=06bh; ind(50)=2d;/* вывод темп коробки*/ ind(51)=(tk/100)+30h; ind(52)=(tk mod 100)/10+30h;(53)=((tk mod 100) mod 10)+30h; ind(54)=20h; td_tk; displ_Buf: procedure; /* вып заполнение дисплея в зависим от режима*/ /* первый режим - скор, обороты, Тдвиг, Ткоробки, Напряжение*/ if Fl_reg=0 then do; call skor;(8)=4fh; ind(9)=0b2h; ind(10)=2d; /* вывод текущих оборотов*/ =(obor mod 1000); ind(11)=(obor/1000)+30h;(12)=(obor1)/100+30h; obor1=(obor1 mod 100);(13)=obor1/10+30h; ind(14)=(obor1 mod 10)+30h; td_tk; /*вывод напряжения в бортовой сети*/ ind(55)=(up/10)+30h; ind(56)=(up mod 10) +30h; end; if Fl_reg=1 then do; ind(1)=4fh; ind(2)=0b2h; ind(3)=2d; /* вывод текущих оборотов*/ ind(4)=(obor/1000)+30h; obor1=(obor mod 1000);(5)=(obor1)/100+30h; obor1=(obor1 mod 100);(6)=obor1/10+30h; ind(7)=(obor1 mod 10)+30h; ind(8)=0a8h; ind(9)=0a8h; ind(10)=2d; /* вывод давления масла*/ (11)=(put/1000)+30h; put1=(put mod 1000);(12)=(put1)/100+30h; put1=(put1 mod 100);(13)=put1/10+30h; ind(14)=(put1 mod 10)+30h; td_tk; /*вывод напряжения в бортовой сети*/ ind(55)=(up/10)+30h; ind(56)=(up mod 10) +30h; end; if Fl_reg=2 then do call skor;(8)=0a8h; ind(9)=0a8h; ind(10)=2d; /* вывод пройд пути*/ (11)=(put/1000)+30h; put1=(put mod 1000);(12)=(put1)/100+30h; put1=(put1 mod 100);(13)=put1/10+30h; ind(14)=(put1 mod 10)+30h; td_tk; /*вывод напряжения в бортовой сети*/ ind(55)=(up/10)+30h; ind(56)=(up mod 10) +30h; end; if Fl_reg=3 then do ind(1)=074h; ind(2)=031h; ind(3)=2d; /* вывод температуры 1*/ ind(4)=(t1/100)+30h; tp=(t1 mod 100);(5)=(tp)/10+30h; tp=(tp mod 100);(6)=tp/10+30h; ind(7)=(tp mod 10)+30h; ind(8)=20h;(9)=074h; ind(10)=032h; ind(11)=2d; /* вывод температуры 2*/ ind(12)=(t2/100)+30h; tp=(t2 mod 100);(13)=(tp)/10+30h; ind(14)=(tp mod 100)+30h; td_tk; /*вывод напряжения в бортовой сети*/ ind(55)=(up/10)+30h; ind(56)=(up mod 10) +30h; end; call writeLCD;Displ_Buf;: procedure; /*вывод буфера на жки*/ do I=0 to 55;=0; rw=1; p0.7=1b;while (p0 and 80h)<>0; end;=1; rw=0;=Ind(i);;writeLCD; /* - пpоцедуpа инициализации-*/: procedure; tmod=00010001b;/*пеpвый pежим таймеpа для 0 и 1*/=1;/*пpеpывание по фpонту сигнала пеpеполнения*/, tl0=0; tr0=1;/*обнуляем счетчики и pазpешаем pаботу 0 го Таймеpа*/ er0=1;/*запускаем таймеp 0*/=1;/*pазpешаем пpеpывание Т0*/ ea=1;/*pазpешаем все пpеpывания*/ /*Инициализация АЦП*/ ADCCON1=60h;/*настраиваем режим AЦП*/ ADCCON2=0h;/*настраиваем режим AЦП*/ /*инициализация портов на вв\выв */ P2=0f0h; /*линии порта 2 c 0 по 3 на ввод с 4 по7 на вывод*/ n_key=0; k_old=0; fl_s=0; fl_p=0; /*инициализация ЖКИ*/ do I=0 to 3; rs=0; rw=1b; e=1b; call time(10);while (p0 and 80h)<>0; end;=0; rs=0; rw=0; call time(10);=LCD_Ini(i);;_max=96; tk_max=60; t2_max=60; t1_max=50; pMasl_min=1; ub_max=15; ub_min=11;_reg=3; call Displ_Buf; init; /*___________ Tело основной программы ______________*/ call init; do while 1; /*бесконечный цикл pаботы */ (n_key=1)&(kl_old<>1) then /*Перебираем режимы отображения */ do_reg=fl_reg+1; if fl_reg=4 then fl_reg=0;_old=1;;(n_key=4)&(kl_old<>4) then /* Включаем режим программирования */ _p=fl_p+1; do I=1 to 55; ind(i)=20h; /*Выводим сообщение «Установите_» */ ind(1)=0a9h; ind(2)=043h; ind(3)=054h; ind(4)=041h; ind(5)=048h; ind(6)=04fh; ind(7)=042h; ind(8)=0a5h; ind(9)=054h; ind(10)=045h; (11)=020h;fl_p=1 then do ind(41)=074h; ind(42)=064h; ind(43)=02dh;(44)=039h; ind(45)=036h; end;fl_p=2 then do ind(41)=074h; ind(42)=06bh; ind(43)=02dh;(44)=036h; ind(45)=030h; end;fl_p=3 then do ind(41)=074h; ind(42)=031h; ind(43)=02dh;(44)=035h; ind(45)=030h; end;fl_p=4 then do ind(41)=074h; ind(42)=032h; ind(43)=02dh;(44)=039h; ind(45)=036h; end;fl_p=5 then do ind(41)=055h; ind(42)=062h; ind(43)=02dh;(44)=061h; ind(45)=036h; ind(46)=02dh;(47)=031h; ind(48)=039h; end;fl_p=6 then do ind(41)=055h; ind(42)=062h; ind(43)=04dh;(44)=0b8h; ind(45)=0bdh; ind(46)=02dh;(47)=031h; ind(43)=035h; end;fl_p=7 then do ind(41)=050h; ind(42)=04dh; ind(43)=0631h;(44)=0bbh; ind(45)=061h; ind(46)=02dh;(47)=030h; ind(48)=031h; end; fl_p=8 then do fl_p=0; /*если устан все знач завер програм*/ call writeLCD;; if ((n_key=1) and (kl_old<>1)) and (fl_p>0) then /*+1 к текущему значению*/ dofl_p=1 then do td_max=td_max+1; if td_max>98 then td=97;(44)=td_max/10; ind(45)=td_max mod 10; end;fl_p=2 then do tk_max =tk_max +1; if tk_max >80 then tk_max =80;(44)=tk_max /10; ind(45)=tk_max mod 10; end;fl_p=3 then do t1_max =t1_max +1; if t1>99 then t1_max =99;(44)=t1_max /10; ind(45)=t1_max mod 10; end;fl_p=4 then do t2_max =t2_max +1; if t2_max >98 then t2=97;(44)=t2_max /10; ind(45)=t2_max mod 10; end;fl_p=5 then do ub_max =ub+1; if ub_max >15 then ub_max =15;(44)=ub_max /10; ind(45)=ub_max mod 10; end;fl_p=6 then do ub_min= ub_min +1; if ub_min >98 then ub_min =97;(44)= ub_min /10; ind(45)= ub_min mod 10; end;fl_p=7 then do pMasl_min= pMasl_min +1; if pMasl_min >5 then pMasl_min =5;(44)= pMasl_min; end; call writeLCD;; if ((n_key=2) and (kl_old<>2)) and (fl_p>0) then /* - 1 к текущему значению*/ dofl_p=1 then do td_max=td_max-1; if td_max<85 then td=85;(44)=td_max/10; ind(45)=td_max mod 10; end;fl_p=2 then do tk_max =tk_max-1; if tk_max <40 then tk_max =40;(44)=tk_max /10; ind(45)=tk_max mod 10; end;fl_p=3 then do t1_max =t1_max -1; if t1<35 then t1_max =35;(44)=t1_max /10; ind(45)=t1_max mod 10; end;fl_p=4 then do t2_max =t2_max-1; if t2_max <25 then t2=25;(44)=t2_max /10; ind(45)=t2_max mod 10; end;fl_p=5 then do ub_max =ub-1; if ub_max <13 then ub_max =13;(44)=ub_max /10; ind(45)=ub_max mod 10; end;fl_p=6 then do ub_min= ub_min-1; if ub_min <7 then ub_min =7;(44)= ub_min /10; ind(45)= ub_min mod 10; end;fl_p=7 then do pMasl_min= pMasl_min-1; if pMasl_min <1 then pMasl_min =1;(44)= pMasl_min; end; call writeLCD;;=0; flag=0; sconv=1; do while flag=0; end; /*зап преобр td*/ =adc_h*255+adc_l; call time(10);=0; flag=0; sconv=1; do while flag=0; end; /*зап преобр tk*/ =adc_h*255+adc_l; call time(10);=1; flag=0; sconv=1; do while flag=0; end; /*зап преобр t1*/ =adc_h*255+adc_l; call time(10);=2; flag=0; sconv=1; do while flag=0; end; /*зап преобр t2*/ =adc_h*255+adc_l; call time(10);=3; flag=0; sconv=1; do while flag=0; end; /*зап преобр измер напр*/ =adc_h*255+adc_l; call time(10); /* пересчитываем полученные значения с АЦП в реальные величины */ td=150*td/4096; tk=100*tk/4096; t1=120*t1/4096, t2=120*t2/4096;=ub*20/4096; pMasl=pMasl*5/4096;_s=0;td_max<=td then fl_s=1; /* проверяем превышение диапазонов */ tk_max<=tk then fl_s=1;t1_max<=t1 then fl_s=1;t2_max<=t2 then fl_s=1;ub_max<=ub then fl_s=1;fl_s=1 then do fl_reg=3; fl_p=0; end; if pMasl_max<=pMasl then do fl_reg=1; fl_s=1; fl_p=0; end; if fl_p=0 then call Displ_Buf;/*если не реж прогр выводим текущ инф*/ end;start; Что делать, если нет взаимности? А теперь спустимся с небес на землю. Приземлились? Продолжаем разговор... Что способствует осуществлению желаний? Стопроцентная, непоколебимая уверенность в своем... ЧТО ПРОИСХОДИТ ВО ВЗРОСЛОЙ ЖИЗНИ? Если вы все еще «неправильно» связаны с матерью, вы избегаете отделения и независимого взрослого существования... Что будет с Землей, если ось ее сместится на 6666 км? Что будет с Землей? - задался я вопросом... Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:
|