7. ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ СТРОБОСКОПА

#include <avr/io.h>

#include <avr/interrupt.h> //для доступа к sei

#include <avr/signal.h>//для доступа к макросу SIGNAL

#include <avr/delay.h>

#include <util/delay.h>

#include <math.h>

#define Freq 8000000//частота системной синхронизации в Гц

int ZhachPreob,Napr,n,R,Pezim,c,U,Z,Z1,I,N;

unsigned int CurrentTime,PreviousTime,T,UGL;// временные переменнные

unsigned char addr;

//---------Интерфейс ЖКИ-----------//

// A0 R/W E DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7//

// PA5 PA6 PA7 PC0 PC1 PC2 PC3 PC4 PC5 PC6 PC7//

//---------------------------------//

#define A0 PA5//линия выбора регистра

#define RW PA6//линия выбора операции

#define E PA7//линия стробирования / синхронизации

#define BS PC7//флаг занятости

unsigned char str1[] = "Работа";

unsigned char str2[] = "Стробоскоп";

unsigned char str3[] = "Тахометр";

unsigned char str4[] = "Вольтметр";

char buffer[15];

//--------------------------Ожидание готовности------------------------------------

void LCD_wait (void)

{

do

{

 DDRC = 0x00;//порт на вход

PORTC = 0xFF;//подтяжка

PORTA &=~_BV(A0);//A0=0 (команда)

PORTA |=_BV(RW); //RW=1 (чтение)

PORTA |=_BV(E);//E=1

_delay_us(0);//задержка в 1 mc

PORTA &=~_BV(E);//E=0

}

while (bit_is_set(PINC,BS)); //ожидать сброса флага занятости

PORTA &=~_BV(RW);//RW=0

PORTA &=~_BV(E);//E=0

}

//-------------------------Запись в LCD------------------------------------------------

void LCD_write (unsigned char p)

{

PORTA &=~_BV(RW);//RW=0

PORTA |=_BV(E);//E=1

DDRC = 0b11111111;//порт C на выход

PORTC = 0b00000000;//подтяжка порта C

_delay_us(0);//задержка в 1 mc

PORTC = p;//запись байта

_delay_us(0);

PORTA &=~_BV(E);//E=0

PORTA &=~_BV(RW);//RW=0

DDRC = 0x00;//порт C на вход

PORTC = 0xFF;

_delay_us(0);

}

//------------------------Чтение из LCD----------------------------------------------

unsigned char LCD_read(void)

{

unsigned char p;//p-прочитанный байт данных

PINC = 0x00;//порт на вход

PORTC = 0xFF;//подтяжка

PORTA |=_BV(RW); //RW=1 (чтение)

PORTA |=_BV(E);//E=1

_delay_us(0);

p = PINC;//чтение входных данных

PORTA &=~_BV(E);//E=0

_delay_us(0);

PORTA &=~_BV(RW);//RW=0

PORTA &=~_BV(E);//E=0

return (p);

}

//-----------Функция ЗАПИСИ КОМАНДЫ (IR) в ЖКИ-----------------------

 void LCD_com_write (unsigned char p)//p-байт команды

{

LCD_wait ();//ожидание готовности

PORTA &=~_BV(A0);//A0=0 (команда)

LCD_write (p);//запись команды в ЖКИ

}

//---------Функция ЗАПИСИ ДАННЫХ (DR) в ЖКИ--------------------------

 void LCD_data_write (unsigned char p)//p-байт данных

{

LCD_wait ();//ожидание готовности

PORTA |=_BV(A0);//A0=1 (данные)

LCD_write (p);//запись команды в ЖКИ

}

//----------Функция ЧТЕНИЯ СЧЕТЧИКА АДРЕСА ЖКИ-------------------

unsigned char LCD_addr_read(void)

