Чтение онлайн

ЖАНРЫ

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

Пак Дэниэл Дж.

Шрифт:

7.3.4. Структура программы и блок-схема алгоритма

Мы приводили структуру программы и блок-схему алгоритма для каждого из рассматриваемых проектов. Для этого проекта мы оставляем разработку структуры и блок схемы читателю в качестве домашней работы (задание 17).

7.3.5. Программа управления

/********************************************************************/

/* Имя файла: voltmeter2.с */

/* Это программа для реализации простого вольтметра на
базе АЦП, */

/* встроенного в МК HC12. Приведенный программный код выполняет */

/*одно преобразование и затем программа может вручную */

/* перезапускаться пользователем для измерения другого напряжения */

/********************************************************************/

#include <912b32.h>

#include <stdio.h>

void delay_100us(void);

void ADC_convert(void);

void delay_5ms(void);

void main(void) {

 asm(" .area vectors (abs)\n" /*код инициализации вектора reset B32 */

" .org 0xFFF8\n"

" .word 0x8000, 0x8000, 0x8000, 0x8000\n"

" .text");

 initialize_LCD; /*инициализация ЖК дисплея */

 ATDCTL2 = 0x80; /*подача питания на АЦП, разрешение прерываний */

 delay_5ms; /*ожидание входа АЦП в рабочий режим */

 ATDCTL3 = 0x00;

 ATDCTL4 = 0x01; /*8-разрядный результат, время выборки 2 АЦП */

/*clk, коэффициент деления 4 */

 ADC_convert; /*АЦП преобразование */

}

/********************************************************************/

/* void ADC_convert(void): функция, осуществляющая одно преообразо- */

/* вание и сохраняющая доступ пользователя к нему. Затем функция */

/* преобразует текущий результат в цифровое значение. Таким образом */

/* каждое отдельное число может быть выделено, преобразовано в ASCII*/

/* код и выведено на ЖКД */

void ADC_convert {

 unsigned int sumadr;

 unsigned int avg_bin_voltage;

 unsigned int int_voltage;

 unsigned int tens_int;

 unsigned int ones_int;

 unsigned int tenths_int;

 unsigned int hundredths_int;

 double voltage, abs_voltage;

 char tens;

 char ones;

 char tenths;

 char hundredths;

 ATDCTL5 = 0x06; /*проводится 4
преобразования, канал 6 */

 while((ATDSTAT & 0x8000)!= 0x8000) {

/*Подождите окончания преобразования */

 }

 /*усреднение по четырем результатам */

 sumadr = ADR0H + ADR1H + ADR2H + ADR3H;

 avg_bin_voltage = sumadr/4;

 /* преобразование результата в напряжение, лежащее в диапазоне от */

 /* 0.00 до 5.00 В */

 voltage = (avg_bin_voltage/256)*5;

 /*приведение напряжения к диапазону от -10.00 до +10.00 В */

 /*обращение процесса, выполняемого аналоговым интерфейсом */

 abs_voltage = (fabs)((voltage - 2.5) * 4);

 /*преобразование результата в целое число в диапазоне от -1000 */

 /* до +1000 */

 int_voltage = (100*voltage);

 /*Выделение и преобразование наибольшей значащей цифры в */

 /* ASCII код десятичного значения, прибавление 48, */

 /* результат дает ASCII код */

 tens_int = int_voltage/1000;

 tens = (char)(tens_int + 48);

 /*Выделение и преобразование следующей наибольшей значащей цифры в */

 /* ASCII код десятичного значения, прибавление 48, */

 /* результат дает ASCII код*/

 ones_int = int_voltage/100;

 ones = (char)(ones_int + 48);

 /*Выделение и преобразование следующей наибольшей значащей цифры в */

 /* ASCII код десятичного значения, прибавление 48, */

 /* результат дает ASCII код */

 tenths_int = (int_voltage - ones_int*100)/10;

 tenths = (char)(tenths_int + 48);

 /*Выделение и преобразование следующей наибольшей значащей цифры в */

 /* ASCII код десятичного значения, прибавление 48, */

 /* результат дает ASCII код */

 hundredths_int = (int_voltage - ones_int*100 - tenths_int*10)/1;

 hundredths = (char)(hundredths_int + 48);

 /*Вывод результата на ЖКД */

 if (voltage < 0) putchars('-'); /*Вывести отрицательный знак*/

 else putchars('+'); /*Вывести положительный знак*/

 putchars(tens);

 putchars(ones);

 putchars('.');

 putchars(tenths);

 putchars(hundredths);

 putchars(' ');

Поделиться с друзьями: