Мегаобучалка Главная | О нас | Обратная связь


Описание алгоритма работы главной программы main()



2020-03-19 142 Обсуждений (0)
Описание алгоритма работы главной программы main() 0.00 из 5.00 0 оценок




 

При включении питания микроконтроллер начинает выполнение программы с функции main(). В ней описаны команды инициализации контроллера: настройка АЦП на порт RA0, настройка LCD-дисплея (4-х разрядная шина данных, 2 сточки, последовательное перемещение курсора), конфигурация портов на ввод и на вывод, разрешение прерываний от порта В и таймера 0. Далее происходит зацикливание при помощи бесконечного цикла while(1), в теле которого происходит проверка управляющих флагов и в зависимости от состояния этих флагов осуществляется вызов соответствующих процедур и сброс состояния флага.

 

Листинг программы

 

#include <pic.h>

#define PORTBIT (adr, bit) ((unsigned) (&adr)*8+ (bit))bit RS @ PORTBIT (PORTC, 6);bit RW @ PORTBIT (PORTC, 5);bit E @ PORTBIT (PORTC, 4);probel=0x20 ;//0x20; //0x5Fint _time=0,_settime, _time1=0,_time2=0,_time3=0,_time4=0;char status=0, temperature, settemperature=50, regim=1, subregim=0, mig=0;char d1=0, d2=0, d3=0, d4=0, d5=0, d6=0, kl=0, displayed=1;

//Функция корректировки представления времениCorrectTime(unsigned int &ttime)

{(ttime>24*60-1)

{ttime=_time1=_time2=_time3=_time4=0;

}

}

//Функция корректирования температурыCorrectTemperature(unsigned char &ttemperature)

{(ttemperature>99) ttemperature=99;(ttemperature<30) ttemperature=30;

}

//ПаузаWait(uchar kk)

{(kk--);

}

//Читаем из индикатораchar ReadInd(void)

{char DATA;=0x0F;//на ввод 4мл бита порта

RW=1;=1;=(PORTC&&0x0F)<<4;//считываем 4ст. бита=0;=1;=DATA||(PORTC&&0x0F);//считываем 4мл бита=0;=0;(DATA);

}

//Записываем в индикатор код

void WriteInd(uchar Dann)

{stDann, mlDann;=Dann&&0xF0;//старшие тетрады=Dann&&0x0F;//младшие тетрады=0;=0;=PORTC&&0xF0;//очищаем 4мл бита порта С=PORTC||stDann;//передаём 4ст бита

E=1;=0;=PORTC&&0xF0;//очищаем 4мл бита порта С=PORTC||mlDann;//передаём 4мл бита=1;=0;=0x0F;

}

//Проверка готовности индикатораCheck(void)

{DATA;//описали переменную DATA типа uchar

RS=0;

{=ReadInd();<<=1;

}(CARRY);//если бит переноса равен 1,то индикатор не готов

}WriteData(uchar kod)

{(20);

Check();=1;(kod);//записать в индикатор код

}WriteCommand(uchar kod)

{(20);//пауза(20 машинных циклов)();//проверить состояния индикатора=0;(kod);//записать в индикатор код

RS=1;

}

//Вывод на дисплейDisplay(int i)

{(_time);(settemperature);(_settime);

WriteCommand(0x01);//(00000001)очистка экрана

// -------Вывод 1-го режима------------

if (i==1) {(status==1)

{(0x4f); //O(0x6E); //n(probel); //_

} else

{(0x4f); //O(0x66); //f(0x66); //f

}(0x7c); //|(probel); //_(0x54); //T(0x69); //i(0x6D); //m(0x65); //e(0x3A); //:(probel); //_(0x30+(_time/60)/10); //desyatki chasov(0x30+(_time/60)%10); //edinitsy chasov(0x3A); //:(0x30+(_time%60)/10); // desytki minut(0x30+(_time%60)%10); // edinitsy minut

//вторая строка(0x54); //T(0x65); //e(0x6D); //m(0x70); //p(0x65); //e(0x72); //r(0x61); //a(0x74); //t(0x75); //u(0x72); //r(0x65); //e(0x3A); //:(probel); //_(0x30+temperature/10); // desyatki temperatury(0x30+temperature%10); // edinitsy temperatury((temperature<settemperature)||(mig==0))(probel); //_(0x21); //!

}

// -------Вывод 2-го режима------------(i==2) {

WriteData(probel); //_(probel); //_(probel); //_(probel); //_(0x53); //S(0x65); //e(0x74); //t(probel); //_(0x54); //T(0x69); //i(0x6D); //m(0x65); //e(0x3A); //:(probel); //_(probel); //_(probel); //_

//вторая строка(probel); //_(probel); //_(probel); //_(probel); //_(probel); //_(probel); //_((mig==1)&&(subregim==1)) {(probel); //_(probel); //_

} else

