Категории
Самые читаемые
onlinekniga.com » Компьютеры и Интернет » Программирование » Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С - Стивен Барретт

Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С - Стивен Барретт

Читать онлайн Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С - Стивен Барретт

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 89 90 91 92 93 94 95 96 97 ... 150
Перейти на страницу:

void delay_5ms(void); //задержка 5 мс

void initialize_lcd(void); //инициализация контроллера ЖК

                           //индикатора

void initialize_key(void); //инициализация портов для

                           //клавиатуры

void putchars(unsigned char с); //запись одного символа в индикатор

void putcommands(unsigned char d); //запись одной команды в индикатор

void lcd_print(char *string); //запись в индикатор строки символов

char keypad(unsigned int keypress, int row);

void main(void) {

 int first = 0х01; //инициализация служебных переменных для опроса

 int second = 0х02; //клавиатуры

 int third = 0х04;

 int fourth = 0х08;

 int i,j,k, count = 0;

 unsigned int keypress;

 char key;

 int length=4;

 char pin[] = {'С', '9', '6', '3'}; //задание эталонной последовательности

                                    //символов

 char code[4]; //массив для введенной пользователем

               //последовательности символов

 initialize_lcd() ; //инициализация ЖК индикатора

 initialize_key(); //инициализация портов для клавиатуры

 for (k=0; k<4; k++) //разрешает 4 раза ввести комбинацию из

 { //4 символов

  count = 0;

  putcommands(0x01);

  lcd_print("Enter Code:");

  while (count < length) //обработка 4 нажатий клавиатуры

  {

   for(i=0; i<=50; i++) //ожидание ввода символа

   {

    PORTB = 0х01; //опрос первого ряда клавиатуры

    keypress = PORTB;

    key = keypad(keypress, first);

    if (key != 'Z') //если клавиша нажата

    {

     printf("%c", key);

     code[count] = key; //записать очередной символ в

                        //массив ввода

     count++; //перейти к сканированию следующего

              //символа

    }

   }

   for(i=0; i<= 50; i++) // ожидание ввода символа

   {

    PORTB = 0х02; //опрос второго ряда клавиатуры

    keypress = PORTB;

    key = keypad(keypress, second);

    if (key != 'Z') {

     printf("%с", key);

     code[count] = key; //записать очередной символ в

                        //массив ввода

     count++; //перейти к сканированию следующего

              //символа

    }

   }

   for(i=0; i<= 50; i++) //ожидание ввода символа

   {

    PORTB = 0х04; //опрос третьего ряда клавиатуры

    keypress = PORTB;

    key = keypad(keypress, third);

    if (key != 'Z') {

     printf("%c", key);

     code[count] = key; //записать очередной символ в

                        //массив ввода

     count++; //перейти к сканированию следующего

              //символа

    }

   }

   for(i=0; i<= 50; i++) //ожидание ввода символа

   {

    PORTB = 0х08; //опрос четвертого ряда клавиатуры

    keypress = PORTB;

    key = keypad(keypress, fourth);

    if (key != 'Z') {

     printf("%c", key);

     code[count] = key; //записать очередной символ в

                        //массив ввода

     count++; //перейти к сканированию следующего

              //символа

    }

   }

  } //очередные 4 символа введены, можно сверять с эталонными

  /*Проверка соответствия кода на эталонный*/

  j = 0;

  for(i=0;i<3;++i) //проверка по каждому символу эталонной

                   //последовательности

  {

   if(pin[i]==code[i]) //очередной символ правильный

   {

    j++;

   } else //очередной символ неправильный

   {

    j--;

   }

  }

  if (j == (length - 1)) //если j=3, то все символы введены правильно

  {

   putcommands(0x01);

   lcd_print("Access Granted");

  }

  else //символы введены неправильно

  {

   putcommands(0x01);

   lcd_print("Access Denied");

  }

 }

 putcommands(0x01);

 lcd_print(" Goodbye ! "); //конец попыток ввода

}

/*--------------------------------------------------------------------*/

/*Перечень функций, которые использованы в этой программе             */

/*--------------------------------------------------------------------*/

/* Функции, программный код которых был приведен ранее по тексту главы*/

char which_key(unsigned int keypress);

void delay_5ms(void);

void delay_100us(void);

void initialize_lcd(void);

void putchars(unsigned char с);

