АЦП, таймерів і UART буде виконана один раз, тому вона не входитиме в основний цикл програми, а буде розташована відразу перед ним:
/ / ------- Ініціалізація UART -----------=0xFD;// Швидкість 9600 біт / с=0x20 ;/ / Таймер 1 в режимі autoreload=0x40 ;/ / Запуск таймера 1=0x50 ;/ / 8 bit UART, дозвіл прийому &=0x7F ;/ / Відключення подвоєння швидкості=1;// Прапори UART
RI=1;// Transmit & Recive=0x0 ;/ / UART interrupts only
/ / Налаштувати A / D to sequentially convert each input channel.
ADCCON1=0x7C;// 0111 1100
Так як мікроконтролер не має своєї операційної системи, виникає необхідність реалізувати цикл безперебійної роботи мікроконтролера від моменту запуску оператором до моменту зупинки, знову ж, оператором. Для цього створимо нескінченний цикл, в якому і буде відбуватися обробка всіх підтримуваних дій (наприклад - оцифровка, зміна номера каналу і т.д.). На мові Сі це буде виглядати наступним чином:
do
{
... / / тут буде розташована велика частина коду
}
While (1)
В основному циклі програми будуть виконуватися такі дії:
1. читання стану клавіатури;
. перевірка натискання цифрової клавіші;
. перевірка помилки вибору каналу;
. завдання номера каналу для оцифровки;
. запуск АЦП і очікування від нього даних;
. запис даних в пам'ять;
. передача даних і номера каналу на ПК;
. зміна стану світлодіодів відповідно до оцифрованих каналом.
Це мінімально необхідні дії для нормального функціонування системи:
unsigned int conv_val=0; char channel=0; char c=0; (ScanKBOnce (& c))
NumChanel=chrtoint (c); (NumChanel> 8) / / канали більше 8го не обробляються=255; (NumChanel!=255) / / 255 - помилка вибору каналу
{
/ / почати перетворення і дочекатися завершення
ADCCON2=(ADCCON2 & 0xF0) | NumChanel;=1; (ADCCON3 & 0x80);
/ / Читання A / D даних=ADCDATAH >> 4; _val=ADCDATAL | ((ADCDATAH & 0x0F) << 8);
/ / вивід на термінал (NumChanel == 8)
{= (675-conv_val * 0.61) / 3; («ADC Channel% d =% f C n», NumChanel, value2);
} else
{(«ADC Channel% d=0x% X n», NumChanel, conv_val);
}
} else
{
printf («Error selection channel n");
}
/ / виведемо оцифроване значення
/ *
запалюємо светодіот відповідає номеру каналу
який в даний момент оцифровувати
* /
svet=convert (NumChanel, 0); (0x7, svet) ;/ / вивід на светодіди
for (pause=0; pause <= 64000; pause + +) ;/ / затримка
Повний лістинг програми, а також допрацьована версія з використанням таймера ...