{(0x30+(_settime/60)/10); //desyatki chasov(0x30+(_settime/60)%10); //edinitsy chasov

}(0x3A); //:((mig==1)&&(subregim==2)) {(probel); //_(probel); //_

} else

{(0x30+(_settime%60)/10); // desytki minut(0x30+(_settime%60)%10); // edinitsy minut

}(probel); //_(probel); //_(probel); //_(probel); //_(probel); //_

}

//-----------------------------------------------------------

// -----Вывод 3-го режима-------------------(i==3) {(probel); //_(probel); //_(probel); //_(probel); //_(0x43); //C(0x72); //r(0x69); //i(0x74); //t(0x69); //i(0x63); //c(0x61); //a(0x6c); //l(probel); //_(probel); //_(probel); //_(probel); //_

//вторая строка(probel); //_(0x54); //T(0x65); //e(0x6D); //m(0x70); //p(0x65); //e(0x72); //r(0x61); //a(0x74); //t(0x75); //u(0x72); //r(0x65); //e(0x3A); //:(probel); //_((mig==1)&&(subregim==1)) {(probel); //_(probel); //_

} else

{(0x30+settemperature/10); // desyatki temperatury(0x30+settemperature%10); // edinitsy temperatury

}

}

//------Вывод 4-го режима-------(i==4) {

WriteData(0x53); //S(0x65); //e(0x6e); //n(0x73); //s(0x6f); //o(0x72); //r(probel); //_(0x31); //1(0x3A); //:(probel); //_(_time1==0) {(probel); //_(0x4E); //N(0x6F); //o(0x74); //t(probel); //_

} else

{WriteData(0x30+(_time1/60)/10); //desyatki chasov(0x30+(_time1/60)%10); //edinitsy chasov(0x3A); //:(0x30+(_time1%60)/10); //desyatki minut(0x30+(_time1%60)%10); //edinitsy minut

}(probel); //_

 

//вторая строка(0x53); //S(0x65); //e(0x6e); //n(0x73); //s(0x6f); //o(0x72); //r(probel); //_(0x32); //2(0x3A); //:(probel); //_(_time2==0) {(probel); //_(0x4E); //N(0x6F); //o(0x74); //t(probel); //_

} else

{WriteData(0x30+(_time2/60)/10); //desyatki chasov(0x30+(_time2/60)%10); //edinitsy chasov(0x3A); //:(0x30+(_time2%60)/10); //desyatki minut(0x30+(_time2%60)%10); //edinitsy minut

}(probel); //_

}

//------Вывод 5-го режима-------(i==5) {

(0x53); //S(0x65); //e(0x6e); //n(0x73); //s(0x6f); //o(0x72); //r(probel); //_(0x33); //3(0x3A); //:(probel); //_(_time3==0) {(probel); //_(0x4E); //N(0x6F); //o(0x74); //t(probel); //_

} else

{WriteData(0x30+(_time3/60)/10); //desyatki chasov(0x30+(_time3/60)%10); //edinitsy chasov(0x3A); //:(0x30+(_time3%60)/10); //desyatki minut(0x30+(_time3%60)%10); //edinitsy minut

}(probel); //_

//вторая строка(0x53); //S(0x65); //e(0x6e); //n(0x73); //s(0x6f); //o(0x72); //r(probel); //_(0x34); //4(0x3A); //:(probel); //_(_time4==0) {(probel); //_(0x4E); //N(0x6F); //o(0x74); //t(probel); //_

} else

{WriteData(0x30+(_time4/60)/10); //desyatki chasov(0x30+(_time4/60)%10); //edinitsy chasov(0x3A); //:(0x30+(_time4%60)/10); //desyatki minut(0x30+(_time4%60)%10); //edinitsy minut

}(probel); //_

}

}

//>>--------Нажатие кнопки "On/Off"---------------------on_off() {=!status;

}

//<<----------------------------------------------------

//>>--------Нажатие кнопки "-" -------------------------Down() {(subregim==0)

{regim --;

_settime=_time;(regim<1) regim=1;

}((regim==2)&&(subregim==1)) _settime-=60;((regim==2)&&(subregim==2)) _settime-=1;((regim==3)&&(subregim==1)) settemperature-=1;

}

//<<

//>>-------- Нажатие кнопки "+"-------------------------Up() {(subregim==0)

{regim ++;=_time;(regim>5) regim=5;

}((regim==2)&&(subregim==1)) _settime+=60;((regim==2)&&(subregim==2)) _settime+=1;((regim==3)&&(subregim==1)) settemperature+=1;

}

//<<----------------------------------------------------

//>>--------Нажатие кнопки Select-----------------------Select()

{(regim==2){++;(subregim==3)

{subregim=0;=2;

_time=_settime;

}

}(regim==3){++;(subregim==2)

{subregim=0;=3;

}

}

}

//<<-------------------------------------------------------INTR()