{

unsigned char p;//содержимое счетчика адреса

LCD_wait ();

PORTA &=~_BV(A0);//A0=0 (команда)

p = LCD_read();//чтение команды из ЖКИ

p = (p & 0b01111111);//отбрасывание бита занятости

return (p);//функция возвращает прочитанное

// содержание адреса счетчика

}

//--------Функция ЗАПИСИ команды в ЖКИ (при инициализации)--------

void LCD_com_init (unsigned char p)

{

DDRC = 0b11111111;//порт D на выход

PORTC = 0b00000000;//подтяжка порта D

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)//низковольтный провод (коммутатор)

{

CurrentTime = TCNT1; //записываем текущее значение таймера

//если нет переполнения, то

if (CurrentTime > PreviousTime) T = CurrentTime - PreviousTime;

//если есть переполнение Т/С

else T = 0xFFFF + CurrentTime - PreviousTime;

PreviousTime = CurrentTime;//текущее значение стало предыдущим

U=60.0*31250/(0.5*T);//скорость вращения коленвала

sprintf(buffer,"%06u",U); //форматирование

LCD_out_str (buffer,0x40);//вывод числового значения на ЖКИ, 2

// строка

}

}

void Stroboskop (void)

{

int c ++;

CurrentTime = TCNT1;//записываем текущее значение таймера

//если нет переполнения, то

if (CurrentTime > PreviousTime) T = CurrentTime - PreviousTime;

//если есть переполнение Т/С

else T = 0xFFFF + CurrentTime - PreviousTime;

PreviousTime = CurrentTime;//текущее значение стало предыдущим

if (c=3)

{

if(PIND & 0x01)== 0x01)высоковольтный провод (емкостной //синхронизатор)

{

 UGL=T/720; //2 оборота 1 импульс

 n = 31250/T; // частота искрообразований

 R = 0;//обнуление счетного регистра

 Z = 0;

while ((PINB & 0x01)== 0x01) //пока режим нажат в цикле "режим"

i = 0;

{

for (i = 0, i = n, i ++)//импульсы на HL

{

if (i = 1) P();

else if (i = n/2) P();

else if (i = n) P();

_delay_loop_2(T/n);

sprintf(buffer,"%06u",R); //форматирование

 LCD_out_str (buffer,0x40);//вывод числового значения на ЖКИ

}

}

}

if (PIND & 0x04) == 0x04)//низковольтный провод (коммутатор)

{

 UGL=T/180; //1 оборот 2 импульс

 n = 31250/T; // частота искрообразований

 R = 0;//обнуление счетного регистра

 Z = 0;

while ((PINB & 0x10)== 0x10) //пока режим нажат в цикле "режим"

i = 0;

{

for (i = 0, i = n, i ++)//импульсы на HL

{

if (i = 1) P();

else if (i = n/2) P();

else if (i = n) P();

_delay_loop_2(T/n);

sprintf(buffer,"%06u",R); //форматирование

 LCD_out_str (buffer,0x40);//вывод числового значения на ЖКИ

}

}

}

}

int main (void)

{

//--------------------------------/*Настройка портов*/-------------------------------

DDRB = 0x00;//PB0 - режим

PORTB =0xFF;

DDRD = 0x00;// PD2 - выбор (по внешнему прерыванию),

PORTD =0xFF;

DDRA = 0xE2;//PA1-вход c датчика напряжения

PORTA =0x1D;//PA2-выход на лампу HL

//-------------------------------------------------------------------------------------------

//-------------------------------/*Настройка таймера*/------------------------------

TCCR1A = 0;//режим ШИМ выключен

TCCR1B = _BV(CS12);//коэффициент деления частоты системной

// синхронизации = 256

//-------------------------------------------------------------------------------------------

//--------------------------------/*Настройка АЦП*/---------------------------------

ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS2);//ADEN-разрешь

// работу АЦП, делитель частоты

// АЦП =64(8000000МГц/64=125кГц)

