Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Программа управления. /* Это программа для реализации простого вольтметра на базе АЦП, */
/********************************************************************/ /* Имя файла: 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(' '); putchars('V'); } /********************************************************************/
/********************************************************************/ /*задержка в 100 мкс, на базе таймера с частотой 8 МГц */ /********************************************************************/ void delay_100us(void) { int i; for (i=0; i< 50; i++) { asm(" nop"); } }
/********************************************************************/ /*задержка в 5 мс, на базе таймера с частотой 8 МГц */ /********************************************************************/ void delay_5ms(void) { int i; for (i=0; i< 50; i++) { delay_100us(); } }
/********************************************************************/ /*Функции инициализации посылают на ЖКД необходимую стартовую */ /* последовательность. Формируется последовательность команд инициали-*/ /* зации соответствующих техническим данным производителя дисплея. */ /********************************************************************/ void initialize_lcd(void) { delay_5ms(); delay_5ms(); delay_5ms(); /*задержка на 15 мс перед включением ЖКД */ putcommands(0x38); /*установочный интерфейс */ delay_5ms(); putcommands(0x38); delay_100us(); putcommands(0x38); putcommands(0x38); putcommands(0x0C); putcommands(0x01); /*Очистить дисплей */ putcommands(0x06); /*Установить режим увеличения адреса на единицу*/ putcommands(0x0E); /*Включить дисплей, вывести мигающий курсор */ putcommands(0x02); /*Возврат */ }
/********************************************************************/ /* Функция вывода инициализирует порт данных, создает сигналы RS и */ /* разрешения и посылает их на соответствующий порт */ /********************************************************************/ void putchars(unsigned char c) { DDRP = 0xFF; /*установить Port P как выходной */ DDRDLC = DDRDLC | 0x0C; * установить PORTDLC[3: 2] как выходной */ PORTP = c; /* присвоить знак С порту данных */ PORTDLC= PORTDLC|0x08 /* установить RS в 1 для данных */ PORTDLC= PORTDLC|0x04 /* установить E в 1 (PORTDLC[5] = 1) */ PORTDLC = 0; /* установить E и RS в 0 */ delay_5ms(); /* подождать 5мс */ }
/********************************************************************/ /*Функция putcommand пересылает данные в контроллер на ЖК дисплея */ /********************************************************************/ void putcommands(unsigned char d) { DDRP = 0xFF; /*установить порт PORTP в качестве выходного */ DDRDLC = DDRDLC|0x0C; /*установить выводы PORTDLC[3: 2] */ /* в качестве выходных */ PORTDLC = PORTDLC & 0xF7; /* команда RS = 0 */ PORTP = d; /*передача команды на на ЖКД */ PORTDLC = PORTDLC|0x04; /*E = 1 */ PORTDLC =0; /*E = 0 */ delay_5ms(); /*пауза 5 мс */ }
/********************************************************************/ /*Функция lcd_print посылает строку на ЖК дисплей */ /********************************************************************/ void lcd_print(char *string) { putcommands(0x02); /*установка курсора на первую строку */ /*putcommand для выделения строки */ while(*(string)! = '\0') { putchars(*string); string++; } }
/********************************************************************/ /*задержка в 5 мс, на базе таймера с частотой 8 МГц */ /********************************************************************/ void delay_5ms(void) { int i; for (i=0; i< 50; i++) { delay_100us(); } } /********************************************************************/
/********************************************************************/ /*задержка в 100 мкс, на базе таймера с частотой 8 МГц */ /********************************************************************/ void delay_100us(void) { int i; for(i=0; i< 50; i++) { asm(" nop"); } } /********************************************************************/
|