Программирование на mikroC типовых процедур управления для PIC-микроконтроллеров: управление светодиодом, формирование периодических сигналов, опрос контактов переключателя.

 

Программа управления светодиодом

 

Рассмотрим простейшее микроконтроллерное устройство (МКУ), в котором МК типа PIC16F877 управляет светодиодом, присоединенным к линии (разряду) RC0 порта C. Принципиальная схема такого МКУ (при моделировании в среде Proteus) может иметь вид, приведенный на рисунке 1. При высоком уровне (логическая 1) на выводе порта RC0 светодиод горит, а при низком уровне (логический 0) на выводе порта RC0 светодиод не горит.

Рассмотрим программу, которая производит переключение светодиода через интервал 0,5 с, то есть с частотой 1 Гц.

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

led.c – программа управления светодиодом

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

void main( )

{

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

PORTC = 0; // погасить светодиод

while(1) // бесконечный цикл вывода

{

PORTC.B0 = 1; // зажечь светодиод D1

Delay_ms(500); // задержка на 500 мс

PORTC.B0 = 0; // погасить светодиод D1

Delay_ms(500); // задержка на 500 мс

}

}

 

 

Рисунок 1 - Принципиальная схема МКУ для управления светодиодом

 

 

Программа формирования меандра

 

В различных управляющих и измерительных устройствах широко применяются периодические последовательности прямоугольных импульсов, у которых длительность импульса tи равна паузе tп :

tи = tп = T / 2,

где Т – период следования импульсов, а = 1 / Т – частота следования.

Последовательность прямоугольных импульсов с такими параметрами часто называют меандром. Меандр легко сформировать программным методом с использованием функций временной задержки.

Допустим, что требуется разработать МКУ, которое выдает на линию RC1 порта C микроконтроллера меандр с частотой 10 Гц (период 100 мс). Схема МКУ (при моделировании ее в среде Proteus) приведена на рисунке 2.

Текст программы генерации меандра на языке mikroC следующий.

 

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

meandr.c – программа генерации меандра частоты 10 Гц

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

void main( )

{

TRISC = 0;

while(1)

{

PORTC.B1 = 1;

Delay_ms(50);

PORTC.B1 = 0;

Delay_ms(50);

}

}

 

 

Рисунок 2 – Схема МКУ для генерации меандра

 

 

Программирование процедуры опроса переключателя

 

Рассмотрим теперь, как на языке mikroC выполняется опрос состояния контактов переключателя (кнопки). На рисунке 3 приведена схема МКУ (при моделировании ее в Proteus), в которой управление светодиодом D1 производится от переключателя (кнопки) SB1 по следующему алгоритму. Когда контакт SB1 замкнут, светодиод D1 горит, когда контакт SB1 разомкнут, D1 не горит. Рассмотрим два варианта программы управления светодиодом D1 от кнопки SB1. Для упрощения текста программы будем считать, что у кнопки SB1 нет дребезга контактов.

Сначала рассмотрим программу, в которой для опроса состояния контактов кнопки используются циклы while( ).

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

led_but_1.c – первая программа управления светодиодом от кнопки

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

void main( )

{

TRISB = 0xFF; // настроить все линии порта В на ввод

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

PORTC = 0; // погасить светодиод

while( 1 ) // бесконечный цикл повторения

{

while(PORTB.B1 == 1); // ожидание замыкания контакта SB1

PORTC.B0 = 1; // зажечь светодиод

while(PORTB.B1 == 0); // ожидание размыкания контакта SB1

PORTC.B0 = 0; // погасить светодиод

}

}

 

 

Рисунок 3 – Принципиальная схема МКУ с управлением

светодиодом от кнопки

 

 

Теперь рассмотрим программу, в которой для опроса состояния контактов кнопки SB1 используется оператор выбора if … else.

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

led_but_2.c - вторая программа управления светодиодом от кнопки

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

void main( )

{

TRISB = 0xFF; // настроить все линии порта В на ввод

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

PORTC = 0; // погасить светодиод

while(1) // бесконечный цикл опроса

{

if(PORTB.B1 ==0) // если контакт кнопки SB1 замкнут, то

PORTC.B0 = 1; // зажечь светодиод

else // иначе

PORTC.B0 = 0; // погасить светодиод

}

}