"Светофор" на AT90USB162

article177.jpg

2.3 Описание переменных, констант, функций, библиотек

 

         Подключим необходимые библиотеки, и назначим константы для портов:

#definered_p PORTB.0    // Порт красного цвета

#defineyellow_p PORTB.1 // Порт желтого цвета

#definegreen_p PORTB.2 // Порт зеленного цвета

#definealert_p PORTB.3 // Порт звукового динамика

#defineind PORTB.4      // порт дежурного индикатора

#definedelay_p 9        // множитель задержек

#definewink 4          // количество миганий

#definewink_t 80      // задержка миганий

#include<90usb162.h> // Библиотека контроллера

#include<delay.h>    // Библиотека задержки

 

Опишем переменные и EEPROMпеременные для сохранения наших состояний

unsignedint i; // служебные переменные

unsignedint z; // служебные переменные

unsignedint y; // служебные переменные

bit w;        // переменная включения миганий и звука

bitb_int;    // переменная прерываний

bit b2_int;    // переменная прерываний

intmode; // переменная переключения режима светофора

bitdis_spk; // Отключение динамика

bitdop; // Дополнительный режи

eeprom unsigned inte_dis_spk; // Eepromпеременнаядлядинамика

eeprom unsigned inte_mode; //    Eepromпеременнаядлярежима

 

Опишем функции для каждого светового сигнала

int red (unsigned int c)    // крассныйцвет

{

if(b_int) return 0;   // если нажали кнопку то выходим из функции

if(w) alert(5);red_p=1;

delay_ms(delay_p*c);

if(w) for(i=1; i<=wink; i++)

{red_p=1;delay_ms(wink_t*delay_p);

if(dop==0) red_p=0;alert(5);

delay_ms(wink_t*delay_p);}

if(dop==0) red_p=0;

return 1;}

 

Также описываются другие функции для 2-х остальных индикаторов

         Опишем функцию 2-х тонального звукового уведомления использую стандартные функции

int alert(unsigned int x)        // функциязвукаиз 2 нот

{

if(dis_spk) return 0;

for(y=0;x>y; y++)

{for(z=0; z<41; z++){alert_p=1;

delay_us(150);

alert_p=0;

delay_us(150);}}

for(y=0;x>y; y++)

{for(z=0; z<41; z++)

{alert_p=1;

delay_us(170);

alert_p=0;

delay_us(170);}}return 1;}

 

Опишем наши прерывания для 2 кнопок:

interrupt [EXT_INT5] void ext_int5_isr(void) // прерываниережима

{if(b_int==0) {

b_int = 1;

ind=0;

mode = (mode>=4)?1:mode+1;

e_mode=mode; 

for(i=1; i<=mode; i++) { alert(10); delay_ms(10*delay_p); }

#asm("jmp 0") // переинициализацияконтроллера

} }

interrupt [EXT_INT7] void ext_int7_isr(void)   // прерываниезвуковогорежима

{

if(b2_int==0) {

b2_int=1;

dis_spk=~dis_spk;

e_dis_spk=dis_spk;

alert(5);}}

 

Включение прерываний и перевод режимов из EPPROM

#asm("sei")

mode=e_mode;

dis_spk=e_dis_spk;

delay_ms(5*delay_p);

w = 0;

dop=0;

после включения контроллера предусмотрен режим самопроверки если не включен режим – светофор отключен

if (mode!=4){

red(5*delay_p);

yellow(5*delay_p);

green(5*delay_p);

alert(5);

}

Задержка включения, и включение режима мигания

delay_ms(50*delay_p);

w = 1;

ind=1;

 

Главная функция программы выполняется в вечном цикле, опишем ее

while (1) // вечный цикл

      {

switch(mode) // Переключсение режимов

{

case 1:

red(150*delay_p);

yellow(40*delay_p);

green(150*delay_p);

yellow(40*delay_p);

break;

case 2:

dop=1;

red(150*delay_p);

yellow(40*delay_p);

green(150*delay_p);

yellow(40*delay_p);

dop=0;

break;

case 3:

yellow(wink_t);

alert(10);

delay_ms(wink_t*delay_p);

break;

case 4:

delay_ms(wink_t*delay_p);

ind=0;

delay_ms(wink_t*delay_p);

break;

      }

 

ind=1;

b_int=0;

      b2_int=0;

}}

 

Страницы: 1 2 3 4 5 6 7 8
Рейтинг: 0 Голосов: 0 6456 просмотров
Комментарии (0)

Нет комментариев. Ваш будет первым!