Для ввода дискретной информации в микроконтроллер широко применяются различные переключатели, кнопки и клавиатуры, либо иные дискретные датчики.
Дискретными выходами микроконтроллер управляет различными исполнительными устройствами, работающими по принципу включено/выключено.
На рисунке 20.17 приведена схема электрическая принципиальная к лабораторной работе.
Рисунок 20.17 – Схема электрическая принципиальная
В схеме два дискретных датчика оформлены в виде двух переключателей SA1 и SA2, подключенных к выводам RA2 и RA3 микроконтроллера.
Два дискретных выхода оформлены в виде двух светодиодов VD1 и VD2, подключенных к выводам RB15 и RB13 микроконтроллера соответственно.
Листинг программы для создания проекта LR20_1
#include <P33FJ32MC204.h>
#define FOSC 7370000
#define FCY (FOSC / 2) // Настройка частоты выполнения
// инструкций
_FOSCSEL(FNOSC_FRC) // Настройка работы микроконтроллера
// от внутреннего тактового генератора
void main()
{
TRISBbits.TRISB15 = 0; // Выход VD1 (RB15)
while (1)
{
__delay32(FCY); // Организация временной задержки
|
|
LATBbits.LATB15 = 1;
__delay32(FCY);
LATBbits.LATB15 = 0;
}
}
Листинг программы для создания проекта LR20_2
#include <P33FJ32MC204.h>
_FOSCSEL(FNOSC_FRC) // Настройка работы микроконтроллера
// от внутреннего тактового генератора
// Инициализация таймера T1
void Init_Timer1()
{
T1CON = 0; // Сброс таймера
IFS0bits.T1IF = 0; // Сброс флага прерывания таймера
IEC0bits.T1IE = 1; // Разрешение прерывания от таймера
TMR1 = 0x0000; // Обнуление текущего значения таймера
PR1 = 0x0E65; // Задание периода таймера
T1CONbits.TON = 1; // Разрешение работы таймера и его
// Запуск
}
int _ms = 0;
void __attribute__((interrupt, no_auto_psv)) _T1Interrupt()
// Прерывание таймера T1 по совпадению
{
_ms++;
IFS0bits.T1IF = 0; // Сброс флага прерывания таймера
TMR1 = 0; // Перезапуск таймера
}
void main()
{
Init_Timer1();
TRISBbits.TRISB15 = 0; // Выход VD1 (RB15)
while (1)
{
if (_ms < 1000)
{
LATBbits.LATB15 = 0;
}
else if (_ms < 2000)
{
LATBbits.LATB15 = 1;
}
else
{
_ms = 0;
}
}
}
Листинг программы для создания проекта LR20_3
#include <p33fj32mc204.h>
#define FOSC 7370000
#define FCY (FOSC/2)
_FOSC(OSCIOFNC_ON & POSCMD_NONE)//Отключение дополнительной
// функции порта RA2 – выход
// тактирующего сигнала
// внутреннего генератора
_FOSCSEL(FNOSC_FRC) // Настройка работы от
// внутреннего тактового
// генератора
void __delay32(unsigned long cycles);
int main()
{
TRISBbits.TRISB15 = 0; // Выход VD1
TRISBbits.TRISB13 = 0; // Выход VD2
TRISAbits.TRISA2 = 1; // Вход SA1
TRISAbits.TRISA3 = 1; // вход SA2
while (1)
{
if (PORTAbits.RA2 == 1 && PORTAbits.RA3 == 1)//Если тумблеры
//SA1 и SA2
//одновременно
//включены
{
__delay32(FCY);
LATBbits.LATB15 = 1;
LATBbits.LATB13 = 0;
__delay32(FCY);
LATBbits.LATB15 = 0;
LATBbits.LATB13 = 1;
}
else
{
LATBbits.LATB15 = 0;
LATBbits.LATB13 = 0;
}
}
}