Автор работы: Пользователь скрыл имя, 21 Ноября 2013 в 16:43, курсовая работа
В курсовой работе предложено разработать нерегулируемый выпрямитель напряжения постоянного тока со следующими характеристиками: – период изменения температуры 1 секунда; – погрешность измерения температуры 0,5 °C;
– дискретность отображения 0,5 °C; – количество программируемых пороговых значений 0..127,5 °C; –дискретность установки пороговых значений 0,5 °C; –напряжения питания 5 в; –максимальное напряжение, подводимое к выходам LOAD1 и LOAD2- ограничено максимально допустимыми U1 и U2 примененных VT1 и VT2.
clrwdt
return ;Конец подпрограммы паузы
Подпрограмма проверки подключения DS18B20 (Используется ячейка TEMP1)
TestDS movlw 038h ;
btfss PORTA,4
;Термометр в состоянии
goto Test4_label ;Нет, активен - переход, выходим
bcf OUTA,4 ;Сброс 1-Wire
movf OUTA,W
movwf PORTA ;Импульс сброса (не менее 480 мкс)
movlw 050h
Test1_label addlw 01h
btfss STATUS,Z ;(за время этой паузы 3 раза происходит
goto Test1_label ; прерывание от TMR0)
bsf OUTA,4
movf OUTA,W
movwf PORTA ;Сброс 1-Wire выполнен
movlw D'239'
Test2_label addlw 01h ;Ждем ответа от DS18B20 (пауза ~70 мкс)
btfss STATUS,Z
goto Test2_label
clrf TEMP1
movlw D'252'
Test3_label btfss PORTA,4 ;Есть отклик (0) ?
incf TEMP1,F ;Да - инкремент TEMP1
addlw 01h ;
btfss STATUS,Z
goto Test3_label
goto Testend_label ;
Test4_label addlw 01h ;Пауза для выравнивания путей
jnz Test4_label
movlw 0
Testend_label movlw 075h
addlw 01h ;Ожидание окончания отклика DS18B20
jnz Testend_label+1
movlw 04h ;Если отклик DS18B20 правильный, то TEMP1 = 4
xorwf TEMP1,W
btfsc STATUS,Z ;TEMP1 = 4 ?
movlw 0FFh ;Да - установить признак присутствия (W=0FFh)
Stop_label return
Подпрограмма ввода/вывода по шине 1-Wire (для приема задаем W=0FFh). Используется TEMP1
RW_1Wire
movwf TEMP1 ;Исходные данные в W
movlw 08h ;8 бит
movwf COUNTER
RWLoop bcf INTCON,GIE ;Запрет всех прерываний
bcf OUTA,4 ;0 --> 1-Wire
mov PORTA,OUTA
btfsc TEMP1,0
bsf OUTA,4 ;Установить,если младший бит TEMP1 = 1
mov PORTA,OUTA
rrf TEMP1,F ;Подготовить следующий бит
movlw 0FDh ;Пауза ~12 мкс
RW_1label addlw 01h
jnz RW_1label
bcf TEMP1,7 ;Принимаем в тот же TEMP1
btfsc PORTA,4
bsf TEMP1,7
.
movlw D'220' ;Время на освобождение линии ведомым
RW_2label addlw 01h
jnz RW_2label
bsf OUTA,4 ;Отпускаем шину
mov PORTA,OUTA
bsf INTCON,GIE ;Разрешить прерывания
decfsz COUNTER,F ;8 бит обработаны?
goto RWLoop ;Еще нет - переход
movf TEMP1,W ;Принятый байт в W
return ;Конец подпрограммы ввода/вывода по шине 1-Wire
Подпрограмма обновления CRC. Параметр в W. Используются ячейки TEMP1, TEMP2
NewCRC clrwdt
movwf TEMP2 ;Сохранить W
movlw 08h
movwf COUNTER ;8 --> COUNTER
movf TEMP2,W ;Восстановить значение W
CRC_label xorwf CRCPIC,W ;Исключ.ИЛИ CRCPIC и W, результат в W
movwf TEMP1 ;Скопировать результат в TEMP1
rrf TEMP1,W ;Сдвиг TEMP1 вправо на 1, результат в W, младший бит в С
movf CRCPIC,W ;CRCPIC --> W (бит С не изменился)
btfsc STATUS,0
xorlw 018h ;Если С=0, то эту инструкцию не выполнять
movwf TEMP1 ;Результат в TEMP1
rrf TEMP1,W ;Снова сдвиг, результат в W
movwf CRCPIC ;Сохранить результат в CRCPIC
bcf STATUS,0 ;0 --> C
rrf TEMP2,F ;Сдвиг TEMP2 вправо на 1
movf TEMP2,W ;И скопировать полученное значение в W
clrwdt
decfsz COUNTER,F
goto CRC_label
return ;Конец подпрограммы обновления CRC
______________________________
--- НАЧАЛО ОСНОВНОЙ ПРОГРАММЫ ---
______________________________
Begin
movlw 7
movwf CMCON ;Отключаем компараторы
movf PORTA,F ;Приводим в соответствие
movf PORTB,F ;защелки портов
clrf INTCON
mvi OUTA,B'00010000' ; Гасим все
movwf PORTA
mvi PORTB,B'11111111' ; светодиоды
clrwdt
clrf TMR0
bsf STATUS,RP0 ;Обращение к банку 1 для доступа к TRIS и OPTION_REG
clrf TRISA ;Устанавливаем выводы порта А как 'OOOOOOOO' (I-in,
clrf TRISB ;Устанавливаем выводы порта B как 'OOOOOOOO'
mvi OPTION_REG,B'00000111' ;
clrwdt
mvi OPTION_REG,B'00001101' ;
bcf STATUS,RP0 ;Обращение к банку 0
mvi ADDRESS,FIGX000 ;Заносим в ADDRESS адрес ячейки с начальной цифрой
mvi SELECTOR,B'00001000' ;
mvi FIGX000,B'11111111' ;
mvi FIG0X00,B'00100100'
mvi FIG00X0,B'00011110'
mvi FIG000X,B'00011110'
bsf INTCON,T0IE ;Прерывания только от TMR0
bsf INTCON,GIE ;Глобальное разрешение прерываний
Online_label clrwdt ;Работа с термометром DS18B20
clrf TMR0
call TestDS ;Сброс и проверка термометра
xorlw 0FFh
jnz Begin ;Ошибка - переход на начало программы
movlw 0CCh ;Команда "Skip ROM"
call RW_1Wire
movlw 044h ;Команда "Convert T"
call RW_1Wire
movlw 0FFh ;Идет процесс преобразования
call Pause
movlw 0FFh
call Pause
movlw 0FFh
call Pause
mvi TRY,08h ;8 попыток чтения
Newtry_label clrwdt ;Начинаем чтение данных из DS18B20
clrf TMR0
call TestDS ;Сброс и проверка термометра
xorlw 0FFh
jnz Begin ;Ошибка - переход на начало программы
movlw 0CCh ;Команда "Skip ROM"
call RW_1Wire
movlw 0BEh ;Команда "Read Scratchpad"
call RW_1Wire
clrf CRCPIC
movlw 0FFh
call RW_1Wire
movwf TL ;Младший байт температуры
call NewCRC
movlw 0FFh
call RW_1Wire
movwf TH ;Старший байт температуры
call NewCRC
movlw 0FFh ;Шесть ненужных байт
call RW_1Wire
call NewCRC
movlw 0FFh
call RW_1Wire
call NewCRC
movlw 0FFh
call RW_1Wire
call NewCRC
movlw 0FFh
call RW_1Wire
call NewCRC
movlw 0FFh
call RW_1Wire
call NewCRC
movlw 0FFh
call RW_1Wire
call NewCRC
movlw 0FFh
call RW_1Wire
xorwf CRCPIC,W ;Проверка совпадения CRC
jz OKCRC_label ;Совпадение - переход
decfsz TRY,F
goto Newtry_label ;Несовпадение - следующая попытка
goto Begin ;Попытки исчерпаны
OKCRC_label clrwdt
rrf TH,F
rrf TL,F
rrf TH,F
rrf TL,F
rrf TH,F
rrf TL,F ; 64 | 32 | 16 | 8 || 4 | 2 | 1 | 0.5
movlw 0FFh
movwf FIGX000 ;Гасим все цифры
movwf FIG0X00
movwf FIG00X0
movwf FIG000X
btfss TH,0 ;Температура отрицательная?
goto T100_label ;Нет - переход на проверку "больше/меньше 100"
mvi FIGX000,B'11011111' ;Да - отображаем "-" в старшем разряде
comf TL,F ;Преобразование для правильного
incf TL,F ;отображения отрицательных температур
goto Tshow_label ;Переход
T100_label bcf STATUS,C
rrf TL,W ; W = <0> | 64 | 32 | 16 || 8 | 4 | 2 | 1
addlw D'156'
jnc Tshow_label ;Если температура меньше 100 градусов - переход
movlw D'200' ;
subwf TL,F ;Т не менее 100 градусов - сотню вычитаем
mvi FIG0X00,B'11100111' ;Отобразить "1" во втором разряде
Tshow_label bcf STATUS,C
rrf TL,W ;W = <0> | 64 | 32 | 16 || 8 | 4 | 2 | 1
movwf TEMP2
Divide bcf INTCON,GIE
clrf FIG00X0
movf TEMP2,W ;Делим TEMP2 на 10 - получаем десятки и единицы градусов
movwf TEMP1 ;Заносим делимое TL в ТЕМР1 через W
bsf STATUS,C ;Установим признак переноса
Div_label movf TEMP1,W
movwf FIG000X
;Заносим значение из ТЕМР
incf FIG00X0,F
;Каждый проход цикла
movlw D'10' ;10 -> W заносим делитель в W
subwf TEMP1,F ;(TEMP1 - W) -> TEMP1 и вычитаем его из делимого
jc Div_label ;Если ТЕМР1 еще не стало <0, то вычитаем снова и т.д.
decf FIG00X0,F
movlw B'11100111'
xorwf FIG0X00,W ;Сотня отображается?
jnz High_label ;Нет - переход
movf FIG00X0,W ;Да - отображаем десятки и единицы градусов
call DC7
movwf FIG00X0
movf FIG000X,W
call DC7
movwf FIG000X
goto Finish_label
High_label movf FIG00X0,W ;Отображаем десятки и единицы градусов
call DC7
movwf FIG0X00
movf FIG000X,W
call DC7
movwf FIG00X0
bcf FIG00X0,2 ;Отображаем точку
mvi FIG000X,B'00100100' ;В младшем разряде по умолчанию "0"
movlw B'00010101'
btfsc TL,0
movwf FIG000X ;А если установлен бит "0,5 С" - то "5"
Finish_label bsf INTCON,GIE
goto Online_label
end
Информация о работе Разработка термометра на основе микроконтроллера pic 16xx