Программирование на языке Си процедур управления. Основы разработки и отладки управляющих программ на языке Си для микроконтроллеров семейства PIC18, страница 10

Подсказка. Для получения задержки на 5 с можно последовательно вызывать задержки меньшей длительности, например, на 2 и 1 с.

Задание 4. Используя схему МКУ на рис. 4, разработайте программу, выполняющую следующий алгоритм. После включения питания МК (его сброса) светодиод VD1 не горит. При нажатии на кнопку SB1 светодиод начинает мигать с частотой 1 Гц (0,5 с горит и 0,5 с не горит). При отжатии кнопки (размыкании ее контакта) светодиод гаснет. Для упрощения программы будем предполагать, что даже при кратковременном замыкании контакта кнопки светодиод загорается на время 0,5 с, а потом гаснет. Частота работы МК равна 4 МГц. Программу назовите  sw_led3.c.  Создайте для нее новый проект pr11 и папку proj11. Проверьте работу программы с помощью Proteus Viewer с использованием проекта sw_led1.dsn из папки proj9.

3.8. Разработка и исследование программы проверки работы кнопочных переключателей

Рассмотрим программу, которая проверяет работу кнопочных переключателей SB1 и SB2 микроконтроллерного устройства, схема которого приведена на рис.1. Эта программа должна выполнять следующий алгоритм. После запуска программы (например, включения электропитания) производится инициализация МК, при которой линии RB0  и  RB7  порта В настраиваются на ввод, а линии  RC0  и  RC7  порта С – на вывод. Затем производится диагностика светодиодов, для чего светодиоды VD1  и  VD2 включаются на время 1 секунду, а потом гаснут. Затем программа в бесконечном цикле ожидает момент срабатывания контактов переключателей  SB1  и  SB2. При замыкании SB1 загорается светодиод VD1 красного цвета, а при замыкании SB2 загорается светодиод VD2 зеленого цвета.

Программа на языке Си с именем  check.c  (проверка) будет состоять из главной функции  main( )  и двух функций пользователя: функции инициализации микроконтроллера  init( ) и функции диагностики светодиодов  diagn( ). Для выполнения задержки на 1 с будем использовать библиотечную функцию задержки  Delay10KTCYx( ). Предполагаем, что тактовая частота работы МК равна 4 МГц.

В микроконтроллерах семейства PIC18 для упрощения реализации схем сопряжения с контактами клавиатуры имеется возможность подключения к линиям порта В внутренних подтягивающих резисторов (pull up resistors). Эти резисторы подключаются только к линиям порта В, настроенных на ввод. Подключить резисторы можно установкой специального бита в регистре опций  OPTION, однако проще это сделать с помощью вызова библиотечной функции  EnablePullups( ), которая входит в набор функций управления портом В. Для использования этой функции в программу на Си необходимо подключить заголовочный файл portb.h.

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

check.c – программа проверки переключателей SB1, SB2

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

#include<p18f242.h>

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

#include<portb.h>               // заголовочный файл для функций порта В

#pragma  config  WDT = OFF, OSC = HS

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

void  diagn(void);                // прототип функции диагностики

void main(void)

{

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

diagn( );                         // вызов функции диагностики

loop:

if( PORTBbits.RB0 ==0)

PORTCbits.RC0 = 1;

else

PORTCbits.RC0 = 0;

if( PORTBbits.RB7 ==0)

PORTCbits.RC7 = 1;

else

PORTCbits.RC7 = 0;

goto  loop;                               // зацикливание программы

}

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

{

PORTB = 0;                       // очистить регистр данных порта В

PORTC = 0;                       // очистить регистр данных порта С

TRISB = 0b10000001;       // настроить линии RB0 и RB7 порта В

// на ввод, остальные – на вывод

TRISC = 0;                        // настроить все линии порта С на вывод

EnablePullups( );               // вызов функции подключения подтягивающих

// резисторов ко входам порта В