Описание алгоритма работы главной программы main()
При включении питания микроконтроллер начинает выполнение программы с функции 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. Приобретены навыки программирования микропроцессорных систем и построения на их основе устройств сбора и обработки информации.
Популярное: Как выбрать специалиста по управлению гостиницей: Понятно, что управление гостиницей невозможно без специальных знаний. Соответственно, важна квалификация... Почему стероиды повышают давление?: Основных причин три... Личность ребенка как объект и субъект в образовательной технологии: В настоящее время в России идет становление новой системы образования, ориентированного на вхождение... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (142)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |