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

article177.jpg
 

Приложение

#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>    // Библиотека задержки
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 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;
}

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;
}

int yellow (unsigned int c) // желтыйцвет
{
if(b_int) return 0;  // если нажали кнопку  то выходим из функции
yellow_p=1;
delay_ms(delay_p*c);
yellow_p=0;
if(dop) red_p=0;
return 1;
}
int green (unsigned int c) //  зеленныйцвет
{
if(b_int) return 0;    // если нажали кнопку то выходим из функции
if(w) alert(5);
green_p=1;
delay_ms(delay_p*c);
if(w) for(i=1; i<=wink; i++)
{
green_p=1;
delay_ms(wink_t*delay_p);
green_p=0;
alert(5);
delay_ms(wink_t*delay_p);
}
green_p=0;
return 1;
// прерывание по фронту
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);
}
}
voidmain(void)
{
// Кварцевый генератор  (кратность)
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// настройка порта B
PORTB=0x00;
DDRB=0xFF;
// настройка порта C
PORTC=0x00;
DDRC=0x00;
// настройка порта D
PORTD=0x90;
DDRD=0x00;

//Прерывание только на INT5 и INT7
EICRA=0x00;
EICRB=0x88;
EIMSK=0xA0;
EIFR=0xA0;
PCMSK0=0x00;
PCMSK1=0x00;
PCICR=0x00;
// Инициализации аналогового компаратора
ACSR=0x80;
// Разрешить глобальные прерывания
#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 6458 просмотров
Комментарии (0)

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