Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛабРабота_4.doc
Скачиваний:
24
Добавлен:
04.05.2019
Размер:
191.49 Кб
Скачать

3.2. Задание для самостоятельной работы

Требуется разработать МКУ, состоящее из микроконтроллера PIC18F242, ЖК-дисплея и двух кнопок. МКУ должно измерять два аналоговых напряжения и выводить результаты на ЖК-дисплей. Схема МКУ (при моделировании ее в Proteus) приведена на рис. 2.

МКУ должно выполнять следующий алгоритм. После запуска программы и разомкнутых контактах кнопок SB1, SB2 на дисплей выводится текст приглашения (Нажмите только одну клавишу: SB1 или SB2) в виде:

Press only one

key: SB1 or SB2

При нажатии кнопки SB1 (замыкании ее контакта) МК производит измерение напряжения U1, и на дисплей выводится результат измерения в виде:

U1 = 2500 mV

U1 = 2,50 V

При нажатии кнопки SB2 (замыкании ее контакта) МК производит измерение напряжения U2, и на дисплей выводится результат измерения в виде:

U2 = 3000 mV

U2 = 3,00 V

В случае одновременного нажатия двух кнопок SB1 и SB2 на экран дисплея выводится текст сообщения об ошибке (одновременного нажатия кнопок) в виде:

Error. Two keys

are pressed

Рис. 2. Принципиальная схема МКУ к заданию

Разработку МКУ можно вести в следующей последовательности.

3.2.1. Запустите программу MPLAB IDE и выберите тип микроконтроллера.

3.2.2. Создайте проект с именем pr16 в новой папке, которую можно назвать proj16.

3.2.3. Наберите текст программы работы МКУ adc2.c в окне редактора (используйте цветовую кодировку текста при наборе) и сохраните его в папке proj16.

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

adc2.c – программа измерения двух напряжений и вывода результата на ЖКД

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

#include<p18f242.h>

#include<stdio.h> // заголовочный файл для библиотеки функций вывода

#include<xlcd.h> // заголовочный файл для библиотеки функций ЖКД

#include<delays.h> // заголовочный файл для библиотеки функций задержек

#include<adc.h> // заголовочный файл для библиотеки функций АЦП

#pragma config WDT=OFF, OSC=HS // установка битов конфигурации МК

void init(void); // прототип функции инициализации

unsigned int adconv1(void); // прототип функции АЦ-преобразования

// напряжения U1

unsigned int adconv2(void); // прототип функции АЦ-преобразования

// напряжения U2

void out_u1(unsigned int ad_res1); // прототип функции вывода на ЖКД

// напряжения U1

void out_u2(unsigned int ad_res2); // прототип функции вывода на ЖКД

// напряжения U2

void out_invite(void); // прототип функции вывода на ЖКД

// текста приглашения

void out_error(void); // прототип функции вывода на ЖКД

// текста сообщения об ошибке

char line[17]; // объявление строчной переменной для вывода на ЖКД

unsigned int ad_res1; // объявление переменной для хранения результата

// АЦ-преобразования напряжения U1

unsigned int ad_res2; // объявление переменной для хранения результата

// АЦ-преобразования напряжения U2

void main(void)

{

init( ); // вызов функции инициализации

again:

{

if((PORTCbits.RC0==1) && (PORTCbits.RC1==1)) // если кнопки

// SB1 и SB2 не нажаты

{

out_invite( ); // вывод на ЖКД приглашения

goto again;

}

if((PORTCbits.RC0==0) && (PORTCbits.RC1==1) ) // если нажата

// кнопка SB1

{

adconv1( ); // АЦ-преобразование напряжения U1

out_u1(ad_res1); // вывод на ЖКД результата измерения U1

goto again;

}

if((PORTCbits.RC0==1) && (PORTCbits.RC1==0) ) // если нажата

// кнопка SB2

{

adconv2( ); // АЦ-преобразование напряжения U2

out_u2(ad_res2); // вывод на ЖКД результата измерения U2

goto again;

}

if((PORTCbits.RC0==0) && (PORTCbits.RC1==0)) // если нажаты

// одновременно SB1 и SB2

{

out_error( ); // вывод на ЖКД сообщения об ошибке

goto again;

}

}

} // конец главной программы

void init(void) // функция инициализации

{

// инициализация МК

PORTA = 0;

TRISA = 0b00000011; // настроить 0-й и 1-й разряды порта А на ввод

PORTB = 0;

TRISB = 0; // настроить все разряды порта В на вывод

PORTC = 0;

TRISC = 0b00000011; // настроить 0-й и 1-й разряды порта С на ввод

// инициализация ЖКД

OpenXLCD(FOUR_BIT & LINES_5X7);

while(BusyXLCD( ));

WriteCmdXLCD(CURSOR_OFF & BLINK_OFF);

// инициализации модуля АЦП

OpenADC(ADC_FOSC_4 & ADC_RIGHT_JUST & ADC_3ANA_0REF,

ADC_CH0 & ADC_INT_OFF);

/* Эта функция задает тактирование АЦП от генератора МК, коэффициент деления частоты FOSC равен 4; правое выравнивание результата АЦ-преобразования; три аналоговых входа: AN0, AN1, AN3; опорные напряжения UREF+ = UDD, UREF- = USS ; выбирается канал 0 (вход AN0); запрещаются прерывания от АЦП. */

}

unsigned int adconv1(void) // функция АЦ-преобразования напряжения U1

