Сдам Сам

ПОЛЕЗНОЕ


КАТЕГОРИИ







Описание основных частей программы





 

В программе можно выделить следующие блоки:

· Блок объявления переменных. В этом блоке описываются основные переменные и флаги.

· Блок инициализации программы. В этом блоке осуществляется первоначальная настройка микроконтроллера. Установка битов управления и направления передачи данных в портах ввода-вывода, инициализация АЦП, а так же инициализация и включение ЖКИ - дисплея.

· Основной цикл программы. Осуществляет проверку нажатия одной из четырех клавиш.

· Обработчик прерывания от таймера по его переполнению. Расчет скорости и количество оборотов за прошедшую секунду, и сравнение полученных значений с критическими значениями. При необходимости установка флагов.

· Обработчик прерываний по 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 км? Что будет с Землей? - задался я вопросом...





Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:


©2015- 2024 zdamsam.ru Размещенные материалы защищены законодательством РФ.