#include < avr/io.h > #include< avr/interrupt.h > void USART_Transmit( unsigned char data ); void USART_Init( unsigned int ubrr); //Подпрограмма обработки прерывания ISR(USART_RXC_vect) { int b; b = UDR; // Выполняем обработку принятого байта if (b=='1')//Если приняли "1" { USART_Transmit('R');//Отправляем букву "R" USART_Transmit(0x0d);//переход в начало строки USART_Transmit(0x0a);//переход на новую строку } else//Если нет if (b=='2')//Если приняли "2" { USART_Transmit('L');//Отправляем букву "L" USART_Transmit(0x0d);//переход в начало строки USART_Transmit(0x0a);//переход на новую строку } } void USART_Init( unsigned int ubrr)//Инициализация модуля USART { /* Задаем скорость работы USART */ UBRRH = (unsigned char)(ubrr>>8); UBRRL = (unsigned char)ubrr; /* Разрешаем прием и передачу по USART */ UCSRB=(1 << RXEN)|( 1 << TXEN); UCSRB |= (1 << RXCIE); //UCSRB=(1 << RXEN)|(1 << TXEN)|(1 << RXCIE); /* Устанавливаем формат данных 8 бит данных, 2 стоп бита */ UCSRC=0x86;// Инициализация именно для ATmega8 UCSRC = (1 << URSEL)|(1 << USBS)|(3 << UCSZ0); } void USART_Transmit( unsigned char data ) //Функция отправки данных { while ( !(UCSRA & (1 << UDRE)) ); //Ожидание опустошения буфера приема UDR = data; //Начало передачи данных } int main(void)//главная программа { //Скорость USART 115200 при кварцевом генераторе 16MHz USART_Init (8); USART_Transmit('O');//Передаем при включении USART_Transmit('k');//сообщение "Ok!", что свидетельствует USART_Transmit('!');//о правильно работе программы USART_Transmit(0x0d);//переход в начало строки USART_Transmit(0x0a);//переход на новую строку sei();//разрешаем глобально прерывания while(1)//вечный цикл {//тут пусто, да можно и так писать :) }// }