Каждый, у кого нет машины, мечтает её купить; и каждый, у кого есть машина, мечтает её продать. И не делает этого только потому, что, продав, останешься без машины. (К-ф 'Берегись автомобиля')
Программное обеспечение стробоскопа
PORTA &=~_BV(A0); //A0=0 (команда)
PORTA &=~_BV(RW); //RW=0
PORTA |=_BV(E); //E=1
_delay_us(60); //задержка в 1 mc
PORTC = p; //запись байта
_delay_us(60);
PORTA &=~_BV(E); //E=0
_delay_us(0);
PORTA &=~_BV(RW); //RW=0
_delay_us(60);
}
//---------------------Функция иницилизации ЖКИ------------------------------------------
void LCD_init ()
{
_delay_ms(20); //ожидание 20 мс
LCD_com_init(0x33); //установка разрядности интерфейса
_delay_ms(40);
LCD_com_init(0x33); //установка разрядности интерфейса
_delay_ms(40);
LCD_com_init(0x33); //установка разрядности интерфейса
_delay_ms(40);
LCD_com_init(0x3A); //8 битный интерфейс, 1 страница знакогенератора
LCD_com_init(0x08); //включение дисплея
LCD_com_init(0x01); //очистка дисплея
LCD_com_init(0x06); //сдвиг курсора вправо
LCD_com_init(0x0F); //включение дисплея, мигающий курсор
}
//-----------Функция вывода строки в ЖКИ по адресу "addr"----------------------
void LCD_out_str(unsigned char str[],unsigned char addr)
{
unsigned char a; //номер символа в стоке
unsigned char addr_t; //текущее содержание счетчика адреса ЖКИ
a = 0;
LCD_com_write ((addr + 0x80)); //установка курсора на начало строки
while (str[a] !='\0') //ждать окончания строки
{
addr_t = LCD_addr_read(); //стение текущего адреса вЖКИ
if (addr_t > 0x10) //если курсор уходит из видимой
{ // области первой строки, то
LCD_com_write (0x80); // восстанавливаем его на начало
// первой строки
}
LCD_data_write(str[a]); //Передача данных
a++;
}
}
//----------------------------------------Процедура Импульс 1-------------------------------
void P (void) //формирование импульса к лампе вспышке
{
if (Z1>Z) { _delay_loop_2(Z1);}
DDRA = 0xE2;
PORTA = 0x1D;
_delay_loop_2(40); //длительность вспышки
Z1 = 0;
DDRA = 0x1F;
PORTA = 0xE0;
}
//-----------------------------Прерывание----------------------------------------------------
SIGNAL (SIG_INTERRUPT1)
{
Z1 = UGL; //сдвинуть периода на градус
R++; //отсчет градусов
Pezim++;
if (Pezim < 3)
{
_delay_loop_2(31250);} //задержка в 1 секунду
}
}
//-----------Процедура расчета напряжения---------------------------------------------
void Haprezenie (void)
{
DDRA = 0xE2;
PORTA =0x1D;
ADCSRA = (1<<ADSC); //запуск АЦП
loop_until_bit_is_set(ADCSRA,ADIF); //ожидаем флаг прерывания ADIF
ZhachPreob = (ADCH*255) + ADCL; //вычисляем текущее значение
// преобразования
Napr = ZhachPreob*5/255; //получим значение измеренного
// напряжения в десятичной форме
sprintf(buffer,"%06u",Napr); //форматирование - представление
//числового результата
LCD_out_str (buffer,0x40); //вывод числового значения на ЖКИ, 2
// строка
}
//------------------------------------------------------------------------------
void Tahometr (void)
{
if(PIND & 0x01)== 0x01) //высоковольтный провод (емкостной //синхронизатор)
{
CurrentTime = TCNT1; //записываем текущее значение таймера
//если нет переполнения, то
if (CurrentTime > PreviousTime) T = CurrentTime - PreviousTime;
//если есть переполнение Т/С
else T = 0xFFFF + CurrentTime - PreviousTime;
PreviousTime = CurrentTime; //текущее значение стало предыдущим
U=60.0*2*31250/(T); //скорость вращения коленвала
sprintf(buffer,"%06u",U); //форматирование
LCD_out_str (buffer,0x40); //Вывод числового значения на ЖКИ, 2
// строка
}
if(PIND & 0x04)== 0x04) //низковольтный провод (коммутатор)