void putcommands(unsigned char d);

void lcdprint(char *string);

char keypad(unsigned int keypress, int row);

//Функция, которая приведена ниже

void initialize_key(void)

/*------------------------------------------------------------------------*/

/* Функция initialize_key устанавливает направление передачи линий портов */

/* для обслуживания клавиатуры                                            */

/*------------------------------------------------------------------------*/

void initialize_key(void) {

 DDRB = 0x0F; //линии PORTB[0]…PORTB[3] на вывод

              //линии PORTB[4]…PORTB[7] на ввод

 PORTB = 0х00; //четыре младших линии порта PORTB в 0

}

/*-------------------------------------------------------------------------*/ 

5.9. Интерфейс МК с аналоговыми датчиками

Датчик — это устройство, которое преобразует некоторую физическую величину в электрический сигнал. Существуют датчики температуры, давления, ускорения, напряженности электрического поля, механического момента, и т.д. В главе 2 мы рассмотрели пример метеостанции, в которой выходы датчиков, поставляющих информацию о погоде, были подключены к МК семейства 68HC12. В том примере мы по умолчанию предположили, что датчики допускают непосредственное подключение ко входам МК. Однако на практике это условие почти всегда не выполняется. Поэтому необходимо разрабатывать дополнительную схему сопряжения, которая, в общем случае, состоит из усилителя со смещением уровня и фильтра. Подробное изучение способов преобразования аналоговых сигналов выходит за рамки данного раздела. Читатель может познакомиться с ними по книгам, приведенным в параграфе дополнительной литературы для данной главы. Мы остановимся только на общем рассмотрении масштабирования сигнала с выхода датчика.

На рис. 5.24 приведена обобщенная функциональная схема интерфейса для подключения аналогового датчика ко входу встроенного АЦП микроконтроллера. Датчик преобразует некоторую величину X в напряжение на выходе электронного преобразователя датчика. В последующих рассуждениях мы предположим, что электронный преобразователь имеет линейную передаточную характеристику. Если на входе присутствует некоторая физическая величина X1, то на выходе электронного преобразователя формируется напряжение V1min. При этом величина X1 соответствует минимальному значению, которое может преобразовать рассматриваемый датчик. Если на входе датчика присутствует величина X2, то на выходе электронного преобразователя формируется напряжение V2min. И X2 соответствует максимальному значению датчика. Все промежуточные значения величины X могут быть восстановлены по величине напряжения на выходе преобразователя V1min < V < V2min.

Рис. 5.24. Обобщенная функциональная схема интерфейса для подключения аналогового датчика ко входу встроенного АЦП МК

Для того чтобы значение напряжения на выходе датчика могло быть использовано в управляющей программе, его необходимо преобразовать в цифровой код при помощи модуля АЦП. Преобразование будет выполнено с максимально возможным разрешением, если V1min будет равно 0 В, а V2min — 5,0 В. Поэтому между выходом датчика и входом АЦП следует установить дополнительный электронные усилитель со смещением уровня (рис. 5.24). Обозначим коэффициент усиления этого усилителя K, напряжение смещения — B. Для определения численных значений K и B составим два уравнения:

V2max = V2min × K + B

V1max = V1min × K + B,

где V2max и V1max напряжения верхнего и нижнего уровня шкалы на выходе усилителя со смещением. Решив уравнения, можно получить численные значения коэффициента усиления и напряжения смещения, а затем реализовать необходимую схему на операционных усилителях.

Пример. Представьте себе, что Вам необходимо подключить барометр метеостанции к микроконтроллеру 68HC12 для автоматизированного учета показаний прибора. Диапазон допустимых напряжений сигнала АЦП микроконтроллера составляет 0…5,0 В. Минимальная величина показаний барометра равна 64 см ртутного столба, максимальная — 81 см. Барометр снабжен электронной схемой преобразования сигнала, которая формирует на выходе для показания 64 см напряжение –100 мВ, а для показания 81 см — напряжение +300 мВ. Передаточная характеристика этой электронной схемы преобразования линейная. Необходимо определить параметры дополнительного электронного преобразователя для сопряжения предоставленного барометра с МК семейства 68HC12.

1 ... 89 90 91 92 93 94 95 96 97 ... 150
Перейти на страницу:
На этой странице вы можете бесплатно читать книгу Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С - Стивен Барретт.
Комментарии