Название
команды
|
№ бита
|
Описание
|
Function Set Задание режима работы индикатора 0 0 1 x x x * *
|
4
|
длинна: 0 - 4
бита, 1 - 8 бит
|
|
3
|
число линий
индикатора: 0 - одна линия, 1 - две линии
|
|
2
|
размерность
знакогенератора: 0 - 5x7 точек, 1 -
5x10 точек
|
Display
On/Off Control Управление дисплеем 0 0 0 0 1 x x x
|
2
|
0 - декремент,
1 - инкремент
|
|
1
|
0 - сдвиг
курсора, 1 - сдвиг строки
|
|
0
|
0 - включить
дисплей, 1 - выключить
|
Entry Mode Set Установка режима вывода 0 0 0 0 0 1 x x
|
1
|
0 - инкремент,
1 - декремент
|
|
0
|
1 - со сдвигом
дисплея
|
Cursor/Display
Shift Выбор типа сдвига 0 0
0 1 x x * *
|
3
|
1 - сдвиг дисплея, 0 - сдвиг курсора
|
|
2
|
1 - сдвиг
вправо, 0 - сдвиг влево
|
Cursor
At Home Курсор домой 0 0 0 0 0 0 1*
|
|
возврат курсора
в начальную позицию
|
Clear
Display Очистка дисплея 0
0 0 0 0 0 0 1
|
|
Очищает дисплей
и устанавливает курсор в начальную позицию
|
Во втором режиме передаваемые данные записываются в 10h-байт внешней памяти и
воспринимаются ЖК-индикатором как коды символов для отображения.
LCD - дисплей необходим для отображения состояний
устройств в зависимости от одного из выбранных режимов отображения и для
установки критических значений.
Режим 1.
Отображение текущей скорости и текущих оборотов на первой
строке и температур двигателя, коробки и напряжения в сети на второй строке.
Режим 2.
Отображение текущих оборотов и давления масла на первой строке и
температур двигателя, коробки и напряжения в сети на второй строке.
Режим 3.
Отображение скорости и пройденного пути на первой строке и
температур двигателя, коробки и напряжения в сети на второй строке.
Режим 4.
Отображение температуры в салоне и за бортом на первой строке и
температур двигателя, коробки и напряжения в сети на второй строке.
Установка критических значений температур и скорости
· Датчик скорости.
Представляет собой встроенное в автомобили последних моделей
устройство, на выходах которого генерируется сигнал 0 - 12В, и после
использования делителя R7 и R8 получается сигнал 0 - 5В. Для определения скорости по
сигналу, поступающему на вход МП, мы оцениваем количество импульсов за 1
секунду, зная, что на каждый метр, датчик дает 2 импульса. Затем на экране дисплея
отображается рассчитанная скорость. Т.е.
· Датчик оборотов.
Принцип действия заключается в том, что искра наводит сигнал
в катушке, который ограничивается и преобразуется операционным усилителем.
Тогда результирующий сигнал получается в диапазоне от 0 до 5В, т.е.
операционный усилитель работает как компаратор. Получение количества оборотов
происходит из расчета на то, что на каждые 2 оборота мы получаем 1 импульс.
· Блок температурных датчиков.
Состоит из четырех температурных датчиков, каждый из которых
осуществляет измерение одной температуры в некоторой точке (двигатель, коробка,
салон, за бортом). Каждый температурный датчик состоит из следующих элементов:
o Термодатчик -
полупроводниковый терморезистор. Омическое сопротивление терморезисторов
существенно изменяется (убывает или возрастает) с ростом температуры, т.е. он
выполняет функции чувствительного элемента и резистивного преобразователя.
Терморезистор помещается в защитный теплопроводной корпус с крепежной резьбой
для установки датчика в нужном месте. По мере прогрева омическое сопротивление
чувствительного элемента такого датчика уменьшается, а следовательно
уменьшается и падение напряжения.
o Повторитель, буферизирующий
сигнал;
Блок собран в виде единичного экранированного модуля, для
защиты от помех.
· Блок подачи звукового сигнала
Для упрощения данный блок выполнен в виде стандартного
мультивибратора с буферным усилением сигнала.
· Датчик напряжения
Стандартный резистивный делитель, приводящий значение
напряжения в диапазоне от 0В до 20В к диапазону от 0В - 5В
· Датчик давления
Стандартный датчик, установленный в автомобиле и имеющий
почти линейную характеристику аналогичную температурному датчику.
2.2
Выбор элементной базы
При разработке устройства были использованы следующие
электронные компоненты:
· Термодатчик КПМ (Керамическая
Полупроводниковая Масса) - для измерения температуры;
· Усилитель K544УД1 - операционный
усилитель, используется в измерительной технике и имеет высокие технические
характеристики;
· Стабилизатор K145EH5A - простой источник
стабильного напряжения;
· Диод К156KЛ - для ограничения
напряжения;
· Логический элемент «И» К561ЛА7 - для
реализации мультивибратора
· 2-х строчечный текстовый жидкокристаллический
дисплей WH1602A-YYK-CP - для вывода текстовой информации.
3.
Разработка программного обеспечения МПС
3.1
Описание основных частей программы
В программе можно выделить следующие
блоки:
· Блок объявления
переменных. В этом блоке описываются основные переменные и флаги.
· Блок инициализации
программы. В этом блоке осуществляется первоначальная настройка
микроконтроллера. Установка битов управления и направления передачи данных в
портах ввода-вывода, инициализация АЦП, а так же инициализация и включение ЖКИ
- дисплея.
· Основной цикл программы.
Осуществляет проверку нажатия одной из четырех клавиш.
· Обработчик прерывания от
таймера по его переполнению. Расчет скорости и количество оборотов за прошедшую
секунду, и сравнение полученных значений с критическими значениями. При
необходимости установка флагов.
· Обработчик прерываний по INT0. Наращивания количества
импульсов для подсчета числа оборотов.
· Обработчик прерываний по INT1. Наращивание количества
импульсов для подсчета скорости.
· Процедура записи скорости
в буфер. Формирует последовательность импульсов, которая затем будет отображена
на LCD дисплее.
· Процедура записи
температур в буфер. Формирует последовательность импульсов, которая затем будет
отображена на LCD дисплее.
· Процедура записи в буфер
информации, запрашиваемой одним из вариантов отображения. Формирование
окончательного варианта буфера, который затем будет выведен на LCD экран.
· Процедура вывода буфера
на ЖКИ. Непосредственный вывод информации, хранящейся в буфере на LCD дисплей.
· Обработчик прерываний от ADC. Запись старшей и
младшей частей результата.
3.2
Описание алгоритма работы основной программы
При включении питания начинает выполнение
основной программы. В начале нее вызывается процедура инициализации контроллера.
Установка битов управления и направления передачи данных в портах ввода-вывода,
инициализация АЦП, а так же инициализация и включение ЖКИ - дисплея. Далее
происходит зацикливание с помощью бесконечного цикла 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, /*номер последней нажатой клавиши */
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;
/*___________ 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;