Вот немного набросал. Думаю, все будет понятно. Я Просто исхожу из того, что максимальное значение АЦП будет 1023. Поскольку тебе требуется всего 30 шагов, то делим максимальное значение АЦП на 30, получаем 34.
Получаем такой код:
Code
DEVICE = 16F876A
'-------------------------------------Предустановки--------------------------------------------
XTAL 4
DECLARE LCD_TYPE ALPHA 'Тип ЖКИ
DECLARE LCD_DTPIN PORTB.4 'Подключение шины данных
DECLARE LCD_RSPIN PORTB.2 'RS -> PORTB.2
DECLARE LCD_ENPIN PORTB.3 'E -> PORTB.3
DECLARE LCD_INTERFACE 4 'Интерфейс передачи - 4-проводный
DECLARE LCD_COMMANDUS 2000 'Задержка перед посылкой команды
DECLARE LCD_DATAUS 50 'Задержка перед посылкой данных
DECLARE LCD_LINES 2 'Число строк ЖКИ
DECLARE ADIN_RES 10 '10-битный АЦП
DECLARE ADIN_TAD FRC 'Выбор тактирования
DECLARE ADIN_STIME 100 '50 мкС на выборку
'-------------------------------------Настройки портов-----------------------------------------
TRISA = %00101111
TRISB = %00000011
TRISC = %00000000
PORTB = %00000000
PORTC = %00000000
ADCON1 = %10000000 'Установить выводы порта А входами АЦП
PORTB_PULLUPS = off 'Выключить подтяжку резисторов к порту PORTB
'-----------------------------------Конфигурация переменных------------------------------------
; Symbol VentR PORTA.0 'Управление затвором полевого транзистора
; Symbol VentP PORTA.1 'Звуковая сигнализация при работе
; Symbol RegR PORTA.2 'Управление включением реле для замера сопротивления измеряемого позистора
; Symbol RegP PORTA.3
' SYMBOL Pusk PORTB.0 'Кнопка ПУСК для старта начала измерения и обработки
; Symbol Rezhim PORTB.1 'Переключение питающий напряжений 130-425В для изменения коэфф. деления АЦП
; Symbol Alarm PORTC.0
' DIM VentRA AS FLOAT 'Переменная для хранения результата АЦП вольт
; Dim VentPA As Float 'Переменная для хранения результата АЦП вольт
; Dim RegRA As Float 'Переменная для хранения результата АЦП вольт
; Dim RegPA As Float 'Переменная для хранения результата АЦП вольт
DIM i AS BYTE
DIM ADCRes[4] AS WORD ' Переменная для результата преобразования
DIM RABOTA1 AS BYTE
DIM PAUSA1 AS BYTE
DIM RABOTA2 AS BYTE
DIM PAUSA2 AS BYTE
'-------------------------------------Очистка дисплея------------------------------------------
CLS
'---------------------------Подать звуковой сигнал о готовности к работе-----------------------
PRINT AT 1, 1, "STEND SIRP V1.0"
DELAYMS 1000
CLS
'--------------------Измерение и вывод на дисплей значения напряжения питания------------------
Start:
GOSUB ReadADCs
RABOTA1=ADCRes[0]
PAUSA1=ADCRes[1]
RABOTA2=ADCRes[2]
PAUSA2=ADCRes[3]
PRINT AT 1, 1, DEC2 RABOTA1," ", DEC2 PAUSA1 'Здесь просто отображаем результат в минутах по каждому порту
PRINT AT 2, 1, DEC2 RABOTA2," ", DEC2 PAUSA2
GOTO Start
;;'-----------------------------Проверка сопротивления позистора---------------------------------
'------------------------------------------------------------------------------------------- ---
ReadADCs:
FOR i = 0 TO 3
ADCRes[i] = ADIN i 'Теперь в данном элементе массива ADCRes[i] содержится значение одного из каналов АЦП
ADCRes[i] = ADCRes[i]/34 'А теперь мы преобразуем это значение в минуты
NEXT
RETURN
То, что я написал выше, вообще не требуется/
Теперь имеем значения резисторов в минутах. Теперь попробуй вести отсчет с помощью таймера(чтобы отсчет шел в фоне основной программы) в прерываниях. Настрой TIMER1 на прерывания через каждые 0.5 сек и ставь выходы как тебе надо.
Вот как-то так...