{

SetChanADC(ADC_CH0); // выбрать канал 0 АЦП

Delay10TCYx(2); // задержка на 20 мкс

ConvertADC( ); // запустить АЦ-преобразование

while(BusyADC( )); // ожидание готовности данных АЦП

ad_res1 = ReadADC( ); // чтение данных АЦП

return ad_res1;

}

unsigned int adconv2(void) // функция АЦ-преобразования напряжения U2

{

SetChanADC(ADC_CH1); // выбрать канал 1 АЦП

Delay10TCYx(2); // задержка на 20 мкс

ConvertADC( ); // запустить АЦ-преобразование

while(BusyADC( )); // ожидание готовности данных АЦП

ad_res2 = ReadADC( ); // чтение данных АЦП

return ad_res2;

}

void out_u1(unsigned int ad_res1) // функция вывода результата измерения

// напряжения U1 на ЖКД

{

unsigned int u1; // объявление переменной u1 для вывода

u1 = (ad_res1 * 5000.) / 1023. ; // преобразование кода АЦП

// в милливольты

……………………….. /* требуется написать самостоятельно

……………………….. для вывода на ЖКД в 1-ю строку напряжения U1

……………………….. в милливольтах, а во 2-ю строку напряжения U1

……………………….. в вольтах */

}

void out_u2(unsigned int ad_res2) // функция вывода результата измерения

// напряжения U2 на ЖКД

{

unsigned int u2; // объявление переменной u2 для вывода

u2 = (ad_res2 * 5000.) / 1023. ; // преобразование кода АЦП

// в милливольты

……………………….. /* требуется написать самостоятельно

……………………….. для вывода на ЖКД в 1-ю строку напряжения U2

……………………….. в милливольтах, а во 2-ю строку напряжения U2

……………………….. в вольтах */

}

void out_invite(void) // функция вывода на ЖКД текста приглашения

{

……………………… /* требуется написать самостоятельно для вывода

……………………… на ЖКД текста:

……………………… Press only one

……………………… key: SB1 or SB2

……………………… */

}

void out_error(void) // функция вывода на ЖКД сообщения об ошибке

{

……………………… /* требуется написать самостоятельно для вывода

……………………… на ЖКД текста:

……………………… ERROR. Two keys

……………………… are pressed

……………………… */

}

// функции задержки для работы с ЖКД

void DelayFor18TCY(void) // функция задержки на 18 командных циклов

{

Delay10TCYx(2); // задержка на 20 мкс

}

void DelayPORXLCD(void) // функция задержки на 15 мс

{

Delay1KTCYx(15);

}

void DelayXLCD(void) // функция задержки на 5 мс

{

Delay1KTCYx(5);

}

3.2.4. С помощью пункта меню View > Project откройте окно проекта pr16.mcw и внесите в проект исходный файл adc2.c и файл сценария линкера 18f242.lkr. Затем проверьте установку опций для создания проекта с помощью пункта меню Project > Build Options… > Project. Обязательно установите путь для поиска библиотек Library Search Path. Затем постройте проект, выбрав пункт меню Project > Build All. В случае успешной компиляции сверните окно MPLAB IDE.

3.2.5. Для проверки работы МКУ запустите программу ISIS.exe пакета Proteus VSM. Для упрощения разработки схемы можно использовать файл проекта с именем adc.dsn из папки проектов proj15. С этой целью выберите пункт меню File > Open Design. В раскрывшемся диалоговом окне найдите папку с именем proj15 и выберите из нее файл adc.dsn.

3.2.6. В схему из файла adc.dsn необходимо добавить резисторы и кнопки. Их надо выбрать из библиотек Proteus. После выбора всех необходимых компонентов выполните соединение элементов между собой согласно принципиальной схеме, приведенной на рис. 2. Затем сделайте надписи элементов схемы.

И в заключение необходимо сохранить разработанный проект в папке proj16. Для этого выберите пункт меню File > Save Design As… Раскройте папку e:\....\proj16 и сохраните в ней проект под именем adc2.dsn.

3.2.7. Теперь можно приступить к проверке работы МКУ. Сначала нужно записать hex-код разработанной программы в память МК. С этой целью наведите курсор мыши на изображение МК и дважды щелкните левой кнопкой. В открывшемся окне редактирования свойств компонента Edit Component щелкните по кнопке в правой части строки Program File. Откроется окно Select File Name с hex-файлами из папки proj16. Выберите файл с именем pr16.hex (это скомпилированный файл исходной программы adc2.c, написанной на языке Си), и нажмите кнопку «Открыть». Затем в строке Processor Clock Frequency (тактовая частота процессора) выставьте 4 МГц. Нажмите кнопку ОК для подтверждения выбора параметров. В заключение щелкните по пустому месту схемы для снятия выделения с МК.

Для проверки работы МКУ запустите проект на выполнение с помощью кнопки Play (Пуск). На экране дисплея должен появиться текст:

Press only one

key: SB1 or SB2

Если это произошло, то нажмите и зафиксируйте кнопку SB1. На экране дисплея должны появиться значения напряжения U1 в милливольтах и вольтах.

Далее разомкните кнопку SB1 и нажмите и зафиксируйте кнопку SB2. На экране дисплея должны появиться значения напряжения U2 в милливольтах и вольтах.

И, наконец, замкните и зафиксируйте обе кнопки: SB1 и SB2. На экране дисплея должно появиться сообщение об ошибке в виде:

Error. Two keys

are pressed

В заключение проверьте правильность измерения напряжений U1 и U2 при различных положениях движков потенциометров RV1 и RV2.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]