{(T0IF)//запрос прерывания от таймера

{=0x6;//(00000110)загрузка в таймер начального значения (переполнение через 250 циклов, 1 цикл = 1 мкс)++;//отсчёт четвертей миллисекунд((ms==2000)||(ms==4000)) mig=!mig; //флаг мигания курсора(ms>4000)//если миллисекунд больше 1000

{ms=0;//обнуление

_time++;

//>>------------Проверка термодатчика-----------------------------=1;

//<<--------------------------------------------------------------

//>>----------Проверка 1-го датчика движения----------------------((RA1==0)&&(status==1)) d2=1;

//<<--------------------------------------------------------------

//>>----------Проверка 2-го датчика движения----------------------((RA2==0)&&(status==1)) d3=1;

//<<--------------------------------------------------------------

//>>----------Проверка 3-го датчика движения----------------------((RA3==0)&&(status==1)) d4=1;

//<<--------------------------------------------------------------

//>>----------Проверка датчика дыма-------------------------------((RA4==0)&&(status==1)) d5=1;

//<<--------------------------------------------------------------

//>>----------Проверка линии разрыва------------------------------((RA5==1)&&(status==1)) d6=1;

//<<--------------------------------------------------------------

//>>-----При включённом состоянии мигание светодиода -------------

if ((status==1)&&(mig==1)) RC7=0; else RC7=1;

//<<--------------------------------------------------------------=1;

}IF=0;//сброс флага запроса прерывания от таймера

}(RBIF)//запрос прерывания от клавиатуры

{// прерывание от клавиатуры(!RB7) kl=1;

if (!RB6) kl=2;(!RB5) kl=3;

if (!RB4) kl=4;=0;//сброс флага запроса прерывания от клавиатуры

}

}//конец обработки прерыванийmain ()

{=0xFF;// настройка RA<0-5> как входы=0xF0;//(11110000)конфигурация порта на ввод=0;//конфигурация порта на вывод(0x30);

WriteCommand(0x28);//(00101000) 5x8, 2 строки, 4 разр. SD(0x0С);//(00001100) включение ЖК(0x06);//(00000110) настройка курсора (сдвиг на 1 вправо)ADCON0=0x41;//(01000001)включение модуля АЦП, частота Fosc/8;=0x8E;//(10001110)// включаем 0-й каналов АЦП=0xA8;//(10101000)

// бит 7 - разрешены все немаскированные прерывания (GIE)

// бит 6 - запрещены прерывания от переферийных модулей (PEIE)

// бит 5 - разрешены прерывания по переполнению TMR0 (T0IE)

// бит 4 - запрещены внешние прерывания INT (INTE)

// бит 3 - Разрешены прерывания по изменению сигналов на входах-RB4 (RBIE)

// бит 2 - флаг прерывания по переполнению TMR0 (T0IF)

// бит 1 - флаг внешнего прерывания INT (INTF)

// бит 0 - флаг прерывания по изменению сигналов на входах-RB4 (RBIF)(1)

{

//проверка термодатчика(d1==1)

{ d1=0;=1;//запускаем АЦП(ADGO);//ждем пока АЦП закончит преобразование

temperature=(ADRESL+ADRESH*256)*5000/1023;//вычисляем температуру((temperature>settemperature)&&(status==1))

RB0=1 else RB0=1; // сработал датчик температуры

}(d2==1) _time1=_time; // сработал 1-й датчик движения(d3==1) _time2=_time; // сработал 2-й датчик движения(d4==1) _time3=_time; // сработал 3-й датчик движения

if (d1||d2||d3) {RB1=1; d1=d2=d3=0;} else RB1=0;(d5==1) {RB2=1; d5=0} else RB2=0; //сработал датчик дыма(d6==1) {RB3=1; _time4=_time; d6=0} else RB3=0; //сработала линия разрыва(displayed) {Display(Regim); displayed=0;}(kl==1) {on_off(); kl=0;}(kl==2) {Down(); kl=0;}(kl==3) {Up(); kl=0;}

if (kl==4) {Select(); kl=0;}

};

}

 


 

Заключение

 

При выполнении данного курсового проекта была изучена архитектура микроконтроллера PIC16F876 фирмы Microchip и построена на его основе микропроцессорная система сигнализации. При этом также был изучен текстовый жидкокристаллический дисплей WH1602A-YYK-CP фирмы Winstar и встроенный в него контроллер HD44780. Приобретены навыки программирования микропроцессорных систем и построения на их основе устройств сбора и обработки информации.



2020-03-19 142 Обсуждений (0)
Описание алгоритма работы главной программы main() 0.00 из 5.00 0 оценок









Обсуждение в статье: Описание алгоритма работы главной программы main()

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Как выбрать специалиста по управлению гостиницей: Понятно, что управление гостиницей невозможно без специальных знаний. Соответственно, важна квалификация...
Личность ребенка как объект и субъект в образовательной технологии: В настоящее время в России идет становление новой системы образования, ориентированного на вхождение...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (142)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.006 сек.)