Антиплагиат полный Деревенко П.А. (1230293), страница 5
Текст из файла (страница 5)
Приобъявлении проекта создаются файлы типа «.mcp» и «.mcw». Если исходныйтекст будет успешно скомпонован, то будут сгенерированы файлы с41расширением «.lst», «.cof» и «.hex», а в случае возникновения ошибки – «.err».Таблица 4.1 – Основные файловые расширения, используемые в MPLABРасширениефайлаФункция.c Исходный файл на языке C.err Файл ошибок.hex Файл машинной программы в шестнадцатеричном формате.cod Файл отладки и обозначений.lib Библиотечный файл.lst Файл, показывающий первоначальный исходный код.o Объектный файл, содержащий перемещаемый код.mcp Файл проектной информации.mcw Файл информации о рабочем пространстве.cofФайл, с конечным модулем, представляющий отладочнуюинформацию4.2 КомментарииКомментарии начинаются с комбинации «/*» и заканчиваются «*/».
В такойформе они могут выходить за пределы одной строки, могут предшествовать илиследовать за инструкциями и объявлениями.Альтернативный формат комментариев – двойной «слэш» (//) передкомментарием. Тогда такой комментарий продолжается только до конца даннойстроки и не требует никакого завершающего символа.4.3 ОбъявленияОбъявления используются во многих местах для создания программныхэлементов, например, такие как переменные или функции и указания ихсвойств. Важно, что все переменные и функции в С должны быть объявлены дотого, как они будут использоваться.
Задаваемые характеристики включают тип42элемента данных (например, с фиксированной точкой)4.4 Подключение библиотекДиректива #include включает в текст программы содержимое указаннойбиблиотеки#include <p18f452.h> /*Объявление библиотеки, содержащей весьфункционал микроконтроллера*/#include <delays.h> /*Объявление библиотеки задержек*/4.5 Настройка порта C для вывода на экранДиректива #define служит для замены часто использующихся констант,ключевых слов, операторов или выражений некоторыми идентификаторами.# 35 define LED PORTC //Порту С присвоено имя LED#define Set_Enumber PORTBbits.RB3 = 1 //Вкл. разряд единиц#define Reset_Enumber PORTBbits.RB3 = 0 //Выкл.
разряд единиц#define Set_Dnumber PORTBbits.RB4 = 1 //Вкл. разряд десятков#define Reset_Dnumber PORTBbits.RB4 = 0 //Выкл. разряд десятков#define Set_Snumber PORTBbits.RB5 = 1 //Вкл. разряд сотен#define Reset_Snumber PORTBbits.RB5 = 0 //Выкл.
разряд сотен#define Set_Tnumber PORTBbits.RB6 = 1 //Вкл. разряд тысяч#define Reset_Tnumber PORTBbits.RB6 = 0 //Выкл. разряд тысяч4.6 Настройка параметров микроконтроллераДиректива #pragma необходима для реализации директив, предоставляющихкомпилятору различные инструкции.#pragma config OSC = XT /* Режим генератора XT*/#pragma config OSCS = OFF /* Запрещено переключение источникатактового сигнала*/#pragma config PWRT = ON /* Разрешена работа таймера включенияпитания*/43#pragma config BOR = OFF /* Запрещен сброс МК по снижению напряженияпитания*/#pragma config WDT = OFF /* Сторожевой таймер отключен*/#pragma config STVR = ON /* Разрешен сброс МК при переполнении стека*/#pragma config LVP = OFF /* Низковольтное программирование запрещено*/4.7 Ввод переменных для подсчета частоты и вывода на динамическуюиндикацию результатаВ языке C различают понятия "тип данных" и "модификатор типа".Модификатор – это число с запятой, а тип данных – это целое число.
Целоечисло со знаком будет иметь как положительные, так и отрицательные значения,а целое без знака – только положительные значения. В языке Си можновыделить пять базовых типов, которые задаются следующими ключевымисловами:- char – символьный;- int – целый;- float – вещественный;- double – вещественный двойной точности;- void – не имеющий значения. 35Модификатор типа unsigned указывает, что переменная может приниматьнеотрицательные значения.unsigned int counter = 0; /*Ввод переменной для счета входящих вмикроконтроллер сигналов*/unsigned char thousand = 0; /*Ввод переменной для вывода на экран разрядатысяч*/unsigned char hundred = 0; /*Ввод переменной для вывода на экран разрядасотен*/unsigned char ten = 0; /*Ввод переменной для вывода на экран разрядадесятков*/unsigned char one = 0; /*Ввод переменной для вывода на экран разряда44едениц*/char led_on = 0;unsigned char dig[10] ={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; /*Ввод массива, длявывода цифр на динамическую индикацию*/4.8 Настройка прерывания высокого уровняКлючевое слово void, при использовании в качестве типа возвращаемогозначения для метода, указывает, что метод не возвращает значение.Ключевое слово _asm означает, что мы перешли на язык ассемблера.Оператор GOTO – это оператор перехода к какой-либо строчке программы,который работает только в ассемблере.void prervo (void);#pragma interrupt prervo#pragma code high_vector = 0x08void high_vector (void){_asm GOTO prervo _endasm}#pragma code4.9 Функция обработки прерыванияДля начала необходимо разрешить прерывания по таймеру 1, за это отвечаетрегистр PIR1.Прерывание по таймеру 1 нужно посчитать по формуле 2.1.
Полученноезначение должно быть загружено в регистр TMR1H и TMR1L в двоичном виде,до момента переполнения таймера.В нашем случае таймер должен досчитать до 5 мс, то есть 5000 мкс, таймерработает в 16-разрядном режиме, то есть B равно 65536, кварцевый резонаторвыдает частоту в 4 МГц, а предделитель настроен на деление на 4. Данная45зависимость будет выглядеть следующим образомПолученный результат нужно перевести в двоичную систему счисления,чтобы определить какие значения требуется в и : 6428610 = 11111011 0001 11102. Следовательно, в требуется загрузить число 111110112, а в – 0001 11102.Чтобы таймер работал нужным нам образом, его нужно настроить.Регистром управления данного таймера является T1CON, приведенный вприложении 2.Операторы switch и case помогают управлять сложными условнымиоперациями и операциями ветвления.
Оператор switch передает управление воператор внутри своего тела. Управление передается оператору, значениевыражения case константное-выражение которого соответствует значениювыражения switch (выражение). Оператор switch может содержать любое числоэкземпляров case, однако никакие две константы варианта в одном оператореswitch не могут иметь одинаковые значения.
Выполнение тела оператораначинается с выбранного оператора и продолжается до конца тела оператораили пока управление не будет передано за пределами тела оператора с помощьюоператора break.void prervo (void) //Функция прерывания{if (PIR1bits.TMR1IF == 1) //Флаг прерывания по переполнению TMR1{PIR1bits.TMR1IF = 0; //Сброс флага переполнения TMR1TMR1H = 0b11111011; //Запись числа в TMR1HTMR1L = 0b00011110; //Запись числа в TMR1Lswitch (led_on) //Переключение разрядов динамической46индикации{case 0: //Разряд тысяч{led_on++; //Увеличение переменной led_on на 1Reset_Enumber;LED = *(dig+thousand); /*Вывод в порт С цифры измассива*/Set_Tnumber; break;}case 1: //Разряд сотен{Reset_Tnumber;led_on++; //Увеличение переменной led_on на 1LED = *(dig+hundred); /*Вывод в порт С цифры измассива*/Set_Snumber; break;}case 2: //Разряд десятков{Reset_Snumber;led_on++; //Увеличение переменной led_on на 1LED = *(dig+ten); /*Вывод в порт С цифры из массива*/Set_Dnumber; break;}case 3: //Разряд единиц{Reset_Dnumber;led_on = 0; //Увеличение переменной led_on на 1LED = *(dig+one);/*Вывод в порт С цифры из массива*/47Set_Enumber; break;}}}Для работы с таймером 0 необходимо его правильно настроить с помощьюрегистра управления режимом прерываний INTCON, приведенным вприложении 1.В данном случае таймер 0 должен досчитать до 1 секунды, то есть 1000000мкс, таймер работает в 16-разрядном режиме, то есть B равно 65536, кварцевыйрезонатор выдает частоту в 4 МГц, а предделитель настроен на деление на 256.Данная зависимость будет выглядеть следующим образомПолученный результат нужно перевести в двоичную систему счисления,чтобы определить какие значения требуется в TMR0H и TMR0L: 6153610 = 11110000 0110 00002.
Следовательно, в TMR0H требуется загрузить число 1111 00002,а в TMR0L – 1011 11102.Чтобы таймер работал нужным нам образом, его нужно настроить.Регистром управления данного таймера является T0CON, приведенный вприложении 2.if (INTCONbits.TMR0IF == 1) //Флаг прерывания по переполнениюTMR0{INTCONbits.TMR0IF = 0; /*сброс флага прерывания попереполнению TMR0*/TMR0H = 0b11110000; //Запись числа в TMR0HTMR0L = 0b01100000; //Запись числа в TMR0H48thousand = hundred = ten = one = 0; //Сброс переменных в 0/*подсчет количества разрядов динамической индикации*/for (; counter >= 1000; counter = counter - 1000) thousand++;for (; counter >= 100; counter = counter - 100) hundred++;for (; counter >= 10; counter = counter - 10) ten++;for (; counter >= 1; counter--) one++;counter = 0; //Сброс counter в 0}Для подсчета количества импульсов, поступающих в микроконтроллер втечении секунды, используем прерывание по порту B, то есть, когда поступаетимпульс на ножку порта B, происходит прерывание и значение переменнойcounter увеличивается на 1.if (INTCONbits.INT0IF == 1) /*Флаг прерывания по изменениюсигнала на ножке RB0*/{INTCONbits.INT0IF = 0; /*Сброс флага прерывания по изменениюсигнала на ножке RB0*/counter++; //Увеличение переменной counter на 1}}4.10 Главная функцияГлавная функция нужна только для настройки определенных параметров,таких как настройка портов ввода/вывода, разрешение различных прерываний, атак же настройка таймеров.void main (void) //Основная функция{TRISB = 0b00000001; //Настройка первого бита порта B на вводинформацииPORTB = 0b00000000; //Обнуление значений порта B49TRISC = 0b00000000; //Настройка порта C на вывод информацииPORTC = 0b00000000; //Обнуление значений порта CINTCONbits.PEIE = 1; //Разрешение периферийных прерыванийINTCONbits.INT0IE = 1; //Разрешение внешнего прерыванийINTCON2bits.INTEDG0 = 1; //Прерывание по фронту входящего сигналаINTCONbits.
TMR0IE = 1; /*Разрешение прерывания по переполнениюTMR0*/ 33PIE1bits. TMR1IE = 1; //Разрешение прерывания по переполнениюTMR1/* 33 Запись в TMR0 числа равного 1 секунде*/TMR0H = 0b11110000;TMR0L = 0b01100000;T0CON = 0b10000111; // коэф. деления 256T1CON = 0b00110001; // коэф. деления 8/*Запись в TMR1 числа равного 5 миллисекундам*/TMR1H = 0b11111011;TMR1L = 0b00011110;INTCONbits.GIE = 1; //Разрешение глобальных прерыванийwhile (1) //Бесконечный цикл{}}50515 МОДЕЛИРОВАНИЕ РАБОТЫ ЧАСТОТОМЕРА В ПРОГРАММЕPROTEUS5.1 Введение в систему Proteus 8.0Программный пакет Proteus позволяет производить моделированиепринципиальных схем, используя обширную библиотеку моделей электронныхкомпонентов, включая 29 следующие устройства: микроконтроллеры, логическиеэлементы, триггеры, счетчики, светодиоды, ЖК индикаторы, температурныедатчики, кнопки, переключатели и т.д.














