Спойлер
Код: Выделить всё
#define F_CPU 1200000UL
#include <util/delay.h>
#include <stdio.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#define T_POLL 136
char mod = 0;
volatile uint8_t i;
volatile uint16_t Sec;
int rantime;
ISR(TIM0_OVF_vect)
{
TCNT0 = T_POLL;
i++;
if (i>=10) //period 1s
{
Sec++;
i=0;
}
}
int main(void) {
PRR = (1<<PRADC); // shut down ADC
TIMSK0 = (1<<TOIE0); // timer0 overflow interrupt enable
TCCR0B = (1<<CS02) | (1<<CS00); // prescaler 1/1024
i=0; Sec=0;
sei();
DDRB |=(1<<2); //транзистор
DDRB |=(1<<3); //cветодиод З
DDRB |=(1<<4); //cветодиод К
DDRB &=~(1<<1); //кнопка
rantime = 3600 + random()%3600;
while (1)
{
if (mod==0)
{
if (Sec>=5400)
{
PORTB |= (1<<2);
_delay_ms(1);
PORTB &=~(1<<2);
_delay_ms(10);
PORTB |= (1<<2);
_delay_ms(1);
PORTB &=~(1<<2);
_delay_ms(500);
PORTB |= (1<<2);
_delay_ms(1);
PORTB &=~(1<<2);
_delay_ms(10);
PORTB |= (1<<2);
_delay_ms(1);
PORTB &=~(1<<2);
Sec = 0;
}
}
if (mod==1)
{
if (Sec>=rantime)
{
PORTB |= (1<<2);
_delay_ms(1);
PORTB &=~(1<<2);
_delay_ms(10);
PORTB |= (1<<2);
_delay_ms(1);
PORTB &=~(1<<2);
_delay_ms(500);
PORTB |= (1<<2);
_delay_ms(1);
PORTB &=~(1<<2);
_delay_ms(10);
PORTB |= (1<<2);
_delay_ms(1);
PORTB &=~(1<<2);
Sec = 0;
rantime = 3600 + random()%3600;
}
}
if (PINB & (1<<1)) //
{
cli();
if (mod==0) //
{
mod = 1;
Sec = 0;
PORTB |= (1<<3);
_delay_ms(10);
PORTB &=~(1<<3);
_delay_ms(1000);
}
else //
{
mod = 0;
Sec = 0;
PORTB |= (1<<3);
_delay_ms(10);
PORTB &=~(1<<3);
_delay_ms(100);
PORTB |= (1<<3);
_delay_ms(10);
PORTB &=~(1<<3);
_delay_ms(1000);
}
sei();
}
}
}




