Встраиваемые системы. Проектирование приложений на микроконтроллерах семейства 68HC12/HCS12 с применением языка С
Шрифт:
/*------------------------------------------------------------------------*/
/* filename: voltmeter.c */
/* В этом примере реализован простейший цифровой вольтметр. */
/* Программа выполняет одно измерение и выводит данные на экран */
/* персонального компьютера. Для того, чтобы выполнить следующее измерение*/
/* следует перезапустить программу */
/*------------------------------------------------------------------------*/
/*подключаемые
файлы*/
#include <912b32.h>
#include <stdio.h>
#define DECIMAL 0х2Е /*определить код точки на экране*/
#define V 0х56 /*определить код символа "V" для экрана*/
/*используемые функции*/
void delay_100us(void);
void ADC_convert(void);
void delay_5ms (void);
void main(void) {
printf("HELLO\n"); /*вывести приветствие на экран*/
ATDCTL2 = 0х80; /*включить питание модуля, запретить */
/*прерывания от модуля*/
printf("ADC\n");
delay_100us; /*задержка 100мкс*/
printf("warmed up\n");
ATDCTL3 = 0х00; /*обеспечить доступ к модулю в отладочном режиме*/
ATDCTL4 = 0х01; /*установить 2 такта для времени выборки*/
/*и коэффициент деления, равный 4*/
printf("ready\n");
ADC_convert; /*реализовать цифровой вольтметр*/
}
/*---------------------------------------------------------------------*/
/* Функция ADC_convert 4 измерения, усредняет их, вычисляет абсолютное */
/* значение напряжения, а затем преобразует результат в коды ASCII для */
/* вывода на экран */
/*---------------------------------------------------------------------*/
void ADC_convert(void) {
unsigned int sumadr;
unsigned int avg_bin_voltage;
unsigned int int_voltage;
unsigned int ones_int;
unsigned int tenths_int;
unsigned int hundreths_int;
char ones;
char tenths;
char hundreths;
ATDCTL5 = 0х06; /*4 преобразования в последовательности, канал 6*/
/* Ожидать завершения измерительной последовательности*/
while((ATDSTAT & 0х8000) != 0х8000) {
;
}
/* Вывести коды преобразования на экран для контроля */
printf("%x %x %х %х\n" , ADR0H, ADR1H, ADR2H,
АDR3Н);
/* Взять среднее от 4 измерений для устранения шума*/
sumadr = ADR0H + ADR1H + ADR2H + ADR3H;
avg_bin_voltage = sumadr/4;
/*Преобразовать результат из двоичного кода к абсолютному значению,*/
/* умноженному на 100 D, получится число в диапазоне от 0 до 500 D*/
int_voltage = (100*avg_bin_voltage/255) * 5;
/*Выделить старший разряд результата и преобразовать в код ASCII */
/* Правило преобразования: десятичная цифра +48*/
ones_int = int_voltage/100;
ones = (char) (ones_int + 48);
/*Выделить второй разряд результата (десятые доли) и преобразовать в
код*/
/* ASCII */
tenths_int = (int_voltage ones_int*100)/10;
tenths = (char) (tenths_int + 48);
/*Выделить третий разряд результата (сотые доли) и преобразовать в
код*/
/* ASCII */
hundreths_int = (int_voltage ones_int*100 tenths_int*10) / 1;
hundreths = (char) (hundreths_int + 48);
/*Вывести значение измеренного напряжения на экран */
printf("%c.%c%cV\n", ones, tenths, hundreths);
}
/*-----------------------------------------------------------------------*/
/* Функция delay_100us формирует задержку в 100 мкс, частота тактирования*/
/* межмодульных магистралей МК составляет 8 МГц */
/*-----------------------------------------------------------------------*/
void delay_100us(void) {
int i;
for (i=0; i<50; i++) {
asm("nop");
}
}
/*------------------------------------------------------------------*/
/* Функция delay_5ms формирует задержку в 5мс, частота тактирования */
/* межмодульных магистралей МК составляет 8 МГц */
/*------------------------------------------------------------------*/
void delay_5ms(void) {
int i;
for (i=0; i<50; i++) {
delay_100us;
}
}
/*------------------------------------------------------------------*/
Поделиться с друзьями: