/***************************************************** Chip type : ATmega8535 Program type : Application Clock frequency : 7,372800 MHz Memory model : Small External SRAM size : 0 Data Stack size : 128 *****************************************************/ #include // 1 Wire Bus functions #asm .equ __w1_port=0x18;PORTB .equ __w1_bit=0 #endasm #include <1wire.h> #include // стандартная функция задержек #include #define LED PORTB.1 // выход на индикатор чтения #define BEEP PORTB.2 // выход BEEP #define ALARM PORTB.3 // выход ALARM #define START PORTB.4 // выход на включение системы unsigned char rom_code[9]; //выделяет память (9 бит умноженное на кол-во устройств) unsigned char counter=0; unsigned char my_code_1[9]={0x01,0x1E,0x06,0xCA,0x0C,0x00,0x00,0x70,0x01}; //unsigned char my_code_2[9]={0x01,0xFD,0xE2,0xCC,0x0C,0x00,0x00,0xCC,0x01}; //функция инициализации микроконтроллера void initialization(void) { // Port B initialization // Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=Out Func1=Out Func0=Out // State7=T State6=T State5=T State4=T State3=0 State2=0 State1=0 State0=0 PORTB=0x00; DDRB=0b00011110; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x04; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; SFIOR=0x00; // 1 Wire Bus initialization w1_init(); #asm("wdr") // Watchdog Timer initialization // Watchdog Timer Prescaler: OSC/2048k #pragma optsize- WDTCR=0x1F; WDTCR=0x0F; #asm("wdr") #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif } void beep(void) //функция звукового сигнала BEEP { unsigned char a=0; unsigned char b=0; for (b=0;b<2;b++) { for(a=0;a<150;a++) { BEEP=1; delay_us(377); BEEP=0; delay_us(377); }; delay_ms(100); }; } void engine_start(void) { TCCR1B=0x00; //останавливаем таймер TIMER1 beep(); LED=1; //*****временно, для отладки ***** START=1; //включаем реле на одну секунду, после этого блокируем реле аппаратно #asm("wdr") delay_ms(1000); START=0; end: #asm("wdr") goto end; } void alarm(void) { TCCR1B=0x00; //останавливаем таймер TIMER1 warning: #asm("wdr") ALARM^=1; delay_ms(1000); #asm("wdr") ALARM^=1; delay_ms(1000); goto warning; } void test_key(void) //функция проверки номера ключа с эталонным { if(memcmp(rom_code,my_code_1,9)==0) engine_start(); else alarm(); } void search(void) { unsigned char key; key=w1_search(0xf0,rom_code); //ищем устройство командой 0xf0, в rom_codes ложится 9 байт //(family-1,serial-6,CRC8-1,некоторые устройства возвращают 9 байт) if (key==1) { test_key(); }; } interrupt [TIM1_OVF] void timer1_ovf_isr(void) //oбработка прерывания по переполнению таймера TIMER1 { TCCR1B=0x00; //останавливаем таймер TIMER1 LED=1; //моргаем светодиодом *****временно, для отладки***** delay_ms(10); LED=0; counter++; TCCR1B=0x03; //запускаем таймер TIMER1 } void main(void) { initialization(); #asm("sei") // Разрешение прерываний TCCR1B=0x03; // запуск счетчика TIMER1 { begin: #asm("wdr") if (counter<=60) { search(); } else { alarm(); }; goto begin; } }