ADMUX = (1<<ADLAR)| (1<<REFS0);//выравнивание результата

 // по правому краю выбран первый канал

 // напряжение питания AVcc

//-------------------------------------------------------------------------------------------

//---------------------------------/*Настройка прерываний*/-----------------------

GICR = 0x40;//разрешить прерывания по выводу INT0

MCUCR = (1<<ISC11)|(1<<ISC10)|(1<<ISC01)|(1<<ISC00);//генерация внешних прерываний по нарастающему фронту

//-------------------------------------------------------------------------------------------

sei ();//разрешить прерывания

//----------------------------------------------ЖКИ--------------------------------------

LCD_init();//инициализация

while(1)

{

Pezim = 0;//обнуление счетного регистра

LCD_out_str (str1,0x00);

while ((PINB & 0x01) == 0x01)

{

if (Pezim ==1) Haprezenie ();

if (Pezim ==2) Tahometr ();

if (Pezim ==3) Stroboskop ();

if (Pezim ==3) LCD_out_str (str2,0x00);//стробоскоп

if (Pezim ==2) LCD_out_str (str3,0x00);//тахометр

if (Pezim ==1) LCD_out_str (str4,0x00);//вольтметр

}

}

}

При использовании стробоскопа с лампой вспышкой необходимо заменить «процедуру Импульс 1» на «процедуру Импульс 2»

 //---------------------------------Процедура Импульс 2----------------------------

void P (void)//формирование импульса к лампе вспышке

{

if (Z1>Z) { _delay_loop_2(Z1);}

DDRA = 0xE2;

 PORTA = 0x1D;

 _delay_loop_2(40);//длительность вспышки

 Z1 = 0;

DDRA = 0x1F;

 PORTA = 0xE0;

}



Информация о работе «Разработка автомобильного стробоскопа»
Раздел: Транспорт
Количество знаков с пробелами: 83541
Количество таблиц: 16
Количество изображений: 16

Похожие работы

Скачать
118205
14
11

... -4002; 5)  пинцет ППМ 120 РД 107.290.600.034-89; 6)  тара АЮР 7877-4048. Суммарное оперативное время Топ = 2 мин. Комплект технологической документации на технологический процесс сборки и монтажа блока стробоскопического прибора приведен в приложении. 5. ПРОЕКТИРОВАНИЕ УЧАСТКА СБОРКИ И МОНТАЖА Внедрение на предприятии механизированных, автоматизированных и автоматических поточных линий ...

Скачать
41840
4
1

... заслонки. д) Подсоединить шланги вентиляции картера и вакуумный шланг. е) Подсоединить трос системы поддержания скорости. ж) Установите воздуховод с переходником. 3.Техническое обслуживание трансмиссии   3.1 Проверка рабочей жидкости в АКПП   Автомобиль должен совершить пробег для достижения нормальной рабочей температуры 70 - 80°С рабочей жидкости. 1. Установить автомобиль на ровной ...

Скачать
98140
13
0

... . На участке установлены кран-балки в первом и втором помещении, для перемещения тяжелых запасных частей, и самого двигателя в целом. 1.3.8 Организация ТО и ТР на участке Схема технологического процесса Т.О. и ремонта автомобилей При возвращении с линии автомобиль проходит через контрольно-технический пункт (КТП), где дежурный ме­ханик проводит визуальный осмотр автомобиля (автопоез­да) и ...

Скачать
178264
27
8

... рынке для выживания в конкурентной среде и успешного развития предприятию необходим четко разработанный план как на длительную перспективу, так и на текущий период. ГЛАВА 2. АНАЛИЗ ПОЛОЖЕНИЯ ПРЕДПРИЯТИЯ ООО «АВТОДОМ-АТЭКС» НА РЫНКЕ УСЛУГ АВТОСЕРВИСА   2.1 Краткая технико-экономическая характеристика предприятия Предприятие «Автодом–Атэкс» учреждено на основании решения участников от 23 ...

0 комментариев


Наверх